Nombres de interfaces de red persistentes

Algunas veces un sistema GNU/Linux altera el nombre de las interfaces de red, provocando problemas de conectividad. El demonio udev se encarga de mapear dinámicamente los dispositivos periféricos en el directorio /dev/. Si tenemos un sistema con varias interfaces de red, el nombre asignado a cada una puede variar de una vez a otra, debido a algún cambio en el proceso de inicialización. De este modo, en un arranque, el sistema podría asignar la etiqueta eth0 a la interfaz A y la etiqueta eth1 a la interfaz B; en otro arranque, la interfaz A podría obtener la etiqueta eth1 y la interfaz B la etiqueta eth0. De modo que ante un cambio como este, perdemos la conectividad.

Udev es un gestor de dispositivos genérico del kernel, que se ejecuta como un demonio que escucha los eventos generador por el kernel. Cuando se produce un evento de inicialización de un dispositivo, o eliminación del mismo, udev consulta en sus archivos de reglas buscando una coincidencia. Cuando esa coincidencia se produce para un dispositivo detectado, se creará un nodo para el mismo y se ejecutarán los programas indicados para configurar el dispositivo. Las reglas definidas para udev pueden basarse en algún parámetro que identifique al dispositivo, como su número de serie, localización física, MAC (en el caso de la interfaces de red), etc.

udev permite utilizar en sus reglas diferentes parámetros para encontrar de forma precisa un cierto dispositivo. Parámetros como KERNEL (para buscar coincidencias con el nombre que el kernel asigna al dispositivo), SUBSYSTEM (para buscar coincidencias con el subsitema1 del dispositivo), DRIVER (para buscar coincidencias con el nombre el driver del dispositivos), etc.

Finalmente, una vez que udev ha identificado un dispositivo, permite mediante las reglas concretar entre otras cosas como se bautizará al dispositivo. Para esto, se utiliza el parámetro NAME. El siguiente es un ejemplo de reglas para udev generadas automáticamente:

# This file maintains persistent names for network interfaces. # See udev(7) for syntax. # # Entries are automatically added by the 75-persistent-net-generator.rules # file; however you are also free to add your own entries. # PCI device 0x1969:0x1063 (atl1c) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="48:5b:e6:af:3d:1a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x168c:0x002b (ath9k) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="1c:4b:de:f3:4a:19", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0" mauri@nostromo:~$

A efectos prácticos, para controlar los nombres asignados a las interfaces, basta con editar las entras, concretamente el parámetro NAME. Las reglas para udev en un sistema GNU/Linux basado en Debian, como por ejemplo Ubuntu, están en /etc/udev/rules.d. El nombre del archivo donde se guardan las reglas de las interfaces de red debe contener la cadena net. Por ejemplo, 70-persistent-net.rules.

Así que supongamos que hemos cambiado una cierta interfaz de red, y ahora udev le asigna un nombre que no queremos que le asigne. En tal caso lo que tenemos que hacer es averiguar la MAC de la interfaz, y editar el archivo 70-persistent-net.rules. Para averiguar la MAC de una interfaz, debemos ejecutar el comando ifconfig <nombre-interfaz>. Por ejemplo:

usuario@server:~$ ifconfig eth0 eth0 Link encap:Ethernet direcciónHW 48:5b:e6:af:3d:1a Direc. inet:192.168.1.100 Difus.:192.168.1.255 Másc:255.255.255.0 Dirección inet6: fe80::4a5b:39ff:fee6:aadf/64 Alcance:Enlace ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1 Paquetes RX:107733 errores:0 perdidos:0 overruns:0 frame:0 Paquetes TX:93811 errores:0 perdidos:0 overruns:0 carrier:1 colisiones:0 long.colaTX:1000 Bytes RX:122264958 (122.2 MB) TX bytes:39222577 (39.2 MB) Interrupción:33

Pongamos que udev ha completado el archivo 70-persistent-net.rules con el siguiente contenido:

# This file maintains persistent names for network interfaces. # See udev(7) for syntax. # # Entries are automatically added by the 75-persistent-net-generator.rules # file; however you are also free to add your own entries. # PCI device 0×10de:0×0373 (forcedeth) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:18:f3:5e:25:ba", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x1969:0x1063 (atl1c) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="48:5b:e6:af:3d:1a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

Para que la nueva interfaz (que el sistema ha llamado erróneamente eth0), se llame eth1, debemos cambiar el valor de los parámetros NAME, para que quede del siguiente modo:

# This file maintains persistent names for network interfaces. # See udev(7) for syntax. # # Entries are automatically added by the 75-persistent-net-generator.rules # file; however you are also free to add your own entries. # PCI device 0×10de:0×0373 (forcedeth) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:18:f3:5e:25:ba", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" # PCI device 0x1969:0x1063 (atl1c) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="48:5b:e6:af:3d:1a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Un recurso muy interesante, también sobre udev es http://www.vicente-navarro.com/blog/2007/03/29/creacion-de-reglas-udev-para-personalizar-el-nombre-de-los-ficheros-de-dispositivo-de-las-memorias-usb/.

Saludos.