我正在使用 Virtualbox 仅主机网络,并且我有一个接口 vboxnet0。
在主机(Ubuntu 14)上,我有一些路由人员、几个路由表(主要的和两个额外的)、IP 规则设置等等。
我对主机上 vbonxen0 接口的路由表所做的所有更改都丢失了重启功能。
如何为 vboxnet0 接口制作类似 ifup 的脚本?
答案1
使用 VirtualBox 时需要注意以下几点仅主机网络模式(至少 V4.3.36)尤其是当桥接没有选项,需要手动,之后需要配置自定义路线:
- vboxnet0设备节点是不是启动后自动可用(!)
除非您手动配置它,因为/etc/network/interfaces
这可能会在 virtualbox 尝试启动它自己的实例时产生干扰。 - 甚至在加载 vbox(pci|netadp|netflt|drv) 模块时它也不可用。
- 使用
vboxmanage hostonlyif create
只会添加设备节点但使其处于尚不可路由的 DOWN 状态。 - vboxnet0即使接口启动后,设备状态仍将未知:
4: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... state UNKNOWN ...
任何尝试使用向上来自的事件/etc/network/interfaces
,ifup
或/etc/network/if-up.d/MYSCRIPT
毫无用处,因为永远不会达到该状态。 - 在主机上它变成仅有的当您的第一台 VM 客户机启动时即可使用。
唯一的办法是虚拟盒到目前为止,我发现你的虚拟机启动时使用的是udev 规则通过放置文件,例如/etc/udev/rules.d/80-vboxnet
:
KERNEL=="vboxnet0", SUBSYSTEM=="net", ACTION=="add", RUN+="/bin/bash -c '/bin/sleep 1; /sbin/ip route add xxxx dev vboxnet0'"
这会触发一个 bash 实例。我已将语句ip route ...
直接放入规则文件中,但也可以只在其他地方启动脚本并在那里放置其他路由配置。
答案2
3ronco 的回答提供了一些关于 VirtualBox 如何在这方面欺骗我们的很好的见解,但我发现他的 Udev 解决方案在我的 Ubuntu 19.04 上不起作用,因为脚本运行时链接仍然处于断开状态。
我尝试添加接口网络计划但是,由于未知原因,在那里配置了静态路由,这些路由被忽略了。
如果你的系统有 networkd-dispatcher 你可以在这里放置一个脚本
/etc/networkd-dispatcher/routable.d/99-vboxnetworks
这是我的:
#!/bin/bash
if [ $IFACE == vboxnet2 ]; then
/sbin/ip route add fdnn:nnnn:nnnn:2::/64 via fdnn:nnnn:nnnn:1::2
/sbin/ip route add fdnn:nnnn:nnnn:3::/64 via fdnn:nnnn:nnnn:1::3
fi
现在事实证明,除非接口在 netplan 中有条目,否则不会运行此脚本。我的脚本包含一个被忽略的路由条目,只是为了使其语法正确(可能有更整洁的方法来做到这一点)。所以我有
/etc/netplan/01-mynet.yaml
包含:
network:
ethernets:
vboxnet2:
routes:
# These routes are ignored for reasons unknow,
# I have included them just so that vboxnet2 gets
# a mention here. Actual routes are added by
# /etc/networkd-dispatcher/routable.d/99-vboxnetworks
#
- to: fdnn:nnnn:nnnn:2::/64
via: fdnn:nnnn:nnnn:1::2