近日在工作PC上因需要安装了Arch Linux虚拟机,但是所用的平台却是Oracle Virtual Box——由于公司规定,不能随便白嫖VMware workstation了,但是如何让虚拟机联网,以及从宿主机SSH连接到虚拟机,却成了一个比较大的问题。

vbox的限制

由于vbox和VMware对虚拟网卡的实现不同,vbox无法做到像VMware那样仅凭一张虚拟网卡就可以上网以及实现SSH功能;使用NAT模式时,vbox中的虚拟机可以正常链接公网,可以ping通宿主机,但是宿主机却无法ping通虚拟机,这样无法使用ssh登录;使用桥接模式时如果宿主机连接到的网络需要验证,那么虚拟机很难拿到ip地址,自然无法连接公网和宿主机,其他的网络模式更不适用于我们此时的要求,略去不提。

此处并不进行两种虚拟机网卡连接拓扑的深入讨论,只是大致叙述一下设置方式。

方法1:端口转发

在虚拟机设置中,找到网络设置->网卡1->高级设置,点击端口转发,添加一条规则,无需输入ip地址,只要填写端口号即可(主机随意,虚拟机端口填22,或者指定的ssh端口),注意协议一定是TCP,然后在宿主机中就可以使用ssh root@localhost -p XXXX连接到虚拟机,XXXX是刚才端口转发中填写的主机端口号。

方法2:双网卡方法

在虚拟机关机的情况下,找到虚拟机的网络设置,选择网卡2,点击启用网络,并设置为仅主机模式,然后在全局设定的网络管理里,查看Virtual Box Host-only Ethernet Adapter的IP地址和掩码,记住备用。

启动虚拟机,首先安装NetworkManager,用于替代Arch默认的systemd-networkd相关服务:

# install networkmanager
[root@archlinux ~] $ sudo pacman -S networkmanager

然后禁用systemd-networkd相关服务,共有三个服务被禁用:

# disable systemd-networkd
[root@archlinux ~] $ sudo systemctl disable systemd-networkd systemd-networkd.socket systemd-resolved

# stop them
[root@archlinux ~] $ sudo systemctl stop systemd-networkd systemd-networkd.socket systemd-resolved

networkmanager设置为开机启动,并启动此服务:

[root@archlinux ~] $ sudo systemctl enable NetworkManager
[root@archlinux ~] $ sudo systemctl start NetworkManager

使用ip a命令查看所有的网卡设备名称,找到接入仅主机网络的网卡名称,假定为enp0s7,使用nmtui命令开始设置静态地址等网卡属性。

[root@archlinux ~] $ sudo nmtui

根据屏幕上的提示一步一步填写完毕即可,记得勾选Never use this network for default route,即不使用该网络作为默认路由,然后重启NetworkManager即可。