CentOS 7 - Renomeie a interface de rede sem reiniciar

24

Estou renomeando interfaces de rede modificando os arquivos /etc/sysconfig/network-scripts.

  • eth0 -> nic0
  • eth1 -> nic1

O conteúdo dos scripts de rede fica assim, após a modificação:

# cat /etc/sysconfig/network-scripts/ifcfg-nic0
DEVICE=nic0
BOOTPROTO=static
ONBOOT=yes
HWADDR=xx:xx:xx:xx:xx:xx
USERCTL=no
IPV6INIT=no
MASTER=bond0
SLAVE=yes

Uma reinicialização ativa a nova configuração. Mas como ativo essa configuração sem reiniciar?

A systemctl restart networknão faz o truque.

Posso desligar uma interface pelo nome antigo ( ifdown eth0), mas ifupresulta na mensagem abaixo, independentemente do nome antigo ou novo:

ERRO: [/ etc / sysconfig / network-scripts / ifup-eth] O dispositivo nic0 não parece estar presente, atrasando a inicialização.

/etc/init.d/network status mostra esta saída:

Configured devices:
lo bond0 nic0 nic1
Currently active devices:
lo eth0 eth1 bond0

Ambos ifconfige ip amostram os nomes antigos da interface.

udondan
fonte
1
Você pode tentar remover e recarregar os drivers de dispositivo de rede, se eles forem compilados como módulos do kernel.
Tom Hunt

Respostas:

29

Você pode renomear o dispositivo usando o comando ip:

/sbin/ip link set eth1 down
/sbin/ip link set eth1 name eth123
/sbin/ip link set eth123 up

Editar :

Estou deixando o abaixo por uma questão de integridade e posteridade (e para fins informativos), mas confirmei o comentário de swill e a resposta de Marco Macuzzo que simplesmente altera o nome e o dispositivo da interface / etc / sysconfig / network-scripts / ifcfg- eth0 (e renomear o arquivo) fará com que o dispositivo seja nomeado corretamente , desde que o campo hwaddr = esteja incluído no arquivo de configuração. Eu recomendo usar esse método após a atualização mencionada.

Você também pode ter certeza de configurar uma regra do udev, para que isso funcione também na próxima reinicialização. O caminho para o udev foi movido no CentOS 7 para /usr/lib/udev/rules.d/60-net.rules, mas você ainda pode gerenciá-lo da mesma maneira. Se você adicionou "net.ifnames = 0 biosdevname = 0" à sua cadeia de inicialização do kernel para retornar ao antigo esquema de nomenclatura das suas placas de rede , você pode remover

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"

E substitua-o por

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="00:50:56:8e:3f:a7", NAME="eth123"

Você precisa de uma entrada por nic. Certifique-se de usar o endereço MAC correto e atualize o campo NAME. Se você não usou "net.ifnames = 0 biosdevname = 0", tenha cuidado, pois isso pode causar consequências não intencionais.

James Shewey
fonte
2
Apenas uma nota sobre isso. Se você estiver usando o CentOS 7.3, isso não funcionará. Isso ocorre por causa deste problema ( access.redhat.com/solutions/2592561 ). Você precisará substituir o arquivo em /etc/udev/rules.d/90-eno-fix.rulesporque ele substitui todas as soluções que funcionavam anteriormente para renomear os dispositivos de rede.
swill 15/03
Observando o comunicado que você referenciou, ele observa "Esse problema pode ser evitado com a atualização dos repositórios de instalação para incluir o pacote systemd-219-30.el7_3.6 ou posterior. Com esta versão mais recente do systemd, as interfaces afetadas são identificadas na instalação e instalação do pacote. uma regra do udev é gerada automaticamente para que o problema de renomeação seja totalmente evitado. "
James Shewey
Esse é um problema de renomeação diferente ao qual eles estão se referindo. Eles estão falando sobre o nome ser encurtado porque é muito longo (eu acho). A regra udev mencionada codifica o nome da interface para um eno########valor que substitui todas essas tentativas de renomeá-la para algo como eth0. Isso faz sentido? Vou ter que verificar na minha máquina qual versão estou usando, mas atualizei para o último CentOS 7.3 ontem, então acho que terei a versão mencionada.
swill
Esse método foi útil para resolver um problema diferente, mas relacionado - um contêiner travou ao iniciar devido a um erro de configuração não relacionado e deixou a interface renomeada do nome do sistema ensXfY para o nome do contêiner eth1. Não foi possível tentar novamente iniciar o contêiner porque ele não pôde encontrar a interface até que fosse renomeada novamente
Michael Firth
9

Na verdade, a melhor resposta que acredito é a combinação das duas respostas já postadas. Para alterar o nome do dispositivo sem reiniciar os serviços de rede, use os ip linkcomandos sugeridos por James Shewey ( ip link set <old_device_name> name <new_device_name>).

