Nomes de interface de rede previsíveis interrompem a migração da VM

9

Como você redefine /etc/networking/interfacesao usar "nomes previsíveis da interface de rede"?

Versões do Ubuntu anteriores à 15.10 usam nomes de adaptadores de rede como:

  • eth0
  • eth1
  • eth2

Substituir uma placa de rede ou mover uma vm para um novo hypervisor faria com que o Linux aumentasse o número da interface. A exclusão /etc/udev/rules.d/70-peristent-net.rulestornaria a reutilização do Linux eth0.

O Ubuntu 15.10 e versões mais recentes usam ' Nomes de interface de rede previsíveis '. O nome do adaptador de rede é derivado do endereço mac.

  • ens3
  • ens32
  • ens192

Ao migrar uma vm, a rede não será iniciada, pois /etc/network/interfacesainda faz referência ao antigo adaptador de rede inexistente.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens32
iface ens32 inet dhcp
pre-up sleep 2

Qual é a melhor maneira de redefinir o arquivo / etc / network / interfaces?

Preciso executar esta ação antes de desligar a VM e migrar para um novo hypervisor, pois estou usando o empacotador para criar imagens douradas automatizadas, com base nas imagens douradas do chef / bento .

Descobri que excluir / etc / network / interfaces não funciona, pois o arquivo não é regenerado automaticamente na próxima inicialização após a migração.

Eu tentei editar meu arquivo grub para voltar à convenção de nomenclatura 'eth0'. Enquanto / etc / network / interfaces se refere ao nome antigo (eth0), o vm não recebe um ip e qualquer reinicialização fará com que o vm use a nova convenção de nomenclatura. Também descobri que o systemd sempre terá precedência, a menos que eu possa garantir biosdevname=0 permanentemente a permanência na configuração do grub . Não sabe como aplicar permanentemente este

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0"

Se possível, prefiro não usar o init de nuvem ou usar scripts pós-inicialização, pois prefiro manter as imagens douradas o mais limpas possível.

Certamente, esse é um problema que os provedores de nuvem (Azure, AWS, RackSpace, Openstack) já resolveram quando importam vms. Não posso ser a primeira pessoa a tentar migrar uma VM usando nomes de interface de rede previsíveis.

Eu tentei executar esses comandos antes de desligar e migrar o vm

apt-get remove biosdevname -y;
ln -s /dev/null /etc/systemd/network/99-default.link;

Acho que quando migro a vm, isso /etc/network/interfacese ip addressainda me refiro aens32

spuder
fonte
Você tentou a solução no site irmão askubuntu? askubuntu.com/a/785442/467355 - basicamente crie manualmente a regra do udev e, possivelmente, use um script de inicialização única para inserir o novo mac nele após o clone (ou para criar novo após cada clone)
Dani_l
Sim, eu olhei para isso. Estas são imagens douradas genéricas que podem ser usadas por qualquer pessoa, por isso não sei o endereço mac antes do tempo.
Spuder
Esse é o objetivo de "usar um script de inicialização único para inserir o novo mac nele após o clone (ou para criá-lo após cada clone)" - você insere um novo script de inicialização na imagem dourada que, ao consultar e inserir, o mac correto para a regra udev.
Dani_l

Respostas:

4

Certamente, esse é um problema que os provedores de nuvem (Azure, AWS, RackSpace, Openstack) já resolveram quando importam vms.

Acho que o OpenStack usa cloud-init, formato ConfigDrive, e fornece uma configuração de rede que corresponde ao hardware da VM. Fontes:

Se você excluir um script de primeira inicialização, há uma resposta óbvia.

Anteriormente, era praticamente garantido que os hosts equipados com uma única placa Ethernet tivessem apenas uma única interface "eth0". Com esse novo esquema, um administrador agora deve verificar primeiro qual é o nome da interface local antes de poder chamar comandos nele, onde anteriormente ele tinha uma boa chance de que "eth0" fosse o nome certo.

Eu não gosto disso, como faço para desativar isso?

Você basicamente tem três opções:

  1. Você desativa a atribuição de nomes fixos, para que os nomes imprevisíveis do kernel sejam usados ​​novamente. Para isso, basta mascarar o arquivo .link do udev para a política padrão: ln -s / dev / null /etc/systemd/network/99-default.link

https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/

Voltar para os nomes antigos de interface persistente não é uma das opções documentadas.

A outra alternativa é uma configuração em que as interfaces de rede são ativadas por padrão, independentemente do nome exato. Eu acho que o NetworkManager suporta isso por padrão. O systemd-networkd também pode ser instruído a fazer isso .

