我使用 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 路由新增 xxxx dev vboxnet0'”
這會觸發 bash 實例。我已將該ip route ...
語句直接放入規則檔案中,但也可以在其他地方調出腳本並在其中放置其他路由配置。
答案2
3ronco的回答提供了一些關於 VirtualBox 如何搞砸我們的很好的見解,但我發現他的 Udev 解決方案在我的 Ubuntu 19.04 上不起作用,因為在腳本運行時連結仍然處於關閉狀態。
我嘗試添加接口網路計劃然而,在那裡配置了靜態路由,但由於未知的原因,路由被忽略了。
如果您的系統有網路調度程序,您可以在此處放置一個腳本
/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