Gestión de dispositivos del sistema con el Administrador de dispositivos udev

Visión general de cómo el gestor de dispositivos udev detecta el hardware, gestiona los nodos de dispositivos y se integra con systemd en Oracle Linux.

El administrador de dispositivos udev se ejecuta como un servicio systemd para ayudar a proporcionar software con acceso predecible y gestionado a los dispositivos del sistema expuestos por el núcleo. Normalmente, udev gestiona los permisos de los nodos de dispositivo, crea enlaces simbólicos en el directorio /dev/ para que los nombres de dispositivos sean más predecibles y fáciles de identificar o cambie el nombre de las interfaces de red.

El gestor de dispositivos udev crea o elimina dinámicamente archivos de nodo de dispositivo en el momento del inicio. Al crear un nodo de dispositivo, udev lee el directorio /sys del dispositivo para atributos como la etiqueta, el número de serie y el número de dispositivo de bus.

udev puede utilizar nombres de dispositivos persistentes para garantizar una nomenclatura coherente de los dispositivos tras los reinicios, independientemente del orden de detección. Los nombres de dispositivos persistentes son especialmente importantes cuando se utilizan dispositivos de almacenamiento externo.

udev también maneja eventos de controladores de dispositivos que son activados por el núcleo y utiliza las reglas definidas en su configuración para disparar acciones particulares. Por ejemplo, si un dispositivo de almacenamiento USB está conectado al sistema, el núcleo notifica a udev y udev notifica al controlador adecuado para que se pueda montar el dispositivo. Además, si un cable de red está conectado a una tarjeta de interfaz de red, el núcleo notifica a udev el cambio de estado y udev notifica a NetworkManager para que se pueda realizar la acción adecuada para conectarse a la red.

El archivo de configuración para udev es /etc/udev/udev.conf, en el que puede definir la prioridad de registro udev_log, que se puede definir en err, info y debug. El valor por defecto es err. La configuración adicional de las reglas utilizadas por udev se maneja en archivos de reglas individuales en /etc/udev/rules.d/.

Para obtener más información, consulte la página del manual udev(7).

udev es un componente de systemd. Para obtener información adicional, consulte las guías de systemd específicas de la versión.

Para obtener más información sobre los conceptos de systemd utilizados por udev en las versiones de Oracle Linux, consulte Managing the System With systemd.

Para obtener más información sobre los sistemas de archivos virtuales del núcleo y los módulos de controladores de dispositivos, utilice los siguientes recursos específicos de la versión.

Para obtener más información sobre los sistemas de archivos virtuales del núcleo y los módulos de controladores de dispositivos en las versiones de Oracle Linux, consulte Managing Kernels and System Boot on Oracle Linux.

Acerca de los archivos de dispositivo

Explica cómo Oracle Linux representa el hardware como archivos de dispositivos, incluidos bloques, caracteres y pseudodispositivos.

El directorio /dev contiene archivos de dispositivo o nodos de dispositivo que proporcionan acceso a dispositivos periféricos, como discos duros, recursos en dispositivos periféricos, como particiones de disco, y pseudodispositivos, como un generador de números aleatorios.

El directorio /dev tiene varias jerarquías de subdirectorios, cada una de las cuales contiene archivos de dispositivos que se relacionan con un determinado tipo de dispositivo. Sin embargo, el contenido de estos subdirectorios se implementa como enlaces simbólicos a los archivos correspondientes en /dev. Por lo tanto, se puede acceder a los archivos a través del archivo vinculado en /dev o el archivo correspondiente en el subdirectorio.

El uso del comando ls -l /dev muestra los archivos, algunos de los cuales se marcan como de tipo b (para block) o de tipo c (para character). Estos dispositivos tienen un par asociado de números que identifican el dispositivo al sistema.

