Bienvenido a la wiki dedicada a los usuarios nuevos en GNU/Linux, este sitio esta orientado a ayudar a los usuarios nuevos... Si deseas contribuir, por favor crate una cuenta.

Udev

De PUFs Wiki

En Unix y Linux todos los dispositivos se encuentran bajo /dev, lo cual tiene muchas ventajas, pero también plantea nuevos problemas que hay que resolver. Es aquí donde entra udev para administrar este directorio tan importante.

Tabla de contenidos


[editar] Conceptos de Dispositivos

En Unix y Linux en particular, todos los dispositivos se manejan como archivos ( a excepción de la placa de red ), de manera que todos los archivos en /dev corresponden a algún dispositivo. Cada uno de estos archivos contiene una serie de datos que identifican al dispositivo:

  • El Número Mayor de Dispositivo: Identifica una clase de dispositivos, por ej: Disco IDE 1, Disco SATA 2, Placas de Sonido, etc
  • El Múmero Menor de Dispositivo: Identifica un dispositivo en particular dentro de una clase, por ej: Partición 1, Partición 3, Mezclador, Sintetizador, etc.

Entonces, un archivo con el número de dispositivo mayor 12 y el menor 13 hace referencia al mismo dispositivo independientemente de como se llame, se podría llamar /dev/pepe o /dev/sd2h3b34c2 que no habría diferencia.

Dentro de Unix los dispositivos se clasifican en dos grandes grupos, dispositivos de bloques y de caracteres:

  • Dispositivos de Bloques: Son dispositivos a los que se accede en unidades llamdas bloques, además se puede retroceder, avanzar y leer o escribir en cualquier lugar del dispositivo, ya que cada bloque tiene asignada una dirección dentro del dispositivo. Ejemplos: Discos rígidos, memorias, etc.
  • Dispositivos de Caracteres: Son dispositivos a los que se accede de manera secuencial, cuando se lee o se escribe no se elige el lugar donde se lo hace y por lo general se lee y se escribe en unidades chicas como el byte. Ejemplos: Placa de sonida, Unidad de cinta magnética, etc.

Además los dispositivos por bloques están sometidos a una caché, en cambio los dispositivos de caracteres no. Esto es lógico, ya que tiene sentido tratar de acelerar la lectura/escritura en un dispositivo por bloques como el disco rígido, pero no tiene sentido hacerlo para la placa de sonido, cuando uno reproduce un sonido quiere acerlo en el momento, no que el sistema operativo decida cuando es el mejor momento de decirle a la placa de sonido que lo reproduzca.


[editar] /dev Estático

Originalmente el directorio /dev era estático, esto quiere decir que este directorio contenía todos los archivos de dispositivos habidos y por haber. Esto es malo por varias razones, pero hay dos en particular que son muy importantes:

  • Í-Nodos: Al ser un directorio estático con una gran cantidad de archivos se desperdician montones de í-nodos que quizás nunca sean accedidos.
  • Números de Dispositivos Fijos: Como todos los números de dispositivos ya están asignados se pierde la capacidad de asignar números de dispositivos de manera dinámica, esto en un sistema pequeño puede no ser problema, pero un servidor con muchos dispositivos se puede quedar rapidamente sin números disponibles aún cuando quizás más de la mitad de esos números no estén en uso.


[editar] /dev Dinámico

Eran evidentes las principales desventajas de un manejo estático del directorio de dispositivos, es por eso que a alguien se le ocurrió la idea de hacerlo dinámico, es decir, de actualizarlo a medida que los dispositivos se detectan en el sistema. Esto trae grandes ventajas:

  • Í-Nodos: El uso de í-nodos es óptimo ya que solamente se utilizan la cantidad de necesaria de archivos para representar todos los dispositivos en el sistema.
  • Números de Dispositivos: Ahora pueden ser dinámicos, es decir, en dos sesiones diferentes dos dispositivos diferentes pueden tener el mismo número de dispositivo, de modo que el espacio disponible para los números de dispositivos se distribuye de manera óptima entre los dispositivos presentes en el sistema
  • Dispositivos Removibles: Cuando pensamos en medios removibles tenemos la gran ventaja de que estos pueden crear y borrar sus archivos de dispositivos al ser insertados y removidos, reduciendo más aún la cantidad de í-nodos utilizados, además siempre se van a poder adaptar a la carga de números de dispositivos que tengamos ya que estos son dinámicos.


[editar] DevFS

Linux 2.4 utilizaba una solución en el kernel llamada devfs, la principal desventaja que tenía es que era poco flexible, ya que leer un archivo de configuración desde el kernel puede ser una tarea peligrosa. Además, desarrollar en el kernel siempre es más dificil que desarrollar en espacio de usuario donde la reutilización de código es abundante y las herramientas de depuración son eficientes. Una de las críticas a devfs es que el nombre que le daba a los dispositivos bajo /dev era horrible y no era compatible con las anteriores versiones de Linux.

FreeBSD utiliza un sistema similar a este.


[editar] udev

A partir de Linux 2.6 se transfirió el manejo de los dispositivos al espacio de usuario, con todas las mejoras que esto implica. Al programa encargado del manejo de los dispositivos se lo llamó udev. Seguro que si buscan en su lista de procesos encontrarán uno con el nombre udevd (udev daemon). Además udev utiliza un disco en memoria RAM montado sobre /dev, lo cual nos ahorra todos los í-nodos que este sistema de archivos podría usar, ya que ahora se encuentra en memoria RAM.

[editar] Configuración

Udev utiliza el archivo de configuración /etc/udev/udev.conf, un archivo de ejemplo sería:

udev_root="/dev/"
udev_rules="/etc/udev/rules.d/"
udev_log="err"
tmpfs_size="10M"

Describiendo línea a línea:

  1. Especifica dónde crear los archivos de dispositivos, si queremos sobrevivir dejémoslo en /dev/.
  2. Especifica en que directorio se encuentra los archivos con las reglas.
  3. Especifica la prioridad syslog para el registro de mensajes.
  4. Especifica la cantidad de memoria a utilizar para el disco en memoria RAM.

En este ejemplo el disco en RAM tiene un límite superior de 10 MB, lo cual es mucho teniendo en cuenta que el comando df nos dice:

# df /dev
S.ficheros         Bloques de 1K   Usado    Dispon Uso% Montado en
udev                     10240        72     10168   1% /dev

evidentemente podríamos bajar el límite a 1MB sin problemas, esto lo haríamos reemplazando la línea correspondiente por:

tmpfs_size="1M"

[editar] Reglas

Uno de las grandes características de udev es la flexibilidad, ya que dentro del directorio /etc/udev/rules.d/ se encuentra una lista de archivos con reglas. Los archivos se leen en orden alfabético, de modo que el archivo 99zzz.rules (deben terminar en .rules) se lee al último, pero es importante destacar que udev no termina con la primer regla que encuentra, ya que un mismo dispositivo puede obedecer a varias reglas sin problemas; sin embargo hay ciertas acciones que solamente se pueden ejecutar una única vez, en este caso solamente se realizará lo que dice la primer regla.

El objetivo de las reglas es que nosotros podamos decidir como va a reaccionar el sistema cuando se detecte un dispositivo en particular, por ejemplo, podemos lograr que al detectar nuestra memoria FLASH USB de 512MB Kingston cree un archivo de dispositivo llamado /dev/512MBKingston, y ahora ya no importa el conector ni el orden en el que se conecte nuestra memoria ese archivo de dispositivo siempre estará allí cuando nuestra memoria esté conectada. También podemos lograr que se ejecuten los programas/scripts/comandos que queramos al instertar la memoria, pero esto no es recomendable, en su lugar es preferible un cliente DBUS que escuche los eventos que reporte HAL.

Las reglas son muy sencillas de fabricar, no pueden extenderse a más de una línea y las líneas que comiencen con el símbolo # son comentarios. Veamos un sencillo ejemplo: Supongamos que tenemos nuestra memoria FLASH USB y queremos que siempre se cree un archivo de dispositivo llamado /dev/512MBKingston. Lo primero que hay que saber es que udev crea un solo archivo de dispositivo, el resto son enlaces simbólicos, por lo cual dejaremos que udev cree el archivo de dispositivo que se le cante y nuestro archivo será un enlace simbólico.

Primero insertamos la memoria en el puerto USB y luego utilizamos el siguiente comando:

# udevinfo -a -p /sys/block/sdb/sdb1

suponiendo desde luego que /dev/sdb1 es el dispositivo que utilizamos para montar la memoria FLASH. Este comando nos arroja mucha información, entre la cual he rescatado la siguiente:

SUBSYSTEMS=="usb"
ATTRS{idProduct}=="6533
ATTRS{idVendor}=="0930"

Luego creamos el archivo /etc/udev/rules.d/99-kingston.rules con el siguiente contenido

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="6533", SYMLINK+="512MBKingston"

y listo, ahora solo nos resta probarlo, para ello quitamos e introducimos nuevamente la memoria FLASH y vemos efectivamente que ahora tenemos el enlace simbólico que queríamos.


[editar] Problemas

Lamentablemente hay un problema, y este ocurre durante el arranque, cuando aún no está montado el disco en RAM bajo /dev y udevd no se está ejecutando. En ese momento Linux solamente tiene acceso al contenido real del directorio /dev, el cual está vacío, pero hay scripts de inicio que requieren de los dispositivos /dev/console y /dev/null. La solución es crearlos a mano con el comando mknod, para eso realizamos la siguiente secuencia de comandos:

# mount -o bind / /mnt/algun_lugar
# cd /mnt/algun_lugar/dev
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3
# cd /
# umount /mnt/algun_lugar

Con el comando mount le decimos que queremos acceder al directorio raíz mediante el directorio /mnt/algun_lugar, pero esto es solamente el directorio raíz, sin ninguno de sus sistemas de archivo montados, por lo cual, cuando accedemos al directorio /mnt/algun_lugar/dev estamos accediendo a nuestro directorio /dev real. Ahora podemos borrar todos los archivos que hay ahí sin problemas y crear los archivos console y null para solucionar cualquier posible problema.


[editar] devpts

Es bien sabido que en modo texto siempre accedemos al sistema a través de una terminal (por ejemplo: tty1), pero cuando utilizamos un emulador de terminal bajo X11 la cosa cambia un poquito. En este caso se utilizan las pseudo terminales, para las cuales hay dos estándares, el viejo BSD y el nuevo Unix98. Linux es capaz de utilizar ambos, pero es sumamente recomendable que utilizemos pseudo terminales estilo Unix98.

Las archivos de dispositivos de las pseudo terminales Unix98 residen bajo /dev/pts. Pero este directorio está vacío en un principio ya que los archivos se van creando a medida que se necesiten, para ello existe un sistema de archivos especial montado en ese directorio, el cual lo pueden ver ejecutando el comando mount:

devpts on /dev/pts type devpts (rw,nosuid,noexec)

En caso de no tenerlo debemos asegurarnos que nuestro kernel soporte pseudo terminales estilo Unix98 y que nuestra distribución esté montando el directorio adecuadamente, en caso de que nuestra distribución no lo haga podemos agregar una línea al fstab:

devpts /dev/pts devpts rw,nosuid,noexec,auto 0 0

También vale remarcar que ssh, telnet y otros sistemas similares utilizan las pseudo terminales.


[editar] mknod

Hay veces que podemos tener la necesidad de crear nuestros propios archivos de dispositivos, si bien las razones para hacerlo son cada vez menores puede resultarnos útil alguna vez (ver la sección de problemas arriba).

Este comando es muy sencillo de utilizar y se utiliza de una se las siguientes maneras:

  1. mknod [-m modo] nombre {bc} mayor menor
  2. mknod [-m modo] nombre p

de la primera manera estamos creando un archivo de dispositivo de nombre nombre con números de dispositivo mayor y menor. La letra b y c deciden si es un dispositivo por bloques o caracteres respectivamente, ej:

# mknod null c 1 3

este comando crea un archivo de dispositivo caracter de nombre null con números de dispositivo 1 y 3.

La segunda forma del comando sirve para crear FIFOs (First In First Out) y rara vez lo necesitaremos. Un FIFO sirve para que dos procesos se comuniquen entre si, es similar a una tubería cuando uno concatena comandos, nada más que el FIFO tiene un archivo que lo representa.

La opción -m modo sirve para establecer los permisos del archivo en el momento de creación, ej:

# mknod -m 660 fifo p
# ls -l fifo
prw-rw---- 1 root root 0 jun  9 18:25 fifo


[editar] Recursos

ata_id               (8)  - udev callout to read product/serial number from ATA drives
cdrom_id             (8)  - udev callout to determine the capabilities of cd/dvd drives
dasd_id              (8)  - udev callout to read label from s390 block device
edd_id               (8)  - udev callout to identify BIOS disk drives via EDD
udev                 (7)  - dynamic device management
udevd                (8)  - event managing daemon
udevinfo             (8)  - query device information from the udev database
udevinfo             (8)  - query udev device information
udevmonitor          (8)  - print the kernel and udev event sequence to the console
udevsend             (8)  - send the current environment to the udev daemon
udevsettle           (8)  - wait until queued kernel/udev events are handled
udevstart            (8)  - populate initial device directory
udevtest             (8)  - simulate a udev run and print the action to the console
udevtrigger          (8)  - request kernel devices events for coldplug
Herramientas personales