¿Cómo se crean los archivos "/dev" de Linux?

¿Cómo se crean los archivos "/dev" de Linux?

Hay archivos especiales en Linux que en realidad no son archivos.

Los ejemplos más notables y claros de estos se encuentran en la devcarpeta "archivos" como:

  • /dev/null- Ignora todo lo que escribas en el archivo.
  • /dev/random- Genera datos aleatorios en lugar del contenido de un archivo.
  • /dev/tcp- Envía cualquier dato que escriba en este archivo a través de la red.

En primer lugar, ¿cómo se llaman estos tipos de "archivos" que en realidad son una especie de script o binario disfrazado?

En segundo lugar, ¿cómo se crean? ¿Estos archivos están integrados en el sistema a nivel de kernel, o hay alguna manera de crear un "archivo mágico" usted mismo (qué tal un /dev/rickroll)?

Respuesta1

/dev/zeroes un ejemplo de un "archivo especial", en particular, un "nodo de dispositivo". Normalmente, estos se crean durante el proceso de instalación de la distribución, pero puedestotalmentecréelos usted mismo si lo desea.

Si preguntas lssobre /dev/zero:

# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5  Nov 5 09:34 /dev/zero

La "c" al principio le indica que se trata de un "dispositivo de carácter"; el otro tipo es "dispositivo de bloque" (impreso lscomo "b"). En términos generales, los dispositivos de acceso aleatorio, como los discos duros, tienden a ser dispositivos de bloqueo, mientras que los elementos secuenciales, como las unidades de cinta o la tarjeta de sonido, tienden a ser dispositivos de caracteres.

La parte "1, 5" es el "número de dispositivo principal" y el "número de dispositivo menor".

Con esta información, podemos usar el mknodcomando para crear nuestro propio nodo de dispositivo:

# mknod foobar c 1 5

Esto crea un nuevo archivo llamado foobar, en la carpeta actual, que noexactamentelo mismo que /dev/zero. (Por supuesto, puede establecer diferentes permisos si lo desea). Todo lo que realmente contiene este "archivo" son los tres elementos anteriores: tipo de dispositivo, número mayor, número menor. Puede utilizar lspara buscar códigos de otros dispositivos y recrearlos también. Cuando te aburras, simplemente úsalo rmpara eliminar los nodos del dispositivo que acabas de crear.

Básicamente, el número mayor le dice al kernel de Linux con qué controlador de dispositivo hablar, y el número menor le dice al controlador de dispositivo de qué dispositivo estás hablando. (Por ejemplo, probablemente tenga un controlador SATA, pero tal vez tenga varios discos duros conectados).

Si quieresinventarnuevos dispositivos que hacen algo nuevo... bueno, necesitarás editar el código fuente del kernel de Linux y compilar tu propio kernel personalizado. ¡Así que no hagamos eso! :-) Pero puedes agregar archivos de dispositivo que dupliquen los que ya tienes. Un sistema automatizado como udev básicamente solo observa los eventos del dispositivo y lo llama mknodautomáticamente rm. Nada más mágico que eso.

Todavía hayotrotipos de archivos especiales:

  • Linux considera que un directorio es un tipo especial de archivo. (Por lo general, no se puede abrir un directorio directamente, pero si pudiera, encontraría que es un archivo normal que contiene datos en un formato especial y le indica al núcleo dónde encontrar todos los archivos en ese directorio).

  • Un enlace simbólico es un archivo especial. (Pero un enlace físico no lo es). Puede crear enlaces simbólicos usando el ln -scomando. (Busque la página de manual para ello).

  • También hay algo llamado "canalización con nombre" o "FIFO" (cola de primero en entrar, primero en salir). Puedes crear uno con mkfifo. Un FIFO es un archivo mágico que puede abrirsedosprogramas a la vez: uno de lectura y otro de escritura. Cuando esto sucede, funciona como un tubo de concha normal. Pero puedes iniciar cada programa por separado...

Un archivo que no es "especial" de ninguna manera se llama "archivo normal". De vez en cuando verás una mención de esto en la documentación de Unix. Eso es lo que significa; un archivo que no es un nodo de dispositivo o un enlace simbólico o lo que sea. Sólo una lima normal, de uso diario, sin propiedades mágicas.

Respuesta2

La mayoría de las /deventradas son inodos de dispositivo de bloque o inodos de dispositivo de carácter.Wikipedia tiene muchos detalles.sobre eso, que no voy a repetir.

Pero /dev/tcplo que se menciona en su pregunta no se explica en ninguna de las respuestas existentes. /dev/tcpy /dev/udpson diferentes de la mayoría de las otras /deventradas. Los dispositivos de bloques y caracteres son implementados por el kernel, pero /dev/tcpse /dev/udpimplementan en modo de usuario.

El shell bash es un programa que tiene una implementación de /dev/tcpy /dev/udp(copiado de ksh93). Cuando intenta abrir una ruta debajo de aquellos con operadores de redirección bash, no realizará una openllamada al sistema normal. En su lugar, bash creará un socket TCP y lo conectará al puerto especificado.