ls -l /dev
total 0
crw-r--r--. 1 root root     10, 235 Aug 20 08:36 autofs
drwxr-xr-x. 2 root root         240 Sep 20 07:37 block
drwxr-xr-x. 2 root root         100 Aug 20 08:36 bsg
drwxr-xr-x. 3 root root          60 Nov  4  2019 bus
lrwxrwxrwx. 1 root root           3 Aug 20 08:36 cdrom -> sr0
drwxr-xr-x. 2 root root        2720 Sep 20 07:37 char
crw-------. 1 root root      5,   1 Aug 20 08:36 console
lrwxrwxrwx. 1 root root          11 Aug 20 08:36 core -> /proc/kcore
drwxr-xr-x. 3 root root          60 Nov  4  2019 cpu
crw-------. 1 root root     10,  62 Aug 20 08:36 cpu_dma_latency
drwxr-xr-x. 7 root root         140 Aug 20 08:36 disk
brw-rw----. 1 root disk    253,   0 Aug 20 08:36 dm-0
brw-rw----. 1 root disk    253,   1 Aug 20 08:36 dm-1
brw-rw----. 1 root disk    253,   2 Aug 20 08:36 dm-2
lrwxrwxrwx. 1 root root          13 Aug 20 08:36 fd -> /proc/self/fd
crw-rw-rw-. 1 root root      1,   7 Aug 20 08:36 full
crw-rw-rw-. 1 root root     10, 229 Aug 20 08:36 fuse
crw-------. 1 root root     10, 228 Aug 20 08:36 hpet
drwxr-xr-x. 2 root root           0 Aug 20 08:36 hugepages
crw-------. 1 root root     10, 183 Aug 20 08:36 hwrng
lrwxrwxrwx. 1 root root          12 Aug 20 08:36 initctl -> /run/initctl
drwxr-xr-x. 3 root root         220 Aug 20 08:36 input
crw-r--r--. 1 root root      1,  11 Aug 20 08:36 kmsg
lrwxrwxrwx. 1 root root          28 Aug 20 08:36 log -> /run/systemd/journal/dev-log
brw-rw----. 1 root disk      7,   0 Sep 23 01:28 loop0
crw-rw----. 1 root disk     10, 237 Sep 20 07:37 loop-control
drwxr-xr-x. 2 root root         120 Aug 20 08:36 mapper
crw-------. 1 root root     10, 227 Aug 20 08:36 mcelog
crw-r-----. 1 root kmem      1,   1 Aug 20 08:36 mem
crw-------. 1 root root     10,  59 Aug 20 08:36 memory_bandwidth
drwxrwxrwt. 2 root root          40 Nov  4  2019 mqueue
drwxr-xr-x. 2 root root          60 Aug 20 08:36 net
crw-------. 1 root root     10,  61 Aug 20 08:36 network_latency
crw-------. 1 root root     10,  60 Aug 20 08:36 network_throughput
crw-rw-rw-. 1 root root      1,   3 Aug 20 08:36 null
crw-------. 1 root root     10, 144 Aug 20 08:36 nvram
drwxr-xr-x. 2 root root         100 Aug 20 08:36 ol_ca-virtdoc-oltest1
crw-r-----. 1 root kmem      1,   4 Aug 20 08:36 port
crw-------. 1 root root    108,   0 Aug 20 08:36 ppp
crw-rw-rw-. 1 root tty       5,   2 Oct  7 08:10 ptmx
drwxr-xr-x. 2 root root           0 Aug 20 08:36 pts
crw-rw-rw-. 1 root root      1,   8 Aug 20 08:36 random
drwxr-xr-x. 2 root root          60 Nov  4  2019 raw
lrwxrwxrwx. 1 root root           4 Aug 20 08:36 rtc -> rtc0
crw-------. 1 root root    251,   0 Aug 20 08:36 rtc0
brw-rw----. 1 root disk      8,   0 Aug 20 08:36 sda
brw-rw----. 1 root disk      8,   1 Aug 20 08:36 sda1
brw-rw----. 1 root disk      8,   2 Aug 20 08:36 sda2
brw-rw----. 1 root disk      8,  16 Aug 20 08:36 sdb
brw-rw----. 1 root disk      8,  17 Aug 20 08:36 sdb1
crw-rw----. 1 root cdrom    21,   0 Aug 20 08:36 sg0 

