我收到了用于我的 CS 作业的虚拟机。我已经在 Gnome Boxes 中打开它(只需双击 VM 映像),但我不想在那里编写代码,而是在本地计算机上编写代码,然后在虚拟机上通过 ssh 进行编译。该虚拟机具有 .ova 扩展名,并且在 Boxes Preferences 中显示 Broker QEMU Session、Display Protocol SPICE。我应该使用什么作为 ssh 的远程 IP?是否需要对虚拟机进行任何其他配置?我应该如何添加它们?
答案1
最简单的方法是使用反向 SSH 隧道。
从虚拟机内部运行:
ssh -NT -R 2222:localhost:22 user@_gateway
其中user
是主机中的用户名。
现在,您可以使用以下命令从主机进行连接
ssh -p 2222 guestuser@localhost
其中guestuser
用户名是 guest。
如果您不想每次启动时都从来宾运行命令,则可以autossh
从服务使用。
答案2
GNOME Box 提供什么功能
当您双击开放虚拟化格式文件时,GNOME Boxes 会自动导入它。
GNOME Boxes 不会将访客暴露给 SSH。预计您将拥有SPICE 嘉宾补充安装在来宾上以便能够:
- 使用主机和来宾之间的共享剪贴板复制和粘贴文本
- 将文件拖放到来宾中。
这种方法对于不熟练的用户来说应该是直观可理解的,他们使用 GNOME此应用程序的目标:
尽管虚拟管理器作为虚拟机管理软件,它做得非常好,它非常适合系统管理和虚拟机。另一方面,Boxes 面向典型的桌面最终用户,他们想要一种非常安全且简单的方法来尝试新操作系统或她/他最喜欢的操作系统的新(可能不稳定)版本,或者需要连接到远程计算机(家庭办公室连接是典型的用例)。因此,Boxes 没有提供许多由 virt-manager 提供的高级选项来调整虚拟机。相反,Boxes 专注于在用户输入很少的情况下让事情开箱即用。
作为参考,有三年前不活跃的提案在 Boxes 中实现端口转发。
使用不同的工具
如果您需要通过 SSH 连接到来宾,您可能需要使用正确的工具来完成任务来配置您的设置并诉诸virt-manager
.通常,可以通过配置“虚拟网络“(对于具有动态或无线接口的主机)或“桥接到 LAN“(对于具有静态有线接口的主机)。另一方面,Boxes 使用user
模式网络配置来宾,该模式采用用户空间 SLiRP 堆栈。如果您愿意,您可以virt-manager
修改现有设置并继续在 Boxes 中使用您的客人。我自己还没有这样做过,所以,如果您选择使用virt-manager
,则需要不同的教程。
转发端口
另一种方法是指示 QEMU 将主机上的端口转发到客户机上的端口。您无法使用文本编辑器修改来宾的配置文件,因为更改将被忽略并被覆盖。您可以使用 来修改它visrh
,它在软件包中可用libvirt-clients
(至少在 Debian 中)。您可以在“故障排除日志”的第二行中了解域的名称,该日志位于框中的来宾“属性”的“系统”选项卡中。或者,您可以检查~/.config/libvirt/qemu
.例如,在我的安装中,与已安装的来宾计算机关联的域名称是“boxes-unknown”。要编辑该机器的配置,我输入:
virsh edit boxes-unknown
我的安装中访客的现有网络配置:
<interface type='user'>
<mac address='52:54:00:3d:69:49'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
不幸的是,您不能仅修改 XML 以仅添加从主机到来宾的端口转发。该功能未在域 XML 格式由 所使用libvirt
。2013 年的一封电子邮件表明该功能的提案不成功。因此,我们需要提供相关参数,以便在启动 guest 虚拟机时传递给 QEMU。我们无法修改现有的网络接口,因此我们只需删除描述它的 XML 部分以防止创建它。相反,我们必须在要传递给 QEMU 的参数中复制它。
根据“故障排除日志”,在我的设置中,上述网络配置对应于以下参数:
-netdev user,id=hostnet0 \
-device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:3d:69:49,bus=pci.0,addr=0x3 \
您可以检查 中参数的含义man qemu-system-x86_64
。
我们不想复制总线和地址,因为自动配置不会考虑我们的自定义 QEMU 参数。这会导致地址分配中偶尔发生冲突,从而阻止客户机启动。相反,我们只是允许它自动分配给我们的自定义网络接口。
记住设备名称。例如,如果我不指定rtl8139
,它似乎会e1000
默认配置。
您需要修改<domain type='kvm'>
标签以包含 QEMU 命令行元素的 XML 命名空间:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
之后,您可以在结束标记之前添加 QEMU 命令行参数</domain>
。在下面的示例中,我添加了端口转发,以便能够ssh localhost -p 2222
从主机上进行端口转发,并能够http://localhost:8080
从主机上的浏览器访问网络服务器。您可能需要根据您的设置和偏好修改此示例。如果需要,hostfwd
可以在 中读取参数的语法man qemu-system-x86_64
。
<qemu:commandline>
<qemu:arg value='-device'/>
<qemu:arg value='rtl8139,netdev=hostnet0'/>
<qemu:arg value='-netdev'/>
<qemu:arg value='user,id=hostnet0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80'/>
</qemu:commandline>
相应的 QEMU 参数是:
-device rtl8139,netdev=hostnet0 \
-netdev user,id=hostnet0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80
由此生成上述 XML 并不困难,但是你也可以使用 virsh domxml-from-native qemu-argv
为您量身定制。
这似乎就是我们转发端口所需要的全部根据 QEMU 维基。
类似的方法也可以用于客人virt-manager
:https://unix.stackexchange.com/a/519067/423679
virsh
如果抱怨错误,请不要在保存文件时跳过 XML 验证。首先尝试修复语法。不要忘记保留配置文件的备份以防万一。