如何使用 QEMU 从主机到访客 SSH?

job*_*bin 51 networking ssh qemu

如何使用 qemu 设置从主机到来宾的 ssh?我可以在没有任何特殊参数的情况下启动 VM 时使用端口重定向,如下所示:

/usr/bin/qemu-system-x86_64 -hda ubuntu1204 -m 512 -redir tcp:7777::8001
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用以下内容启动时:

/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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误并且 VM 无法启动:

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
Run Code Online (Sandbox Code Playgroud)

请注意,我可以在没有-net参数的情况下启动 VM,没有任何问题,但是,我想设置从主机到来宾的 ssh。从来宾到主机的 ssh 按预期工作正常。

编辑

我试过使用

-net user,hostfwd=tcp::7777-:8001
Run Code Online (Sandbox Code Playgroud)

-net user,hostfwd=tcp::7777:8001
Run Code Online (Sandbox Code Playgroud)

但错误仍然存​​在并且虚拟机无法启动。

小智 52

我认为错误不是来自-net声明,而是来自:

-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char
Run Code Online (Sandbox Code Playgroud)

该语句已经使用了端口7777。对于端口转发,用

-net user,hostfwd=tcp::7777-:8001
Run Code Online (Sandbox Code Playgroud)

不设置 virtio 串行通道时它工作正常。

如果我理解正确,您想设置一个 virtio 串行通道以使用 Unix 域套接字从主机到 VM 进行通信?

在这种情况下,以下可以完成这项工作:

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,path=/tmp/port1,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
Run Code Online (Sandbox Code Playgroud)

如何使用 ssh 从主机连接到 VM 的示例:

-net user,hostfwd=tcp::10022-:22
-net nic
Run Code Online (Sandbox Code Playgroud)

此主机转发将本地主机(主机)端口 10022 映射到 VM 上的端口 22。像这样启动虚拟机后,您可以从本地主机访问它,如下所示:

ssh vmuser@localhost -p10022
Run Code Online (Sandbox Code Playgroud)

-net nic 命令初始化一个非常基本的虚拟网络接口卡。

  • 在最近的 qemu 版本上可以使用“-nic user,hostfwd=tcp::10022-:22”来缩短它,而无需第二个“-net nic” (5认同)

mik*_*uld 27

启动时试试这个 qemu -redir tcp:2222::22

$ ssh -p 2222 localhost
Run Code Online (Sandbox Code Playgroud)

qemu 启动命令中的 tcp:2222::22 标志将主机的 2222 端口映射到虚拟机上的端口 22(默认 ssh 端口)。

然后,只需通过 ssh 连接到本地主机(主机)上的 2222 端口即可将任何流量重定向到虚拟机中的 ssh 22 端口,这应该允许您像往常一样使用任何其他机器进行 ssh。

  • 我只是觉得有必要说这个答案比上述所有其他答案对我的帮助更大。没有多余的信息,最重要的是,它有效。从谷歌查询登陆时完美“我到底是如何 ssh 进入 qemu”的。 (5认同)
  • 欢迎来到 Unix 和 Linux!我们正在寻找能够提供一些解释和背景的长篇答案。不要只说“试试这个……”;解释为什么你的答案是正确的,最好是引用。不包括解释的答案可能会被删除。 (4认同)
  • 根据接受的答案,我猜不推荐使用的等效项是:`qemu -net nic -net user,hostfwd=tcp::2222-:22` (3认同)
  • 这个答案是 99.9% 的人真正想要的。即主机获得对虚拟机的 ssh 访问,包括主机使用 scp 或类似方法将文件复制到虚拟机和从虚拟机复制文件的能力。 (2认同)
  • `man qemu-system-x86_64` 2.5.0:注意:遗留的独立选项 -tftp、-bootp、-smb 和 -redir 仍然被处理并应用于 -net 用户。 (2认同)
  • `qemu-system-x86_64:-redir:无效选项` (2认同)

Cir*_*郝海东 7

在 Buildroot 2016.05、QEMU 2.5.0、Ubuntu 16.04 主机上测试 OpenSSH 配置

除了 QEMU 网络转发,您还需要正确设置 SSH,我将在这里介绍。

开始qemu_x86_64_defconfig并启用 openssh 包:

make qemu_x86_64_defconfig
echo 'BR2_PACKAGE_OPENSSH=y' >> .config
make BR2_JLEVEL=$(nproc)
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令启动 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
Run Code Online (Sandbox Code Playgroud)

然后在客人:

vi /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

修改以下设置:

PermitRootLogin yes
PermitEmptyPasswords yes
Run Code Online (Sandbox Code Playgroud)

并重启服务器:

/etc/init.d/S50sshd restart
Run Code Online (Sandbox Code Playgroud)

正是因为这个文件存在,sshd默认启动,这里是源码:https : //github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd,关键的启动操作是:

/usr/bin/ssh-keygen -A
/usr/sbin/sshd
touch /var/lock/sshd
Run Code Online (Sandbox Code Playgroud)

然后从主机:

ssh root@localhost -p 2222
Run Code Online (Sandbox Code Playgroud)

如果出现故障,首先测试网络转发是否使用比 sshd 更低级别的工具:例如nc -l ,如此处所述

还要检查来宾上的服务器日志:

less /var/log/messages
Run Code Online (Sandbox Code Playgroud)

然后在最终系统上,您应该使用BR2_ROOTFS_OVERLAY或自动创建该日志文件 BR2_ROOTFS_POST_BUILD_SCRIPT自定义生成的目标文件系统 | buildroot.org

相关:https : //stackoverflow.com/questions/23106012/how-to-access-raspberry-pi-qemu-vm-via-network