Monthly Archives: agosto 2016

Restaurar antiguo esquema de nombres de interfaces de red CentOS 7

Para volver a utilizar el antiguo esquema de nombres de interfaces de red en distribuciones basadas en la familia 7 de Red Hat hay que modificar el parámetro net.ifname y biosdevname=0 en tiempo de arranque y restaurar los antiguos esquemas de configuración de udev.

  • Para ello hay que añadir “net.ifname=0” y “biosdevname=0” en la linea de GRUB_CMDLINE_LINUX de /etc/default/grub .

 

/etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=VG/root rd.lvm.lv=VG/swap net.ifname=0 biosdevname=0 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

 

  • Después de modificar el archivo hay que reconfigurar los parámetros del kernel .
~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.22.2.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.22.2.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-327.10.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.10.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-2d3aa073f57b24438b30ee0a252a1a8c
Found initrd image: /boot/initramfs-0-rescue-2d3aa073f57b24438b30ee0a252a1a8c.img
done

 

  • Una vez reconfigurados los parámetros de arranque debemos restaurar los antiguos esquemas de configuración de udev, personalizándolos en caso de querer usar algún nombre en particular. Es importante que modifiquemos ATTR{address} con los valores de las direcciones MAC de los interfaces de red que tenemos activos en nuestros sistema.
/etc/udev/rules.d/60-net.rules
~]# vim /etc/udev/rules.d/60-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:c7:e2:04", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:39:e7:3c", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

 

  • Una vez preparados los nuevos nombres de los interfaces debemos modificar los archivos de configuración actuales para que encajen con los nuevos nombres.
/etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="192.168.1.120"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
NM_CONTROLLED="no"
/etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="192.168.1.121"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
NM_CONTROLLED="no"

 

  • Ya con los archivos de configuración preparados para su uso procederemos a reiniciar el sistema.

Después de esto deberíamos poder tener el esquema de nombres antiguo operativo en nuestro nuevo sistema. De todos modos, como suele pasar en el mundo de la informática, pequeños detalles pueden hacer que sigamos sin ver los interfaces renombrados. Por poner un ejemplo os cuento un caso que me he encontrado hace poco.


Experiencia personal

Como muchos de vosotros, para mis experimentos, hago uso de todo tipo de técnicas de virtualización con distintos tipos de tecnologías. En mi caso estaba probando un servidor CentOS 7 en un host con virtualización por KVM. Para las pruebas necesitaba utilizar multiples interfaces de red, y con las prisas por empezar a meterme en materia no me pare a mirar los parámetros de configuración. Pues resulto que el segundo interfaz de red virtual se agrego como un dispositivo rtl8139. Por costumbre me gusta renombrar los interfaces de red a la convención antigua (manias que tiene uno) y me encontré con que la primera si que se renombraba sin problemas pero la segunda no. La solución, una vez que sabes lo que tienes que buscar, es muy sencilla, la configuración de udev no coincidía con el interfaz en cuestión. Si tenéis algún problema renombrando interfaces revisad que a configuración de /etc/udev/rules.d/60-net.rules coincide con los parámetros de la interfaz en cuestión. Para ello os pongo un par de comandos para ello:

~]# ls -l /sys/class/net/
total 0
lrwxrwxrwx. 1 root root 0 Aug 27 06:12 ens9 -> ../../devices/pci0000:00/0000:00:09.0/net/ens9
lrwxrwxrwx. 1 root root 0 Aug 27 06:12 eth0 -> ../../devices/pci0000:00/0000:00:03.0/virtio0/net/eth0
lrwxrwxrwx. 1 root root 0 Aug 27 06:12 lo -> ../../devices/virtual/net/lo

Con esto obtenemos el listado de interfaces activas en el sistema. Ahora obtenemos la información que necesita utilizar udev para la configuración:

~]# udevadm info -a -p /sys/class/net/ens9
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
  looking at device '/devices/pci0000:00/0000:00:09.0/net/ens9':
    KERNEL=="ens9"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{mtu}=="1500"
    ATTR{type}=="1"
    ATTR{netdev_group}=="0"
    ATTR{flags}=="0x1003"
    ATTR{speed}=="100"
    ATTR{dormant}=="0"
    ATTR{addr_assign_type}=="0"
    ATTR{dev_id}=="0x0"
    ATTR{duplex}=="full"
    ATTR{gro_flush_timeout}=="0"
    ATTR{iflink}=="3"
    ATTR{addr_len}=="6"
    ATTR{address}=="52:54:00:39:e7:3c"
    ATTR{operstate}=="up"
    ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
    ATTR{tx_queue_len}=="1000"
    ATTR{dev_port}=="0"
    ATTR{ifalias}==""
    ATTR{ifindex}=="3"
    ATTR{link_mode}=="0"
    ATTR{carrier}=="1"
  looking at parent device '/devices/pci0000:00/0000:00:09.0':
    KERNELS=="0000:00:09.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="8139cp"
    ATTRS{irq}=="10"
    ATTRS{subsystem_vendor}=="0x1af4"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x020000"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{local_cpus}=="f"
    ATTRS{device}=="0x8139"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-3"
    ATTRS{vendor}=="0x10ec"
    ATTRS{subsystem_device}=="0x1100"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="0"
  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

En este ejemplo la clave es modificar el parámetro KERNEL==”eth*” por KERNEL==”ens*” y listo.