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 命令初始化一个非常基本的虚拟网络接口卡。
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。
在 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