¿Qué es el directorio /dev?

Visión general

El directorio /dev en sistemas basados en Unix (como Linux) contiene archivos especiales que representan dispositivos de hardware y otros recursos del sistema. Debemos considerar que prácticamente a todos los dispositivos de hardware, el sistema operativo los accede desde este directorio. 

Los subdirectorios del directorio /dev se generan dinámicamente como parte de la inicialización del sistema. Este proceso ocurre después de que el núcleo del sistema operativo se haya cargado en la memoria durante la fase inicial del arranque, pero antes de que se complete la secuencia de arranque y el sistema esté completamente funcional.

El proceso exacto de generación de los subdirectorios en /dev puede variar ligeramente según la distribución de Linux y la configuración específica del sistema. Sin embargo, generalmente implica la ejecución de udev (Administrador de dispositivos del sistema) o un servicio similar. udev es responsable de administrar los dispositivos y sus nodos de dispositivo asociados en el sistema Linux. Durante el arranque, udev escanea el hardware del sistema, detecta los dispositivos presentes y crea dinámicamente los nodos de dispositivo correspondientes en el directorio /dev.

El antecesor directo de udev en Linux fue el subsistema devfs (Sistema de archivos de dispositivo), que fue introducido en el kernel de Linux alrededor del año 2000. devfs fue un intento inicial de proporcionar un sistema de archivos virtual para dispositivos en Linux, que asignaba automáticamente los nodos de dispositivo en el directorio /dev en función de los dispositivos presentes en el sistema en tiempo de ejecución.

Sin embargo, devfs tenía algunas limitaciones y problemas de diseño, lo que llevó al desarrollo de udev como su reemplazo. udev se introdujo en el kernel de Linux alrededor del año 2003 como parte del proyecto de Linux-hotplug. A partir de Linux kernel 2.6, udev se convirtió en el enfoque estándar para la gestión dinámica de dispositivos en sistemas Linux, reemplazando gradualmente a devfs.

udev ofrece una serie de ventajas sobre devfs, incluida una mejor integración con el sistema de inicio y una mayor flexibilidad para la administración de dispositivos. También proporciona reglas de configuración flexibles que permiten a los administradores personalizar la asignación de nombres de dispositivos y otras configuraciones relacionadas con los dispositivos. En consecuencia, udev se ha convertido en el estándar de facto para la administración dinámica de dispositivos en sistemas Linux modernos.

Los podemos agrupar según su tipo en:

  1. Dispositivos de bloque:
    • Representan dispositivos de almacenamiento de datos, como discos duros, unidades USB y particiones de disco.
    • Cada bloque es como una cajita, o unidad mínima de almacenaje, en donde se guardan los diferentes pedacitos que constituyen un archivo. Cuando abrís ese archivo, el sistema busca todos los bloques que contienen esos pedazos de información, los une y así reconstruye el archivo completo.
    • Un dispositivo de bloques como un disco duro o una memoria USB es un espacio organizado en bloques en donde el sistema puede almacenar y encontrar los datos de manera ordenada y rápida.
    • Características principales: Tratan los datos como bloques y admiten operaciones de lectura y escritura.
    • Puntos importantes (ampliados más abajo):
      • Los dispositivos de bloque SCSI se identifican con nombres como /dev/sda (para discos) o /dev/sda1… (para particiones).
      • Para discos de estado sólido NVME normalmente se los identifica con /dev/nvme0n1   (para discos) y  /dev/nvme0n1p1 … (para particiones)
      • Los dispositivos lógicos de bloque se identifican a través de /dev/mapper/…..
  2. Dispositivos de caracteres:
    • Representan dispositivos de entrada/salida que manejan datos de forma secuencial, como puertos serie, tarjetas de sonido y ratones.
    • Características principales: Tratan los datos como caracteres y admiten operaciones de lectura y escritura.
    • Puntos importantes:
      • Los dispositivos de caracteres se identifican con nombres como /dev/ttyS0 (para el primer puerto serie)
      • Los dispositivos de audio /dev/audio<n> son gestionados por el kernel de Linux y son utilizados por aplicaciones y herramientas de software para interactuar con dispositivos de audio, permitiendo la grabación de audio, o flujos de sonido para el streaming.
      • Los dispositivos de video /dev/video<n> son gestionados por el kernel de Linux y son utilizados por aplicaciones y herramientas de software para interactuar con dispositivos de video, permitiendo la captura de video, la visualización en tiempo real y otras operaciones relacionadas con el video.Por ejemplo, aplicaciones como programas de videollamadas, software de grabación de video y herramientas de edición de video pueden utilizar estos dispositivos para acceder a las fuentes de video disponibles en el sistema y realizar operaciones sobre ellas.
  3. Pseudo-dispositivos:
    • Representan recursos virtuales del sistema, como consolas virtuales, pseudo-terminales y memorias compartidas.
    • Características principales: No están asociados directamente con hardware físico, sino que son proporcionados por el kernel del sistema operativo.
    • Puntos importantes:
      • Los pseudo-dispositivos incluyen nombres como /dev/ptmx (para pseudo-terminales maestros) y /dev/null (para un dispositivo de descarte).
  4. Otros dispositivos:
    • Además de los dispositivos de bloque, de caracteres y pseudo-dispositivos, el directorio /dev puede contener otros tipos de dispositivos, como dispositivos de red (/dev/net), dispositivos de control de acceso (/dev/rtc), y más.

