GNU/Linux >> Tutoriales Linux >  >> Linux

Administrar su hardware adjunto en Linux con systemd-udevd

Linux hace un gran trabajo reconociendo, cargando y exponiendo automáticamente dispositivos de hardware adjuntos de innumerables proveedores. De hecho, fue esta característica la que, hace muchos años, me convenció de insistir en que mi empleador convirtiera toda su infraestructura a Linux. El punto de dolor fue la forma en que cierta empresa en Redmond no pudo cargar controladores para la tarjeta de red integrada en nuestras computadoras de escritorio Compaq mientras que Linux lo hizo sin esfuerzo.

En los años transcurridos desde entonces, la biblioteca de Linux de dispositivos reconocidos ha crecido enormemente junto con la sofisticación del proceso. Y la estrella de ese espectáculo es udev. El trabajo de Udev es escuchar eventos del kernel de Linux que involucren cambios en el estado de un dispositivo. Podría ser un nuevo dispositivo USB que está enchufado o desconectado, o podría ser un mouse inalámbrico que se desconecta porque se ahogó en el café derramado.

El trabajo de Udev es manejar todos los cambios de estado, por ejemplo, asignando los nombres o permisos a través de los cuales se accede a los dispositivos. Se puede acceder a un registro de esos cambios a través de dmesg. Dado que dmesg generalmente arroja miles de entradas, es inteligente filtrar los resultados. El siguiente ejemplo muestra cómo Linux identifica mi interfaz WiFi. Muestra el conjunto de chips que usa mi dispositivo inalámbrico (ath9k ), el nombre original que se le asignó al principio del proceso (wlan0 ), y el nombre permanente grande y feo que está usando actualmente (wlxec086b1ef0b3 ):

$ dmesg | grep wlan
[    5.396874] ath9k_htc 1-3:1.0 wlxec086b1ef0b3: renamed from wlan0

En este artículo, discutiré por qué alguien querría usar un nombre como ese. En el camino, exploraré la anatomía de los archivos de configuración de udev y luego mostraré cómo realizar cambios en la configuración de udev, incluida la forma de editar la forma en que el sistema nombra los dispositivos. Este artículo se basa en un módulo de mi nuevo curso, Optimización del sistema Linux.

Comprender el sistema de configuración udev

En las máquinas systemd, las operaciones de udev son administradas por systemd-udevd demonio. Puede verificar el estado del demonio udev de la manera habitual en systemd usando systemctl status systemd-udevd .

Más recursos de Linux

  • Hoja de trucos de los comandos de Linux
  • Hoja de trucos de comandos avanzados de Linux
  • Curso en línea gratuito:Descripción general técnica de RHEL
  • Hoja de trucos de red de Linux
  • Hoja de trucos de SELinux
  • Hoja de trucos de los comandos comunes de Linux
  • ¿Qué son los contenedores de Linux?
  • Nuestros últimos artículos sobre Linux

Técnicamente, udev funciona tratando de hacer coincidir cada evento del sistema que recibe con conjuntos de reglas que se encuentran en /lib/udev/rules.d/ o /etc/udev/rules.d/ directorios. Los archivos de reglas incluyen claves de coincidencia y claves de asignación. El conjunto de claves de coincidencia disponibles incluye acción , nombre y subsistema . Esto significa que si se detecta un dispositivo con un nombre específico que forma parte de un subsistema específico, se le asignará una configuración preestablecida.

Luego, los pares clave/valor de "asignación" se utilizan para aplicar la configuración deseada. Podría, por ejemplo, asignar un nuevo nombre al dispositivo, asociarlo con un enlace simbólico del sistema de archivos o restringir el acceso a un propietario o grupo en particular. Aquí hay un extracto de dicha regla de mi estación de trabajo:

$ cat /lib/udev/rules.d/73-usb-net-by-mac.rules
# Use MAC based names for network interfaces which are directly or indirectly
# on USB and have an universally administered (stable) MAC address (second bit
# is 0). Don't do this when ifnames is disabled via kernel command line or
# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules).

