如何使用 QEMU 从主机通过 SSH 连接到来宾?

如何使用 QEMU 从主机通过 SSH 连接到来宾?

如何使用 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_defconfigopenssh 包:

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-:8001hostfwd=tcp::7777:8001

相关内容