¿Qué debo saber para una instalación acerca de los dispositivos de bloques?

Es muy importante conocer este directorio para entender donde estamos instalando el sistema operativo. Cualquier dispositivo de bloques, sea permanente o temporario como un penddrive, tiene su referencia en términos de «bloques» en /dev .

Algunas herramientas de bajo nivel como fdisk, fsck, etc pueden acceder directamente los dispositivos desde /dev .

La gran mayoría de las aplicaciones no acceden directamente a los bloques sino que lo hacen a través de un intermediario que organiza esos bloques que es un filesystem (btrfs, ext4, ntfs, fat, xfs, f2fs, reiserfs). Para hacer esto se realiza una operación que es «montarlo» en un directorio o carpeta, preferentemente vacío, de la jerarquía del filesytem de unix (hfs)

Cuando realizamos una instalación debemos identificar claramente qué es un disco y qué es una partición de ese disco.

En general el sector de booteo (grub-install) se instala en un «disco», y el resto del sistema operativo distribuido en una o más «particiones».

Sector de booteo

Típicamente instalaremos el sector de booteo (Master Boot Record) en un disco, en general el primero que tenemos instalado. Las BIOS de las computadoras buscan esta información en el momento en que se enciende y este código es el que le indica como debe seguir el booteo.

  • Si nuestro equipo posee discos SCSI, este dispositivo podrá ser: /dev/sda o /dev/sdb . Estos discos haran referencia a primera o segunda controladora/conexión SCSI
  • Si nuestro equipo posee discos M2 de estado sólido, este dispositivo será /dev/nvme0n1. Este dispositivo hace referencia al primer disco del primer slot M2/nvme para discos sólidos
  • Si nuestro equipo aún posee discos ide, entonces este dispositivo podrá ser /dev/hda o /dev/hdb haciendo referencia así a la primera o a la segunda controladora/conexión IDE

Instalación de los archivos del OS

El sistema operativo lo instalaremos en alguna de las particiones de estos discos.

  • /dev/sda1 o /dev/sda2 : serán la primera o segunda partición conexión SCSI
  • /dev/nvme0n1p1 : Si nuestro equipo posee discos M2 de estado sólido, este dispositivo hará referencia a la primera partición del primer disco, del primer slot M2 para discos sólidos
  • /dev/hda1 : Si nuestro equipo aún posee discos ide, entonces este dispositivo hace referencia a la primera partición del primer disco/conexión IDE
  • /dev/vda1 : Si el disco es un disco virtual tipo qcow o similar.

Uso de Linux Volume Manager (LVM) y Linux Unified Key Setup (Luks/Crypsetup)

Cuando utilicemos particiones o discos a partir de Linux Volume Manager (LVM) o discos encriptados (crypsetup), esas particiones colgarán típicamente de /dev/mapper , lo que nos da una idea de que hay una capa más intermedia entre el «filesystem» y los bloques del hardware. El acceso de todo el sistema se realiza a través de esa capa intermedia que mapea el FS a los sectores del disco. Ambas capas de traducción son muy veloces y eficientes en Linux. En una máquina normal contemporánea el overhead que implica cualquera de estas capas, o incluso las dos juntas, es ínfimo e imperceptible en relación a los beneficios que brinda.

  • /dev/mapper/LVM1-ROOT : En este caso se trata de una partición creada a partir de LVM, del grupo de volúmenes LVM1 que ha sido etiquetada como ROOT.
  • /dev/mapper/LVM1-HOME_crypt : en este caso este device identifica a una partición de LVM que pertenece al grupo de volúmenes LVM1, ha sido etiquetada como HOME, y a la cual se le ha aplicado encripción con crypsetup
  • /dev/mapper/nvme0n1p3_crypt : Esta puede ser la referencia a la tercera partición del primer disco M2/nvme que ha sido encriptada con cryptsetup

