3

В Virtualbox у меня есть куча виртуальных машин. Хост - это ноутбук Debian, который часто переключается между проводным и беспроводным подключением. Каждый раз, когда я подключаюсь к беспроводной сети (или подключаюсь к сети), мне приходится менять настройки Virtualbox каждой виртуальной машины с eth0 на wlan0 (или наоборот), чтобы гости могли подключиться к сети. Как я могу сделать этот переключатель автоматическим?

1 ответ1

3

Изменить тип виртуального сетевого интерфейса можно командой, например:

VBoxManage controlvm <VM_name> nic1 bridged eth0

Это заставит первый виртуальный интерфейс в этой виртуальной машине соединиться с eth0. Однако это работает только когда гость работает. (Я не уверен, когда именно он обновит постоянную конфигурацию, но некоторые испытания показали, что команда ничего не делает, если гость не запущен, но если это так, она одновременно изменяет непосредственное состояние интерфейса и обновляет конфигурацию .)

Но это можно заставить работать, если у вас что-то часто запускается, с указанием интерфейса, к которому вы хотите подключиться. Вы можете использовать мой язык программирования NCD, чтобы сделать это автоматически. Программа NCD ниже будет наблюдать состояние eth0 и wlan0 и будет неоднократно вызывать команду, подобную выше, чтобы убедиться, что ваша виртуальная машина соединена с правильным интерфейсом. (в частности, тот, который имеет флаг 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .