Casi todos los archivos bajo /dev
son archivos de dispositivo. Mientras que leer y escribir en un archivo normal almacena datos en un disco u otro sistema de archivos, acceder a un archivo de dispositivo se comunica con un controlador en el kernel, que generalmente a su vez se comunica con una pieza de hardware (un dispositivo de hardware, de ahí el nombre).
Hay dos tipos de archivos de dispositivo:dispositivos de bloque (indicado por b
como el primer carácter en la salida de ls -l
), y dispositivos de caracteres (indicados por c
). La distinción entre dispositivos de bloque y de carácter no es completamente universal. Los dispositivos de bloque son cosas como los discos, que se comportan como archivos grandes de tamaño fijo:si escribe un byte en un desplazamiento determinado y luego lee del dispositivo en ese desplazamiento, recupera ese byte. Los dispositivos de caracteres son prácticamente cualquier otra cosa, donde escribir un byte tiene un efecto inmediato (p. ej., se emite en una línea serie) y leer un byte también tiene un efecto inmediato (p. ej., se lee desde el puerto serie).
El significado de un archivo de dispositivo está determinado por su número, no por su nombre (el nombre es importante para las aplicaciones, pero no para el kernel). El número es en realidad dos números:el número mayor indica qué controlador es responsable de este dispositivo, y el número menor permite que un controlador controle varios dispositivos¹. Estos números aparecen en el ls -l
listado, donde normalmente encontraría el tamaño del archivo. P.ej. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ este dispositivo es mayor 8, menor 0.
Algunos archivos de dispositivos en /dev
no corresponden a dispositivos de hardware. Uno que existe en todos los sistemas Unix es /dev/null
; escribir en él no tiene ningún efecto, y leerlo nunca devuelve ningún dato. A menudo es conveniente en los scripts de shell, cuando desea ignorar la salida de un comando (>/dev/null
) o ejecutar un comando sin entrada (</dev/null
). Otros ejemplos comunes son /dev/zero
(que devuelve bytes nulos ad infinitum ) /dev/urandom
(que devuelve bytes aleatorios ad infinitum ).
Algunos archivos de dispositivo tienen un significado que depende del proceso que accede a ellos. Por ejemplo, /dev/stdin
designa la entrada estándar del proceso actual; abrir desde tiene aproximadamente el mismo efecto que abrir el archivo original que se abrió como entrada estándar del proceso. Algo similar, /dev/tty
designa el terminal al que está conectado el proceso. Bajo Linux, hoy en día, /dev/stdin
y amigos no se implementan como dispositivos de caracteres, sino como enlaces simbólicos a un mecanismo más general que permite hacer referencia a cada descriptor de archivo (a diferencia de solo 0, 1 y 2 en el método tradicional); por ejemplo /dev/stdin
es un enlace simbólico a /proc/self/fd/0
. Consulte ¿Cómo se relaciona /dev/fd con /proc/self/fd/?.
Encontrará una serie de enlaces simbólicos en /dev
. Esto puede ocurrir por razones históricas:un archivo de dispositivo se movió de un nombre a otro, pero algunas aplicaciones aún usan el nombre anterior. Por ejemplo, /dev/scd0
es un enlace simbólico a /dev/sr0
bajo Linux; ambos designan el primer dispositivo de CD. Otra razón para los enlaces simbólicos es la organización:en Linux, encontrará sus discos duros y particiones en varios lugares:/dev/sda
y /dev/sda1
y amigos (cada disco designado por una letra arbitraria y particiones de acuerdo con el diseño de la partición), /dev/disk/by-id/*
(discos designados por un número de serie único), /dev/disk/by-label/*
(particiones con un sistema de archivos, designado por una etiqueta elegida por humanos); y más. Los enlaces simbólicos también se utilizan cuando un nombre de dispositivo genérico puede ser uno de varios; por ejemplo /dev/dvd
podría ser un enlace simbólico a /dev/sr0
, o podría ser un enlace a /dev/sr1
si tiene dos lectores de CD y el segundo va a ser el lector de DVD predeterminado.
Finalmente, hay algunos otros archivos que puede encontrar en /dev
, por razones tradicionales. No encontrará lo mismo en todos los sistemas. En la mayoría de los unices, /dev/log
es un socket que los programas usan para emitir mensajes de registro. /dev/MAKEDEV
es un script que crea entradas en /dev
. En los sistemas Linux modernos, las entradas en /dev/
son creados automáticamente por udev, obsoletos MAKEDEV
.
¹ En realidad, esto ya no es cierto en Linux, pero este detalle solo es importante para los escritores de controladores de dispositivos.
- Sí, ya sea directamente o como enlaces simbólicos, eso es lo que
/dev/
es para. - Para varios propósitos:a veces por compatibilidad entre esquemas de nombres, a veces es necesario para el entorno de trabajo, como en el ejemplo de
/dev/stdin
. Esto no señalar estáticamente a/dev/pts/2
o cualquier otro, simplemente cambia a otro terminal y verás./dev/stdin
es la entrada estándar de su actual sesión terminal. Ese también es un ejemplo de por qué debe ser un enlace simbólico. - Ver
man mknod
yinfo coreutils 'mknod invocation'
. En general,c
representa un tipo de dispositivo de carácter.
Para su primera pregunta, no son descriptores de archivos, son archivos de dispositivo. (también conocido como "nodos de desarrollo")
Esos archivos están vinculados con el controlador que maneja el dispositivo usando números mayores y menores. (Por ejemplo, "136, 2" en su ls
la salida se refiere al controlador de dispositivo vinculado al número principal 136 y especifica el dispositivo #2 manejado por ese controlador).
La primera letra de salida de ls -l
es el tipo del dispositivo en el caso de archivos de dispositivo. Si es 'c' es un dispositivo de caracteres, o si es 'b', es un dispositivo de bloque.
Para su segunda pregunta, consulte la respuesta anterior de rozcietrzewiacz.