Uso de RAIDs de software (Mdadm)

Otra opción que podemos utilizar en Linux muy para configurar nuestros discos para mayor performance y/o redundancia es crear RAIDs de software. Ello se hace con el utilitario mdadm y nos permite configurar los niveles más comunes de RAID: 0, 1, 5, 1+0, etc. En ese caso los RAID configurados se identificarán de la siguiente manera

  • /dev/md0 : Hace referencia al primer RAID creado con mdadm

¿Para que me sirven los UUID de los dispositivos de bloque?

Cuando montamos una partición en un directorio, preferentemente vacío, de la jerarquía del filesytem (HFS), estaremos haciendo accesible la información de un dispositivo de bloques a través de la capa de filesytem (btrfs, ext4, xfs, f2fs) para todas las aplicaciones del sistema.

Como dijimos más arriba, el directorio /dev se genera dinámicamente. Con lo cual tenemos que tener mucho cuidado cuando usamos estas denominaciones en archivos persistentes como /etc/fstab , ya que con el simple agregado de un disco o cambio en la conexión, los nombres con los que se identifican cambian. Un /dev/sda1 fácilmente puede convertirse en un /dev/sdc1 , etc.

Para resolver ese problema existe lo que se llama el UUID del dispositivo de bloques. Este identificador único se crea cuando formateamos la partición y no se modifica por más que agreguemos discos o los conectemos a distintas controladores. Es una práctica recomendada para el archivo /etc/fstab utilizar estos id y no los directorios /dev directamente. Con el comando blkid listamos todos los bloques y a que dispositivo están asociados en la configuración actual

root@UTNDiploMaddogTexto:~# blkid
/dev/vdd: UUID="b3f023aa-4509-4e31-94a1-33dde2ad9220" UUID_SUB="fc1e1b21-c9fc-49e4-95e1-8e4b4e0bfecf" BLOCK_SIZE="4096" TYPE="btrfs"
/dev/vdb: UUID="b3f023aa-4509-4e31-94a1-33dde2ad9220" UUID_SUB="89f1e0e4-80ed-43ed-b345-d5ae080f2c4b" BLOCK_SIZE="4096"  TYPE="btrfs"
/dev/vde1: UUID="e9516914-1aa3-4d36-8397-c4cb60becb89" BLOCK_SIZE="4096" TYPE="ext3" PARTUUID="e49bf035-01"
/dev/vde2: UUID="3551437e-979b-4981-a753-6d40577761e2" BLOCK_SIZE="4096" TYPE="ext3" PARTUUID="e49bf035-02"
/dev/vdc: UUID="b3f023aa-4509-4e31-94a1-33dde2ad9220" UUID_SUB="bca10024-d1fe-4845-b258-76898f7b9a4b" BLOCK_SIZE="4096" TYPE="btrfs"
/dev/vda5: UUID="d513206d-c4c4-47cc-a173-37d2fe15ac37" TYPE="swap" PARTUUID="84633245-05"
/dev/vda1: UUID="957e02b4-4c07-4f4d-8686-6c6631fddbec" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="84633245-01"

Para hacer referencia a estos UUID de partición en el montaje persistente (/etc/fstab) lo haremos de esta manera:


UUID=957e02b4-4c07-4f4d-8686-6c6631fddbec /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=d513206d-c4c4-47cc-a173-37d2fe15ac37 none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

# Estos son mis RAIDs:
#/dev/md0 					/backupenmirror	  ext4	 
UUID=3873ec0a-0785-4682-8fa0-192fe828c2a7 /backupenmirror ext4 defaults 0 0
defaults 0 0

#monto btrfs
UUID=b3f023aa-4509-4e31-94a1-33dde2ad9220   /usr/src btrfs defaults 0 0 

# pruebas de quota
UUID=e9516914-1aa3-4d36-8397-c4cb60becb89  /pruebaquota_user ext3 defaults,usrjquota=aquota.user,jqfmt=vfsv0 0 0
UUID=3551437e-979b-4981-a753-6d40577761e2  /pruebaquota_group ext3 defaults,grpjquota=aquota.group,jqfmt=vfsv0 0 0

De esta manera la identificación de los dispositivos de bloques para montar sobre la jerarquía de directorios será siempre unívoca y no necesitamos preocuparnos por donde estén conectados los discos o si se agregan o quitan discos.

Comentarios cerrados.