Assim que você tiver mais de um dispositivo de rede para uma VM, eles provavelmente precisam de uma configuração específica de qualquer maneira ...

Fora das VMs, há uma vantagem óbvia da abordagem no estilo NetworkManager: um PC pode ter várias interfaces de rede, talvez de tipos diferentes, com apenas uma delas conectada. Por exemplo, isso pode ser visto em algumas placas-mãe premium ou em um sistema em que a primeira interface de rede não funcionou como desejado e uma segunda interface foi instalada em algum momento.

sourcejedi
fonte
Ótimas sugestões. Acho que isso ln -s /dev/null /etc/systemd/network/99-default.linknão faz diferença. meus vms ainda usam a nova convenção de nomenclatura.
Spuder
3

Desisti de tentar fazer isso de forma limpa e criei o seguinte hack. Executando o script a seguir, pouco antes de desligar o vm e migrar, o vm terá eth0 como adaptador de rede quando ligado.

ln -s /dev/null /etc/systemd/network/99-default.link;
echo '# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp
pre-up sleep 2' > /etc/network/interfaces

sed -i.bak 's/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 bios.devname=0 quiet"/' /etc/default/grub
update-grub
apt-get remove biosdevname -y || true;

A rigor, apt-get remove biosdevnamenão é necessário, pois esse pacote não está instalado por padrão no ubuntu 16.04. Além disso, a adição bios.devname=0ao GRUB_CMDLINE_LINUX_DEFAULTnão é necessária, pois o biosdevname não está instalado. Evita que a rede se quebre se biosdevname estiver instalado no futuro.

spuder
fonte
Por que definir o link e passar o argumento do kernel? A documentação afirma que um deve ser suficiente. A verificação superficial sugere que esse é realmente o caso.
0xC0000022L
2

Você precisa de nomes previsíveis de interface de rede?

Minha solução foi desinstalar biosdevname, e isso resultou de maneira confiável, sempre com interfaces de rede nomeadas como eth0, eth1 e assim por diante. Não encontrei um bom motivo para ter nomes previsíveis de interface de rede nem biosdevname instalados.

em /etc/udev/rules.d/70-persistent-net.rulesé onde você pode modificar o endereço MAC hardware fica nomeado para eth0, eth1, e assim por diante. Normalmente, apago o conteúdo desse arquivo, salve-o como um arquivo em branco, reinicie e, em seguida, tenho uma lista limpa com os adaptadores de rede corretos aparecendo ...

# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# This file was automatically generated by the /lib/udev/write_net_rules
# program,run by the persistent-net-generator.rules rules file.
#
# You can modify it,as long as you keep each rule on a single
# line,and change only the value of the NAME= key.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

^^ onde xx: xx: xx: xx: xx: xx é o endereço mac exclusivo dos seus adaptadores de rede.

Eu sei que você mencionou que a exclusão deste arquivo não é a solução, mas eu posto o exemplo acima porque pelo menos no Suse é /lib/udev/write_net_rulesque cria esse arquivo. Portanto, veja se o rastreamento posterior desse arquivo ajuda, se for aplicável à sua distribuição, você poderá modificá-lo para resolver seu problema.

note que isto é o que eu sei da versão 11 do Suse, que é o antigo modo Init, antes do systemd. Não tenho certeza se isso foi alterado para as versões mais recentes do linux no systemd.

Ron
fonte
biosdevname é substituído pelo net_id "builtin" do udev freedesktop.org/wiki/Software/systemd/…
sourcejedi
0

Deparou-se com esta atualização de hosts do Ubuntu 14.04 para 16.04. biosdevnamepacote não é instalado por isso recorreram a "biosdevname=0 net.ifnames=0"em /etc/default.grubcomo afirma OP.

Eu executo esse script e, se a saída parecer boa, redirecione a saída /etc/udev/rules.d/70-persistent-net.rulespara criar novas regras do udev, caso o kernel decida enumerar as portas Ethernet em uma ordem diferente.

#!/bin/bash
count=0

# build array of network devices starting with eth? from /proc
for dev in `cat /proc/net/dev | egrep 'eth.*:' | awk '{print $1};' | cut -d':' -f1 | sort`; do
   edev[$count]="$dev"
   let count="$count+1"
done

# use array to find mac address
for d in ${edev[@]}; do
   mac=`ip addr show "$d" | grep ether | awk '{print $2};'`
   if [ -n "$mac" ]; then
      echo "# mac for $d is $mac"
   fi 

   printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="%s"\n' $mac $d
done
Falha no servidor
fonte