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


29

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

我收到以下错误,并且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

请注意,我可以不-net带任何参数地引导VM ,但是没有问题,但是,我希望从主机到客户机设置ssh。从来宾到主机的SSH可以正常工作。

编辑

我尝试使用

-net user,hostfwd=tcp::7777-:8001

以及

-net user,hostfwd=tcp::7777:8001

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


Answers:


37

我认为错误不是来自-net语句,而是来自:

-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char

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

-net user,hostfwd=tcp::7777-:8001

未设置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

编辑:

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

-net user,hostfwd=tcp::10022-:22
-net nic

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

ssh vmuser@localhost -p10022

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


是的,您是对的,我正在尝试使用virtio-serial建立从主机到访客的通信。VM已启动,并在主机控制台上发出警告:Warning: vlan 0 with no nics但是,当我ifconfig在客户机上执行此操作时,我只能lo看到ssh: connect to host 10.0.2.15 port 22: Connection timed out,但尝试ssh时仍然可以;我用于ssh的IP是10.0.2.15,man qemu-system-x86_64如果未分配静态IP ,则该IP是分配给启动的第一个VM的IP。现在,来宾没有互联网连接。
jobin 2014年

您可能想要做的是将用于ssh的端口22映射到另一个端口,然后从主机连接到该端口以访问VM。我用一个例子编辑了答案。
mas_kur1 2014年

编辑后的答案非常完美!
dbernard

19

启动时尝试 qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

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

然后,只需在本地主机(主机)上将ssh切换到2222端口,即可将所有流量重定向到虚拟机中的ssh 22端口,这将允许您像平常一样在任何其他计算机上进行ssh。


3
欢迎使用Unix&Linux!我们正在寻找能提供一些解释和上下文的长答案。不要只是说“试试这个...”;解释为什么你的答案是正确的,最好是引用。不包含说明的答案可能会被删除。
G-Man说'Resstate Monica''Apr

3
我只是觉得有必要说,这个答案比上述所有其他答案对我的帮助更大。没有多余的信息,最重要的是,它起作用。从Google查询着陆时的完美选择:“我到底是怎么切入qemu的”。
2015年1

1
这个答案完成了99.9%的人实际想要的。即,主机可以通过ssh访问虚拟机,包括主机使用scp或类似工具向虚拟机复制文件和从虚拟机复制文件的能力。
nullUser 2015年

1
辉煌!我的Raspberry Pi命令现在看起来像qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw console=ttyAMA0,115200" -hda 2014-01-07-wheezy-raspbian.img -nographic -redir tcp:2222::22
狂热的人,

2
man qemu-system-x86_642.5.0:注意:旧式独立选项-tftp,-bootp,-smb和-redir仍将处理并应用于-net用户。
Ciro Santilli新疆改造中心法轮功六四事件

4

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_OVERLAYBR2_ROOTFS_POST_BUILD_SCRIPT定制生成的目标文件系统| buildroot.org


-1

我相信您需要使用hostfwd=tcp::7777-:8001hostfwd=tcp::7777:8001

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.