Comprensión / dev y sus subdirecciones y archivos

53
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Me preguntaba si todos los archivos /devy sus subdirectorios son todos descriptores de archivos de dispositivos.
  2. ¿Por qué hay tantos enlaces entre sí? Por ejemplo, /dev/fd/0, /dev/stdin, /proc/self/fd/0son todos los enlaces a /dev/pts/2.
  3. Si len lrwx------el enlace medio, ¿qué significa cen crw--w---- ?
Tim
fuente
3
Y para responder # 3, la c significa dispositivo de caracteres, o carácter especial . b significa bloque especial .
felixphew

Respuestas:

79

Casi todos los archivos debajo /devson archivos de dispositivo . Mientras que leer y escribir en un archivo normal almacena datos en un disco u otro sistema de archivos, el acceso a un archivo de dispositivo se comunica con un controlador en el núcleo, 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 (indicados por bcomo el primer carácter en la salida de ls -l) y dispositivos de caracteres (indicados por c). La distinción entre bloque y dispositivos de caracteres no es completamente universal. Los dispositivos de bloque son cosas como discos, que se comportan como archivos grandes de tamaño fijo: si escribe un byte en un cierto desplazamiento, y luego lee desde el dispositivo en ese desplazamiento, recupera ese byte. Los dispositivos de caracteres son casi cualquier otra cosa, donde escribir un byte tiene algún efecto inmediato (por ejemplo, se emite en una línea en serie) y leer un byte también tiene algún efecto inmediato (por ejemplo, se lee desde el puerto en 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 núcleo). El número es en realidad dos números: el número principal indica qué controlador es responsable de este dispositivo, y el número menor permite que un controlador maneje varios dispositivos¹. Estos números aparecen en la ls -llista, donde normalmente encontrará el tamaño del archivo. Por ejemplo, brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ este dispositivo es mayor 8, menor 0.

Algunos archivos de dispositivos /devno corresponden a dispositivos de hardware. Uno que existe en cada sistema 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 e infinito ) /dev/urandom(que devuelve bytes aleatorios e infinito ).

Algunos archivos de dispositivo tienen un significado que depende del proceso que accede a él. Por ejemplo, /dev/stdindesigna 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. De manera similar, /dev/ttydesigna el terminal al que está conectado el proceso. En Linux, hoy en día, /dev/stdiny los 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 (en lugar de solo 0, 1 y 2 según el método tradicional); por ejemplo /dev/stdines 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/scd0es un enlace simbólico a /dev/sr0Linux; ambos designan el primer dispositivo de CD. Otra razón para enlaces simbólicos es la organización: en Linux, encontrará los discos duros y particiones en varios lugares: /dev/sday /dev/sda1y amigos (cada disco designado por una carta arbitraria, y las particiones de acuerdo con la distribución de la partición), /dev/disk/by-id/*(discos designados por una 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 usan cuando un nombre de dispositivo genérico puede ser uno de varios; por ejemplo/dev/dvdpodría ser un enlace simbólico /dev/sr0o podría ser un enlace /dev/sr1si tiene dos lectores de CD y el segundo es el lector de DVD predeterminado.

Finalmente, hay algunos otros archivos que puede encontrar /dev, por razones tradicionales. No encontrará lo mismo en todos los sistemas. En la mayoría de los dispositivos, /dev/loges un socket que los programas usan para emitir mensajes de registro. /dev/MAKEDEVes un script que crea entradas en /dev. En los sistemas Linux modernos, las entradas en /dev/son creadas automáticamente por udev , obsoletas MAKEDEV.

¹ Esto ya no es cierto en Linux, pero este detalle solo es importante para los escritores de controladores de dispositivos.

Gilles 'SO- deja de ser malvado'
fuente
¡Gracias! Por "El significado de un archivo de dispositivo está determinado por su número", ¿quiere decir su descriptor de archivo?
Tim
@Tim: No, los números aparecen en la ls -llista donde normalmente encuentra el tamaño del archivo, antes de la fecha, por ejemplo, brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ este dispositivo es mayor 8, menor 0. Los números de dispositivo no aparecen con frecuencia en la práctica, solo los mencioné para decir lo que hace que un dispositivo sea un dispositivo (lo más importante, no es el nombre del archivo). Un número de descriptor de archivo solo tiene un significado en un proceso particular.
Gilles 'SO- deja de ser malvado'
No, abrir /dev/stdin(=> /proc/self/fd/0) en Linux no tiene el mismo efecto que duplicar la entrada estándar. Para ver la diferencia, su - non_root_userentonces exec 5</dev/stdinfallará con "Permiso denegado", pero exec 5<&0tendrá éxito. Y no es sólo que el nuevo fd se abrirá con diferentes banderas, todo lo relacionado con el objeto de archivo ( "descrip archivo abierto ción " en la jerga de POSIX) será diferente (archivo puntero de desplazamiento / modo, no bloqueo, etc).
mosvy
14
  1. Sí, ya sea directamente o como enlaces simbólicos, para eso está /dev/.
  2. Para diversos fines: a veces para la compatibilidad entre esquemas de nombres, a veces es necesario para el entorno de trabajo, como en el ejemplo de /dev/stdin. Esto no apunta estáticamente a /dev/pts/2ningún otro, simplemente cambie a otro terminal y verá. /dev/stdines la entrada estándar de su sesión de terminal actual . Ese también es un ejemplo de por qué debe ser un enlace simbólico.
  3. Ver man mknody info coreutils 'mknod invocation'. En general, csignifica un tipo de dispositivo de personaje.
rozcietrzewiacz
fuente
3
La "entrada estándar de su sesión de terminal actual" es un poco ambigua. /dev/stdinse refiere a la entrada estándar del proceso que lo abrirá. Todo /proc/$pidlo que contiene son datos dependientes del proceso, y /proc/selfes una especie de enlace mágico que apunta a los datos del proceso.
Stéphane Gimenez
11

Para su primera pregunta, no son descriptores de archivo, 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 lssalida se refiere al controlador del dispositivo vinculado al número mayor 136, y especifica el dispositivo # 2 manejado por ese controlador).

La primera letra de salida ls -les el tipo de dispositivo en el caso de los archivos del 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.

mentes dirigentes
fuente
1
El enlace "Introducción a los controladores de dispositivos" parece estar roto.
Slothworks