在 Virtualbox 中,我有一堆虚拟机。主机是一台 Debian 笔记本电脑,经常在有线和无线连接之间切换。每次我使用无线(或有线)时,我都必须将每个虚拟机的 Virtualbox 设置从 eth0 更改为 wlan0(或反过来),以便让客户机连接到网络。我如何才能使此切换自动进行?
答案1
可以使用以下命令更改虚拟网络接口的类型:
VBoxManage controlvm <VM_name> nic1 bridged eth0
这将使此虚拟机中的第一个虚拟接口桥接到 eth0。但是,它仅在客户机运行时有效。(我不确定它何时会更新持久配置,但一些测试表明,如果客户机未运行,该命令将不执行任何操作,但如果客户机正在运行,则它既会更改接口的即时状态,又会更新配置。)
但是,如果你有什么东西经常运行它,指定你想要桥接的接口,它就可以工作。你可以使用我的NCD编程语言自动执行此操作。下面的 NCD 程序将观察 eth0 和 wlan0 的状态,并将重复调用上述命令以确保您的 VM 桥接正确的接口。(特别是具有 RUNNING 标志的接口;例如,对于有线接口,这意味着电缆已插入)
process vbox_iface {
# Wait for link on either eth0 or wlan0. Prefer eth0.
multidepend({"link-eth0", "link-wlan0"}) linkif;
println("Using ", linkif.dev);
# Enter loop (this is a hackish loop).
multiprovide("loop-run");
multidepend({"loop-again", "loop-run"});
println("Setting bridged to ", linkif.dev);
# Set VM NIC config.
runonce({"/usr/bin/VBoxManage", "controlvm", "Windows XP", "nic1", "bridged", linkif.dev});
# Wait some time (in milliseconds).
sleep("2000", "0");
# Continue loop.
multiprovide("loop-again");
}
process lan_iface {
var("eth0") dev;
# Wait for device to appear and for link (e.g. cable).
net.backend.waitdevice(dev);
net.backend.waitlink(dev);
multiprovide("link-eth0");
}
process wlan_iface {
var("wlan0") dev;
# Wait for device to appear and for link (e.g. cable).
net.backend.waitdevice(dev);
net.backend.waitlink(dev);
multiprovide("link-wlan0");
}
您可以通过运行(以您的用户帐户,而不是 root 用户)来使用上述程序:
badvpn-ncd --loglevel warning --config-file <file_with_above_script.ncd>
确保调整脚本中的接口名称和虚拟机名称。验证其工作正常后,您可以配置桌面环境以自动启动该badvpn-ncd
过程。