我在 qemu vm 中启动了 arch linux,客户机端口 22 连接到主机端口 60022,在客户机中设置了 root 密码,并在客户机中编辑了 sshd 配置以允许 root 登录并将日志级别设置为调试。然后我在客户机上启动了 sshd,并尝试使用 从主机登录客户机。ssh [email protected] -p 60022 -vvv
什么都没发生。
journalctl -xe
客户机上显示 sshd 已启动并监听客户机端口 22,但根本没有显示任何有关尝试连接的信息。在主机上,-vvv
给出了大量输出,但它清楚地告诉我它已连接到客户机,列出了其 id 文件和版本,然后等待两分钟才说kex_exchange_identification: read: Connection reset by peer
放弃。同样,客户机 journalctl 没有报告任何连接尝试。
我可以从客户机 ping 外部网站,所以我知道互联网设置正确。当日志文件已经存在时,我不知道 journalctl 这个讨厌的命令有什么用处。
ssh
如果我尝试连接到端口 60021 或 60022 以外的任何端口,它会立即失败,而不是等待 2 分钟,而且在 60022 上,它在输出中显示“连接已建立” -vvv
,所以我知道主机可能正在连接到客户机。但客户机 sshd 工作不尽如人意,因为它甚至不会立即拒绝除 root 之外不存在的用户名。
我的完整 qemu 命令是
qemu-system-x86_64 -netdev user,id=n0 -device rtl8139,netdev=n0 -enable-kvm -machine q35,accel=kvm -device intel-iommu -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time -nic user,hostfwd=tcp::60022-:22 -m 8G -smp 2 -cdrom ~/Downloads/archlinux-2020.09.01-x86_64.iso ~/vmimgs/lfs.qcow2
我如何通过 ssh 进入我的虚拟机?(另请参阅这个问题大约 4 年前,一位用户遇到了同样的问题,但使用 virtualbox,没有提供解决方案。)
答案1
事实证明,尽管许多来源使用 qemu 的多种网络选项,但它们可能会互相干扰。切换到 可以-nic user,id=vmnic,hostfwd=tcp::60022-:22
完美运行,既允许通过该端口上的 tcp 连接进行 ssh 传输,也允许从客户操作系统使用互联网。请注意,这有id=vmnic
。 id=n0
或任何其他选项现在都可以使用,因为这是唯一引用 id 的选项。 hostfwd=tcp:127.0.0.1:60022-:22
也可以。 ::
在localhost
ipv6 中,127.0.0.1
在 ipv4 中,但两者都应该可以工作。
我的完整命令现在是qemu-system-x86_64 -bios /usr/share/ovmf/x64/OVMF.fd -enable-kvm -machine q35,accel=kvm -device intel-iommu -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time -nic user,id=vmnic,hostfwd=tcp::60022-:22 -m 8G -smp 2 ~/vmimgs/lfs.qcow2
。添加的-bios
选项和删除的-cdrom
选项对于进入客户机并不直接重要ssh
,但是从 qcow 而不是 iso 启动可以让 ssh 配置(如启动时运行或用户公钥)保留下来。