CentOS 7 - Cambiar el nombre de la interfaz de red sin reiniciar

24

Estoy cambiando el nombre de las interfaces de red modificando los archivos /etc/sysconfig/network-scripts.

  • eth0 -> nic0
  • eth1 -> nic1

El contenido de los scripts de red se ve así, después de la modificación:

# 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

Un reinicio activa la nueva configuración. Pero, ¿cómo activo esta configuración sin reiniciar?

A systemctl restart networkno hace el truco.

Puedo cerrar una interfaz por su nombre anterior ( ifdown eth0) pero ifupaparece el siguiente mensaje sin importar si se proporcionó el nombre antiguo o nuevo:

ERROR: [/ etc / sysconfig / network-scripts / ifup-eth] El dispositivo nic0 no parece estar presente, retrasando la inicialización.

/etc/init.d/network status muestra esta salida:

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

Ambos, ifconfigy ip amuestran los antiguos nombres de interfaz.

udondan
fuente
1
Puede intentar eliminar y volver a cargar los controladores de dispositivo de red, si están compilados como módulos del núcleo.
Tom Hunt

Respuestas:

29

Puede cambiar el nombre del dispositivo con el comando ip:

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

Editar :

Estoy dejando el siguiente en aras de la exhaustividad y la posteridad (y con fines informativos,) pero me han confirmado el comentario de residuos alimenticios y la respuesta de Marco Macuzzo que simplemente cambiando el nombre y el dispositivo de la interfaz / etc / sysconfig / network-scripts / ifcfg- eth0 (y renombrando el archivo) hará que el dispositivo tenga un nombre correcto siempre que el campo hwaddr = esté incluido en el archivo de configuración. Recomiendo usar este método en su lugar después de la actualización referenciada.

También puede asegurarse de configurar una regla udev, para que esto funcione en el próximo reinicio también. La ruta para udev se movió en CentOS 7 a /usr/lib/udev/rules.d/60-net.rules, pero aún puede administrarlo de la misma manera. Si agregó "net.ifnames = 0 biosdevname = 0" a la cadena de arranque del kernel para volver al antiguo esquema de nomenclatura para sus nics, puede eliminar

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

Y reemplazarlo con

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

Necesita una entrada por nic. Asegúrese de usar la dirección MAC correcta y actualice el campo NOMBRE. Si no usó "net.ifnames = 0 biosdevname = 0", tenga cuidado ya que podría haber consecuencias no deseadas.

James Shewey
fuente
2
Solo una nota sobre esto. Si está utilizando CentOS 7.3, entonces esto no funciona. Esto se debe a este problema ( access.redhat.com/solutions/2592561 ). Tendrá que anular el archivo en /etc/udev/rules.d/90-eno-fix.rulesporque anula todas las soluciones que funcionaban anteriormente para cambiar el nombre de los dispositivos de red.
Swill
Al observar el aviso al que hizo referencia, señala "Este problema puede evitarse actualizando los repositorios de instalación para incluir el paquete systemd-219-30.el7_3.6 o posterior. Con esta versión más reciente del sistema, las interfaces afectadas se identifican en la instalación del paquete y se genera automáticamente una regla udev, por lo que se evita por completo el problema de cambio de nombre ".
James Shewey
Esa es una cuestión de cambio de nombre diferente a la que se refieren. Están hablando de acortar el nombre porque es demasiado largo (creo). La regla de udev que se menciona codifica el nombre de la interfaz a un eno########valor que anula todos estos intentos de cambiarle el nombre a algo así eth0. ¿Tiene sentido? Tendré que verificar en mi máquina qué versión estoy usando, pero ayer actualicé al último CentOS 7.3, así que creo que mencionaré la versión.
Swill
Este método me fue útil para resolver un problema diferente pero relacionado: un contenedor se bloqueó al iniciarse debido a un error de configuración no relacionado y dejó la interfaz renombrada del nombre del sistema ensXfY al nombre del contenedor eth1. Entonces no fue posible volver a intentar iniciar el contenedor porque no pudo encontrar la interfaz hasta que se le cambió el nombre
Michael Firth
9

En realidad, creo que la mejor respuesta es la combinación de las dos respuestas ya publicadas. Para cambiar el nombre del dispositivo sin reiniciar los servicios de red, use los ip linkcomandos sugeridos por James Shewey ( ip link set <old_device_name> name <new_device_name>).

Para que los cambios sobrevivan al reinicio en Red Hat Linux, modifique el archivo correspondiente en /etc/sysconfig/network-scripts/. Cambie el nombre del archivo ifcfg_<old_device_name>a ifcfg_<new_device_name>y cambie la DEVICEvariable dentro a <new_device_name>. Además, asegúrese de que la HWADDRvariable esté establecida y sea correcta. No es necesario tocar las reglas de udev , ya 60-net.rulesque en realidad está allí para leer los archivos de configuración de ifcfg /etc/sysconfig/network-scripts.

Marco Mazzucco
fuente
3

Para restaurar la antigua convención de nomenclatura, debe editar el /etc/default/grubarchivo y agregar lo siguiente

net.ifnames=0 biosdevname=0 

al final de la GRUB_CMDLINE_LINUXvariable

marca
fuente
O simplemente eliminando el biosdevnamepaquete si está 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
fuente
1
bonito truco para cambiar el nombre :) gracias por compartir
166_MMX
2

La respuesta dada por @James Shewey parece ser la forma correcta de hacerlo.

Si solo desea trabajar con los archivos de configuración /etc/sysconfig/network-scriptsy luego desencadenar una recarga, descargar y cargar el módulo del kernel como lo menciona @Tom Hunt en los comentarios también funciona:

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

Si accede a la máquina de forma remota, asegúrese de ejecutar todos los comandos en un nohup o se bloqueará:

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

El controlador para recargar, por supuesto, depende de su interfaz.

udondan
fuente
0

Intenté lo anterior con Vagrant / VirtualBox y ansible, pero de alguna manera esto no funcionó en absoluto en mi entorno de desarrollo.

Los antiguos nombres de la interfaz se mantuvieron lo que hice hasta que se reinició por completo.

Agregué las siguientes reglas en /etc/udev/rules.d/60-persistent-net.rules(basadas en: https://access.redhat.com/solutions/112643 )

Mi objetivo era darle a la interfaz un nombre específico basado en la dirección PCI.

Ejemplo:

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

Después de agregar esas reglas ejecuté los siguientes comandos:

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

El mensaje de error estaba Cannot find device "int0"en el ip link set * upcomando. Y en /var/log/messagesnoté los siguientes mensajes

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.

Pero lo siguiente funcionó al acceder a la VM a través de VirtualBox y ejecutar los siguientes comandos para eliminar y volver a agregar el módulo del kernel.

rmmod e1000 
modprobe e1000

Encontré esto en el siguiente hilo: https://www.centos.org/forums/viewtopic.php?t=54695

Lo extraño que noté fue que lsmodme da (tenga en cuenta el Used by)

[vagrant@node-01 ~]$ lsmod
Module                  Size  Used by
e1000                 137586  0 
Sander Visser
fuente
Háganos saber qué no funcionó con la respuesta aceptada, con mensajes de error exactos. De esa manera, tal vez la respuesta pueda mejorarse.
Ned64
@ Ned64 agregué el mensaje de error y un poco más de información
Sander Visser
Lo que quiero decir es: ¿Qué sucede cuando escribes, como root ip link set eth0 down; ip link set eth0 name int0; ip link set int0 up:? Sin udev...comando!
Ned64