Para fazer as alterações sobreviverem a uma reinicialização no Red Hat Linux, modifique o arquivo relevante em /etc/sysconfig/network-scripts/. Renomeie o arquivo ifcfg_<old_device_name>para ifcfg_<new_device_name>e mudar o DEVICEinterior variável <new_device_name>. Além disso, verifique se a HWADDRvariável está definida e está correta. Não há necessidade de tocar nas regras do udev , pois 60-net.rulesexiste para ler os arquivos de configuração do ifcfg /etc/sysconfig/network-scripts.

Marco Mazzucco
fonte
3

Para restaurar a convenção de nomenclatura antiga, você precisa editar o /etc/default/grubarquivo e adicionar o seguinte

net.ifnames=0 biosdevname=0 

no final da GRUB_CMDLINE_LINUXvariável

Marca
fonte
Ou simplesmente remover o biosdevnamepacote se ele estiver instalado
GAD3R
3
ip link set ens33 down
ip link set ens33 name eth0
ip link set eth0 up

mv /etc/sysconfig/network-scripts/ifcfg-{ens33,eth0}

sed -ire "s/NAME=\"ens33\"/NAME=\"eth0\"/" /etc/sysconfig/network-scripts/ifcfg-eth0

sed -ire "s/DEVICE=\"ens33\"/NAME=\"eth0\"/" /etc/sysconfig/network-scripts/ifcfg-eth0

MAC=$(cat /sys/class/net/eth0/address)

echo -n 'HWADDR="'$MAC\" >> /etc/sysconfig/network-scripts/ifcfg-eth0
TJ Zimmerman
fonte
1
truque de renomeação agradável :) obrigado por compartilhar
166_MMX 11/04
2

A resposta dada por James Shewey parece ser o caminho certo para fazê-lo.

Se você quiser apenas trabalhar com os arquivos de configuração /etc/sysconfig/network-scriptse acionar uma recarga, descarregar e carregar o módulo do kernel, conforme mencionado por @Tom Hunt nos comentários, também funciona:

service network stop
modprobe -r igb
modprobe igb
service network start

Se você acessar a máquina remotamente, certifique-se de executar todos os comandos em um nohup ou se bloqueará:

nohup sh -c "service network stop && modprobe -r igb && modprobe igb ; service network start"

O driver para recarregar, é claro, depende da sua interface.

udondan
fonte
0

Eu tentei o acima com Vagrant / VirtualBox e ansible, mas de alguma forma isso não funcionou no meu ambiente de desenvolvimento.

Os nomes antigos da interface foram mantidos, independentemente do que eu fiz até uma reinicialização completa.

Adicionei as seguintes regras em /etc/udev/rules.d/60-persistent-net.rules(com base em: https://access.redhat.com/solutions/112643 )

Meu objetivo era atribuir à interface um nome especificado com base no endereço PCI.

Exemplo:

ACTION=="add", SUBSYSTEM=="net", KERNELS=="0000:00:09.0", NAME:="int0"
ACTION=="add", SUBSYSTEM=="net", KERNELS=="0000:00:10.0", NAME:="ext0"

Depois de adicionar essas regras, executei os seguintes comandos:

ip link set eth0 down
udevadm control --reload-rules
udevadm trigger
ip link set int0 up

A mensagem de erro estava Cannot find device "int0"no ip link set * upcomando. E /var/log/messagesnotei as seguintes mensagens

Aug 16 17:08:41 localhost ansible-command: Invoked with creates=None executable=None _uses_shell=True strip_empty_ends=True _raw_params=ip link set eth0 down && udevadm control --reload-rules && udevadm trigger && ip link set int0 up#012 removes=None argv=None warn=True chdir=None stdin_add_newline=True stdin=None
Aug 16 17:08:41 localhost NetworkManager[6989]: <info>  [1565975321.5971] device (eth6): state change: disconnected -> unavailable (reason 'carrier-changed', sys-iface-state: 'managed')
Aug 16 17:08:41 localhost systemd-udevd: Network interface NamePolicy= disabled on kernel command line, ignoring.

Mas o seguinte funcionou acessando a VM através do VirtualBox e execute os seguintes comandos para remover e adicionar novamente o módulo do kernel.

rmmod e1000 
modprobe e1000

Encontrei isso no seguinte tópico: https://www.centos.org/forums/viewtopic.php?t=54695

O estranho que notei foi que lsmodme dá (observe o Used by)

[vagrant@node-01 ~]$ lsmod
Module                  Size  Used by
e1000                 137586  0 
Sander Visser
fonte
Informe o que não funcionou com a resposta aceita, com mensagens de erro exatas. Dessa forma, talvez a resposta possa ser melhorada.
Ned64
@ Ned64 Adicionei a mensagem de erro e um pouco mais de informação
Sander Visser
O que quero dizer é: O que acontece quando você digita como root ip link set eth0 down; ip link set eth0 name int0; ip link set int0 up:? Nenhum udev...comando!
Ned64 17/08