如何根据活动情况自动在 eth0 和 wlan0 之间切换虚拟机的桥接适配器?

如何根据活动情况自动在 eth0 和 wlan0 之间切换虚拟机的桥接适配器?

在 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过程。

相关内容