Dispositivos de bloque

Los dispositivos de bloque permiten el acceso aleatorio a los datos, buscan medios para los datos y, por lo general, almacenan en buffer los datos mientras se escriben o leen. Algunos ejemplos de dispositivos de bloques son discos duros, unidades de CD-ROM, memoria flash y otros dispositivos de memoria direccionables.

Dispositivos de caracteres

Los dispositivos de caracteres permiten la transmisión de datos desde o hacia un dispositivo. Normalmente, los datos no se almacenan en buffer ni se otorga acceso aleatorio a los datos de un dispositivo. El núcleo escribe datos o lee datos de un dispositivo de caracteres de 1 byte a la vez. Entre los ejemplos de dispositivos de caracteres se incluyen teclados, ratones, terminales, pseudoterminales y unidades de cinta. tty0 y tty1 son archivos de dispositivos de caracteres que corresponden a dispositivos de terminal para que los usuarios puedan iniciar sesión desde terminales serie o emuladores de terminal.

Dispositivos de caracteres pseudoterminales

Los dispositivos secundarios pseudoterminales emulan dispositivos terminales reales para que puedan interactuar con el software. Por ejemplo, un usuario puede iniciar sesión en un dispositivo terminal, como /dev/tty1, que luego utiliza el dispositivo primario pseudoterminal, /dev/pts/ptmx, para interactuar con un dispositivo pseudoterminal subyacente. Los archivos de dispositivos de caracteres para dispositivos secundarios y principales pseudoterminales se encuentran en el directorio /dev/pts, como se muestra en el siguiente ejemplo:

ls -l /dev/pts
total 0
crw--w----. 1 guest tty  136, 0 Mar 17 10:11 0
crw--w----. 1 guest tty  136, 1 Mar 17 10:53 1
crw--w----. 1 guest tty  136, 2 Mar 17 10:11 2
c---------. 1 root  root   5, 2 Mar 17 08:16 ptmx

Algunas entradas de dispositivo, como stdin para la entrada estándar, se enlazan simbólicamente mediante el subdirectorio self del sistema de archivos proc. El archivo de dispositivo pseudoterminal al que apuntan depende del contexto del proceso.

ls -l /proc/self/fd/[012]
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/0 -> /dev/pts/0
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/1 -> /dev/pts/0
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/2 -> /dev/pts/0

Dispositivos de caracteres nulos, aleatorios, urandom y cero

Los dispositivos de caracteres, como null, random, urandom y zero, son ejemplos de pseudodispositivos que proporcionan acceso a la funcionalidad virtual implementada en el software en lugar de a hardware físico.

/dev/null es un sumidero de datos. Los datos que escribe en /dev/null desaparecen efectivamente, pero la operación de escritura se realiza correctamente. La lectura de /dev/null devuelve EOF (final de archivo).

/dev/zero es un origen de datos de un número ilimitado de bytes de 0 valores.

/dev/random y /dev/urandom son orígenes de datos de flujos de bytes pseudoaleatorios. Para mantener una salida de alta entropía, /dev/random bloquea si su pool de entropía no contiene suficientes bits de ruido. /dev/urandom no bloquea y, por lo tanto, la entropía de su salida puede no ser tan alta como la de /dev/random. Sin embargo, ni /dev/random ni /dev/urandom se consideran lo suficientemente aleatorios para fines de criptografía segura, como el cifrado de grado militar.

Puede averiguar el tamaño del pool de entropía y el valor de entropía para /dev/random desde archivos virtuales en /proc/sys/kernel/random:

cat /proc/sys/kernel/random/poolsize
4096
cat /proc/sys/kernel/random/entropy_avail
3467

Para obtener más información, consulte las páginas del manual null(4), pts(4) y random(4).