IMPORT{cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end"

ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb", NAME=="", \
    ATTR{address}=="?[014589cd]:*", \
    TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \
    TEST!="/etc/systemd/network/99-default.link", \
    IMPORT{builtin}="net_id", NAME="$env{ID_NET_NAME_MAC}"

El añadir action le dice a udev que se encienda cada vez que se conecte un nuevo dispositivo que sea parte del subsistema de red y es un dispositivo USB. Además, si lo entiendo correctamente, la regla se aplicará solo cuando el dispositivo tenga una dirección MAC compuesta por caracteres dentro de un cierto rango y, además, solo si el 80-net-setup-link.rules y 99-default.enlace los archivos no existir.

Suponiendo que se cumplan todas estas condiciones, la ID de la interfaz se cambiará para que coincida con la dirección MAC del dispositivo. Recuerde la entrada anterior de dmesg que muestra cómo se cambió el nombre de mi interfaz de wlan0 a ese asqueroso wlxec086b1ef0b3 ¿nombre? Eso fue el resultado de la ejecución de esta regla. ¿Cómo puedo saber? Porque ec:08:6b:1e:f0:b3 es la dirección MAC del dispositivo (menos los dos puntos):

$ ifconfig -a
wlxec086b1ef0b3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::7484:3120:c6a3:e3d1  prefixlen 64  scopeid 0x20<link>
        ether ec:08:6b:1e:f0:b3  txqueuelen 1000  (Ethernet)
        RX packets 682098  bytes 714517869 (714.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 472448  bytes 201773965 (201.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Esta regla udev existe de forma predeterminada en Linux. No tuve que escribirlo yo mismo. Pero, ¿por qué molestarse, especialmente viendo lo difícil que es trabajar con una designación de interfaz de este tipo? Eche un segundo vistazo a los comentarios incluidos con la regla:

# Use MAC based names for network interfaces which are directly or indirectly
# on USB and have an universally administered (stable) MAC address (second bit
# is 0). Don't do this when ifnames is disabled via kernel command line or
# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules).

Tenga en cuenta que esta regla está diseñada específicamente para interfaces de red basadas en USB. A diferencia de las tarjetas de interfaz de red (NIC) PCI, es probable que los dispositivos USB se retiren y reemplacen de vez en cuando. Esto significa que no hay garantía de que su identificación no cambie. Podrían ser wlan0 un día y wlan3 el siguiente. Para evitar confundir las aplicaciones, asigne ID absolutos a los dispositivos, como el que se le dio a mi interfaz USB.

Manipulación de la configuración de udev

Para mi próximo truco, tomaré la dirección MAC y la ID actual de la interfaz de red Ethernet en una máquina virtual VirtualBox y luego usaré esa información para crear una nueva regla udev que cambiará la ID de la interfaz. ¿Por qué? Bueno, tal vez planeo trabajar con el dispositivo desde la línea de comandos y tener que escribir ese nombre largo puede ser molesto. Así es como funcionará.

Antes de poder cambiar mi ID, tendré que deshabilitar la configuración de red actual de Netplan. Eso obligará a Linux a prestar atención a la nueva configuración. Aquí está mi archivo de configuración de interfaz de red actual en /etc/netplan/ directorio:

$ less /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
    version: 2

50-cloud-init.yaml El archivo contiene una definición de interfaz muy básica. Pero también incluye información importante sobre cómo deshabilitar la configuración en los comentarios. Para hacerlo, me desplazaré a /etc/cloud/cloud.cfg.d directorio y cree un nuevo archivo llamado 99-disable-network-config.cfg y agregue la red:{config:disabled} cadena.

Si bien no he probado este método en otras distribuciones que no sean Ubuntu, debería funcionar en cualquier versión de Linux con systemd (que es casi todas). Independientemente de lo que esté usando, verá bien cómo escribir archivos de configuración udev y probarlos.

A continuación, necesito recopilar información del sistema. Ejecutando la ip el comando informa que mi interfaz Ethernet se llama enp0s3 y su dirección MAC es 08:00:27:1d:28:10 :

$ ip a
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:1d:28:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.115/24 brd 192.168.0.255 scope global dynamic enp0s3

Ahora, crearé un nuevo archivo llamado peristent-net.rules en el /etc/udev/rules.d directorio. Voy a darle al archivo un nombre que comience con un número bajo, 10:

$ cat /etc/udev/rules.d/10-persistent-network.rules
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00:27:1d:28:10",NAME="eth3"

Cuanto menor sea el número, antes Linux ejecutará el archivo, y quiero que este se ejecute antes. El archivo contiene código que le dará el nombre eth3 a un dispositivo de red cuando se agrega, siempre que su dirección coincida con 08:00:27:1d:28:10 , que es la dirección MAC de mi interfaz.

Una vez que guarde el archivo y reinicie la máquina, mi nuevo nombre de interfaz debería estar en juego. Es posible que deba iniciar sesión directamente en mi máquina virtual y usar dhclient para hacer que Linux solicite manualmente una dirección IP en esta red recién nombrada. Abrir sesiones SSH puede ser imposible sin hacer eso primero:

$ sudo dhclient eth3

Hecho. Entonces, ahora puede forzar a udev para que su computadora se refiera a una NIC de la manera que desee. Pero lo que es más importante, tiene las herramientas para descubrir cómo administrar cualquier dispositivo que se comporta mal.


Linux
  1. Use lspci en Linux para ver su hardware

  2. Supervise su sistema Linux en su terminal con procps-ng

  3. Escanee su seguridad Linux con Lynis

  4. Comandos de Linux para mostrar la información de su hardware

  5. Administrar particiones en Linux con fdisk

Dale sabor a tu escritorio Linux con Cinnamon

Modernice su escritorio Linux con Enlightenment

Date un baño en tu terminal Linux con asciiquarium

Encuentre información de hardware del sistema Linux con Hwinfo

Cómo monitorear sus servidores Linux con Checkmk

Administre sus servidores con Cockpit Linux