如何使用 qemu 设置从主机到访客的 ssh?当我启动虚拟机时,无需任何特殊参数,就可以使用端口重定向,如下所示:
/usr/bin/qemu-system-x86_64 -hda ubuntu1204 -m 512 -redir tcp:7777::8001
但是当我尝试使用以下命令启动时:
/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp:7777::8001
我收到以下错误并且虚拟机无法启动:
qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: invalid host
forwarding rule 'tcp:7777::8001'
qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: Device 'user'
could not be initialized
请注意,我可以在没有参数的情况下启动虚拟机,-net
不会出现任何问题,但是,我想设置从主机到来宾的 ssh。从访客到主机的 ssh 按预期工作正常。
编辑
我尝试过使用
-net user,hostfwd=tcp::7777-:8001
也
-net user,hostfwd=tcp::7777:8001
但错误仍然存在并且虚拟机无法启动。
答案1
我认为错误不是来自语句-net
,而是来自:
-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char
该语句已使用该端口7777
。对于端口转发,用
-net user,hostfwd=tcp::7777-:8001
在不设置 virtio 串行通道时它工作正常。
如果我理解正确的话,您想设置一个 virtio 串行通道以使用 Unix 域套接字从主机到虚拟机进行通信?
在这种情况下,以下内容可以完成这项工作:
/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,path=/tmp/port1,server=on,wait=off,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp::7777-:8001
如何使用 ssh 从主机连接到 VM 的示例:
-net user,hostfwd=tcp::10022-:22
-net nic
此主机转发将本地主机(主机)端口 10022 映射到 VM 上的端口 22。一旦虚拟机像这样启动,您就可以从本地主机访问它,如下所示:
ssh vmuser@localhost -p10022
-net nic 命令初始化一个非常基本的虚拟网络接口卡。
答案2
将其添加到您的 qemu 网络配置中:
,hostfwd=tcp::2222-:22
例如
qemu -net nic -net user,hostfwd=tcp::2222-:22
该tcp::2222-:22
标志将主机的端口 2222 映射到虚拟机上的端口 22(默认 SSH 端口)。
然后,只需通过 SSH 连接到本地主机(主机)上的端口 2222,就会将所有流量重定向到虚拟机中的 SSH 端口,这将允许您像通常使用任何其他计算机一样进行 ssh:
$ ssh -p 2222 localhost
答案3
OpenSSH 配置在 Buildroot 2016.05、QEMU 2.5.0、Ubuntu 16.04 主机上测试
除了 QEMU 网络转发之外,您还需要正确设置 SSH,我将在此处介绍。
首先启用qemu_x86_64_defconfig
openssh 包:
make qemu_x86_64_defconfig
echo 'BR2_PACKAGE_OPENSSH=y' >> .config
make BR2_JLEVEL=$(nproc)
然后启动 QEMU:
qemu-system-x86_64 \
-M pc \
-append root=/dev/vda \
-drive file=output/images/rootfs.ext2,if=virtio,format=raw \
-enable-kvm \
-kernel output/images/bzImage \
-m 512 \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22
然后是嘉宾:
vi /etc/ssh/sshd_config
修改以下设置:
PermitRootLogin yes
PermitEmptyPasswords yes
并重新启动服务器:
/etc/init.d/S50sshd restart
正是因为这个文件存在,sshd才会默认启动,源码如下:https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd启动的关键操作是:
/usr/bin/ssh-keygen -A
/usr/sbin/sshd
touch /var/lock/sshd
然后从主机:
ssh root@localhost -p 2222
如果出现故障,首先测试网络转发是否使用比 sshd 更低级别的工具工作:例如nc -l
如此处所述。
还检查访客上的服务器日志:
less /var/log/messages
BR2_ROOTFS_OVERLAY
然后在最终系统上,您应该使用或自动创建该日志文件BR2_ROOTFS_POST_BUILD_SCRIPT
:自定义生成的目标文件系统 | buildroot.org
有关的:https://stackoverflow.com/questions/23106012/how-to-access-raspberry-pi-qemu-vm-via-network
答案4
我相信你需要使用hostfwd=tcp::7777-:8001
或hostfwd=tcp::7777:8001