
Empezando qemu-system-x86_64
con-nic user,ipv6=off,hostfwd=tcp::9022-:22
Con solo la lo
interfaz (con 127.0.0.1
asociada a ella) presente en el host, la máquina virtual se iniciará, pero cualquier demonio que intente asignar el puerto 22 se bloqueará. por ejemplo, dentro de vm: #systemctl start sshd
simplemente se bloqueará hasta que se elimine y no aparecerá nada interesante en los registros.
Si tengo alguna otra interfaz activa en el host antes de iniciar qemu, entonces la máquina virtual también se inicia, pero el puerto 22 se puede asignar sin problemas. Y ss
mostrará:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 1 0.0.0.0:9022 0.0.0.0:* users:(("qemu-system-x86",pid=9035,fd=12))
¿Qué está causando este problema? El proceso del host qemu no intenta asociarlo con ninguna de las IP que dependen de las interfaces faltantes.
No estoy usando kvm. aquí está el comando completo:
qemu-system-x86_64 -machine pc,vmport=off,mem-merge=off,dump-guest-core=off,kernel-irqchip=split -smp 4 -m 1G,slots=4,maxmem=8G -name vm -monitor tcp:127.0.0.1:9023,server,nowait -msg timestamp=on,guest-name=on -rtc base=utc,clock=host,driftfix=none -pidfile .vm_started -daemonize -no-reboot -D .vm.log -nic user,id=n1,ipv6=off,hostname=vm,hostfwd=tcp::9022-:22,hostfwd=tcp::8000-:8000 -boot c -drive file=linux-x86.qcow2,index=0,media=disk,snapshot=off,format=qcow2;
editar: Más enfoque en systemd
Creo que esto es exclusivamente un problema de systemd. ...suspiro.
iniciar sshd manualmente, usando exactamente el mismo exec que debería haber estado usando systemd, ¡funciona bien! sshd por defecto escucha 0.0.0.0,
Además, todo esto utiliza archivos de distribución estándar. Nada personalizado.
$ cat /lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH Daemon
#Wants=sshdgenkeys.service
#After=sshdgenkeys.service
#After=network.target
[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
[Install]
WantedBy=multi-user.target
(lo comentado fue intentar desbloquear systemd, no hubo suerte)
Además, esto está dentro de una máquina virtual con red de usuario, por lo que siempre tiene una red válida desde el punto de vista de la máquina virtual:
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
inet 10.0.2.15/24 metric 1024 brd 10.0.2.255 scope global dynamic eth0
valid_lft 84976sec preferred_lft 84976sec
inet6 fe80::5054:ff:fe12:3456/64 scope link
valid_lft forever preferred_lft forever
y por supuesto, la solución fue que systemd estaba simplemente !(*@&#!@ esperando ntp, ¡para siempre!
tan pronto como me conecte:
Apr 23 15:58:16 archlinux systemd[1]: Reached target System Time Synchronized.
Apr 23 15:58:16 archlinux systemd[1]: Started Refresh existing PGP keys of archlinux-keyring regularly.
Apr 23 15:58:16 archlinux systemd[1]: Started Daily verification of password and group files.
Apr 23 15:58:16 archlinux systemd[1]: Reached target Timer Units.
Apr 23 15:58:16 archlinux systemd[1]: Initializes Pacman keyring was skipped because of an unmet condition check (ConditionFirstBoot=yes).
Apr 23 15:58:16 archlinux systemd[1]: Started OpenSSH Daemon.
¡Lindo! visibilidad cero sobre algo que me impactaría para siempre en caso de que no se pudiera acceder al host ntp o algo así... todavía no estoy seguro de qué está uniendo esas cosas.
$ systemctl show sshd
...
After=sysinit.target systemd-journald.socket pacman-init.service basic.target system.slice
... ¿Supongo que es porque alguien le adjuntó pacman-init.service? ¿Aunque se omitirá ya que solo se ejecuta para firmar las claves en el primer arranque? Incluso systemctl list-dependencies sshd
mostraría todo en verde o omitido. sin advertencias. Qué vergüenza de experiencia.
Respuesta1
El problema era que systemd me estaba engañando. No hacía nada mientras esperaba una dependencia, pero no lo mostraba en ningún registro. Tampoco demostraba que la dependencia que estaba esperando fuera una dependencia de mi servicio.
Trasladado ahttps://unix.stackexchange.com/questions/743795/how-to-get-visibility-on-systemd-unit-lifecycle