Esto se implementa en modo usuario y solo en algunos programas como se puede ver en el siguiente ejemplo que demuestra la diferencia entre dejar bashe catintentar abrir./dev/tcp/::1/22

$ cat /dev/tcp/::1/22
cat: /dev/tcp/::1/22: No such file or directory
$ cat < /dev/tcp/::1/22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3

Una diferencia con ksh93es que bashsolo realizará aquellas conexiones TCP con operadores de redirección, no en otros lugares donde puede abrir archivos como el sourceo .incorporado.

Respuesta3

Además de los nodos de dispositivo explicados en otras respuestas (creados conmknod(2)o suministrado por algúndevfs), Linux tiene otros archivos "mágicos" proporcionados por especialessistemas de archivos virtuales, en particular en /proc/(verproceso(5), leer acerca deprocs) y en /sys/(leer sobresistemas).

Estos pseudoarchivos (que parecen, por ejemplo,estadística(2)- como archivos normales, no como dispositivos) son una vista virtual proporcionada por el kernel; en particular, leer de /proc/(por ejemplo, con cat /proc/$$/mapso porabierto(2)-ing /proc/self/statusen su programa) generalmente no implica ninguna E/S física desde el disco o la red, por lo que es bastante rápido.

Para crear algún pseudoarchivo adicional, /proc/generalmente debes escribir el tuyo propio.módulo del núcleoy cárguelo (ver por ejemploeste).

Respuesta4

Como otros usuarios ya han explicado con gran detalle, los archivos especiales requieren un código para realizar una copia de seguridad. Sin embargo, nadie parece haber mencionado que Linux proporciona varias formas de escribir ese código en el espacio de usuario:

A. FUSIBLE(Sistema de archivos en USErspace) le permite escribir algo así /procsin riesgo de fallar el kernel y hacerlo en un lenguaje/tiempo de ejecución de su elección, comoIr,Nodo.js,perla,PHP,Pitón, Rubí,Óxido,etc..

También tiene la ventaja de que los sistemas de archivos FUSE se pueden montar sin sudoporque se ejecutan cuando el usuario realiza el montaje.

Aquí hay algunos ejemplos de cosas que la gente ha escrito usando FUSE:

  • mp3fs(Vea sus archivos FLAC como archivos MP3 que se crean sobre la marcha cuando los copia/hace clic y los arrastra a su reproductor MP3)
  • PyTagsFS(Vea sus medios en un árbol de carpetas virtuales creado a partir de etiquetas de metadatos)
  • fusible-zip(Montar archivos Zip como carpetas)
  • FusibleISO(Montar ISO sin permisos de root)
  • iFUSIBLE(Montar iDevices)
  • FusibleDAV(Montar acciones WebDAV)
  • exfat-fusible(Montar sistemas de archivos con formato exFAT)
  • ntfs-3g(Elcontrolador NTFS de Linux)

B.Si desea crear un dispositivo de entrada virtual como un teclado, mouse, joystick, etc. (por ejemplo, para escribir un controlador de espacio de usuario para un dispositivo USB con el que está hablando libusb), existeentrada.

Los enlaces para ello son más difíciles de encontrar, pero sé que existen paraIr(solo teclado),Pitón, yRubí (2).

Ejemplos de uso de entradas en el mundo real incluyen:

  • demonio g15(Controlador de Linux para la pantalla LCD y las teclas de juego en los teclados para juegos Logitech G15)
  • ds4drv(Controlador para controladores Sony DualShock 4)
  • xboxdrv(Controlador de controlador alternativo XBox 360 y Linux equivalente ax360cejuegos tan mal diseñados comoRunner2: Futura leyenda del ritmo alienígenapueden pensar que están hablando con un controlador XBox real cuando no es así)
  • A los viejos conductores de Wiimote les gustacwiidque eran necesarios antes de que alguien finalmente escribiera un controlador Wiimote en el kernel para que el soporte estuviera disponible de forma predeterminada.

C.Para dispositivos de caracteres genéricos, hayCUSA(Dispositivos de personajes en USErspace). Aunque es mucho menos popular.

El único usuario de la API CUSE que conozco personalmente es el mismo programa que impulsó su creación:osspd, que implementa /dev/dsp, /dev/adspy /dev/mixer(la API de audio OSS) en el espacio de usuario para que puedan enrutarse a través de PulseAudio o dmix.

El único enlace CUSE que pude encontrar escuspy, que no se ha actualizado desde 2010.

D.Es posible que no necesite ningún archivo especial nuevo.

Por ejemplo, puede abrir una comunicación sin formato con cualquier dispositivo USB usandolibusb(Lista de enlaces en la página) y luego comunicarse con otros programas a través de algún otro mecanismo (sockets TCP/UDP, lectura/escritura stdin/stdout o archivos normales en el disco, etc.).

información relacionada