Como posso alternar automaticamente os adaptadores em ponte das minhas VMs entre eth0 e wlan0 dependendo do que está ativo?

3

No Virtualbox, tenho um monte de máquinas virtuais. O host é um laptop Debian que freqüentemente alterna entre uma conexão com e sem fio. Toda vez que eu vou sem fio (ou ir com fio), eu tenho que alterar as configurações do Virtualbox de cada máquina virtual de eth0 para wlan0 (ou o inverso) para que os convidados se conectem à rede. Como posso fazer este comutador automático?

    
por Matt Alexander 18.02.2012 / 18:10

1 resposta

3

É possível alterar o tipo da interface de rede virtual com um comando como:

VBoxManage controlvm <VM_name> nic1 bridged eth0

Isso fará com que a primeira interface virtual nesta VM seja conectada a eth0. No entanto, o só funciona quando o convidado está sendo executado . (Não sei exatamente quando ele atualizará a configuração persistente, mas alguns testes mostraram que o comando não faz nada se o convidado não estiver sendo executado, mas, se estiver, ele altera o estado imediato da interface e atualiza a configuração .)

Mas ele pode funcionar se você tiver algo que o executa com frequência, especificando a interface com a qual deseja fazer a ponte. Você pode usar minha linguagem de programação NCD para fazer isso automaticamente. O programa NCD abaixo irá observar o estado de eth0 e wlan0, e invocará repetidamente um comando como o acima para garantir que sua VM esteja conectada com a interface correta. (em particular, aquele que tem a bandeira RUNNING; por exemplo, para interfaces com fio, isso significa que o cabo está conectado)

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");
}

Você pode usar o programa acima executando (como sua conta de usuário, não como root):

badvpn-ncd --loglevel warning --config-file <file_with_above_script.ncd>

Certifique-se de ajustar os nomes das interfaces no script e o nome da VM. Depois de verificar se funciona, você pode configurar seu ambiente de área de trabalho para iniciar automaticamente o processo badvpn-ncd .

    
por 18.02.2012 / 19:26