import json
import os
import platform
-import random
import re
import resource
import shlex
[Unit]
Description=Mkosi SSH Server VSock Socket
ConditionVirtualization=!container
+ Wants=sshd-keygen.target
[Socket]
ListenStream=vsock::22
Accept=yes
- Service=ssh@.service
[Install]
WantedBy=sockets.target
"""\
[Unit]
Description=Mkosi SSH Server
+ After=sshd-keygen.target
[Service]
- ExecStart=sshd -i
+ # We disable PAM because of an openssh-server bug where it sets PAM_RHOST=UNKNOWN when -i is used
+ # causing a very slow reverse DNS lookup by pam.
+ ExecStart=sshd -i -o UsePAM=no
StandardInput=socket
RuntimeDirectoryPreserve=yes
"""
return config.hostname or config.image_id or config.output.with_suffix("").name.partition("_")[0]
+def machine_cid(config: MkosiConfig) -> int:
+ cid = int.from_bytes(hashlib.sha256(machine_name(config).encode()).digest()[:4], byteorder='little')
+ # Make sure we don't return any of the well-known CIDs.
+ return max(3, min(cid, 0xFFFFFFFF - 1))
def nspawn_knows_arg(arg: str) -> bool:
try:
os.open("/dev/vhost-vsock", os.R_OK|os.W_OK)
- cmdline += ["-device", f"vhost-vsock-pci,guest-cid={random.randrange(100, 0xFFFFFFFF)}"]
+ cmdline += ["-device", f"vhost-vsock-pci,guest-cid={machine_cid(config)}"]
except OSError as e:
if e.errno == errno.ENOENT:
warn("/dev/vhost-vsock not found. Not adding a vsock device to the virtual machine.")
"-o", "UserKnownHostsFile=/dev/null",
"-o", "StrictHostKeyChecking=no",
"-o", "LogLevel=ERROR",
- "-o", "ProxyCommand=socat - VSOCK-CONNECT:3:%p",
+ "-o", f"ProxyCommand=socat - VSOCK-CONNECT:{machine_cid(config)}:%p",
"root@mkosi",
]
cmd += config.cmdline
- run(cmd)
+ run(cmd, env=os.environ)
def run_serve(config: MkosiConfig) -> None: