LPIC-1 101.1: dispositivos de bloques vs dispositivos de caracteres y más…

Dentro del LPIC-1 Tema 101.1, uno de los objetivos que se pide es diferenciar entre los disferentes tipos de dispositivos. Y eso es lo que trataremos en este primer tutorial práctico. Tener claro esta distinción es vital en sistemas de tipo UNIX, como Linux, ya que se diferencia entre estos dos grupos de dispositivos. Pero antes, deberías tener clara otra de las filosofías de UNIX y es que todo es un fichero.

En otros sistemas operativos, como Microsoft Windows, existen dispositivos, unidades (p.e.: C:, D:,…), pero en un entorno de tipo UNIX todo es un fichero, absolutamente todo. El sistema operativo entiende que un disco duro (/dev/sda) es un fichero en el que se puede escribir y leer, o que una impresora también lo es (/dev/lp1). Aquí no hay unidades ni nada por el estilo… Y todos esos dispositivos o, mejor dicho, ficheros, estarán dentro del directorio /dev (siempre y cuando nodev no lo permita jajaja).

¡Así de simple es Unix/Linux!

«UNIX is very simple, it just needs a genius to understand its simplicity.» (UNIX es muy simple, solo se necesita un genio para entender su simplicidad)

Dennis Ritchie

¿Qué ventajas tiene que todo sea un fichero? Muy simple, que podemos gestionar los dispositivos de hardware o dispositivos virtuales como si fuesen ficheros, usando las mismas herramientas, mientras que en otros SSOO se debe hacer de forma diferente. Aquí puedes listarlos con ls, ver su contenido con el concatenador cat, usar pipes o redirecciones para enviar información a ellos o desde ellos, etc. ¡SUPER ÚTIL!

Me gustaría que ahora abras un terminal o consola en tu sistema y ejecutes las siguientes órdenes:

cd /dev
ls -l

Ahora mira en la columna de la izquierda y verás que delante de los permisos hay una c (character) o una b (block), bueno, tienes razón, realmente verás que existen también algunos marcados como d (directory) y l (link) cuando son directorios o enlaces. Pero quiero que solo te centres en los dos primeros. Pues bien, todos esos son los dispositivos de caracteres o de bloques que tienes en tu sistema.

Si lo prefieres puedes usar también:

file /dev/sda
file /dev/ttyS0

¿Qué son los dispositivos c y b?

Los dispositivos de caracter son aquellos que usan comunicación (enviar o recibir datos) mediante simples caracteres (bytes u octetos). Ejemplos de dispositivos de caracteres los tenemos en los teclados, ratones, tarjetas de sonido, algunos puertos serie y paralelos, monitor, touchpad, tarjeta gráfica, etc., es decir, la mayoría de dispositivos de entrada y salida y más…

Por otro lado, los dispositivos de bloques son aquellos que la comunicación se realiza mediante bloques de datos, es decir, conjuntos de mayor tamaño que los caracteres. Estos dispositivos tienen capacidad de albergar una cache o buffer para los accesos, a diferencia de los de caracter que son ‘unbuffered’. Por cierto, el tamaño de bloque puede variar, puede ser de 512 B, 1024 B… a 4 KiB. Ejemplos de dispositivos de bloques son los discos duros (HDD, SSD, SSHD,…), medios de almacenamiento secundario como los pendrives, cámaras USB, etc. Ahh, y por si no lo sabías, la memoria principal o RAM, también se accede por bloques.

Para el usuario, si son de tipo c o b no importa, pero sí para el sistema operativo. Sí que les debe preocupar a los desarrolladores de drivers o controladores… Por tanto, cuando un programa lee o escribe datos en un dispositivo (oops! perdón, quería decir en un fichero), se le hará la petición mediante una syscall adecuada al kernel o más concretamente al driver y en función del tipo que sea actuará de un modo u otro:

  • Fichero regular: entonces los datos accedidos serán manejados por el controlador del FS (filesystem) que tengamos.
  • Fichero de dispositivo: es decir, cuando se trata de uno de esos ficheros especiales dentro de /dev, ya sea de tipo c o b, entonces los datos escritos o leídos serán gestionados por el controlador del dispositivo concreto. Por ejemplo, el controlador USB, el controlador SATA, el controlador de la impresora, etc. Eso se consigue mediante un número que asocia cada /dev/fichero con un controlador que se debe usar.

/dev y otros dispositivos:

Ya he dicho que /dev es el directorio donde se aglutinan los dispositivos de nuestro sistema. Dentro de los ficheros especiales o dispositivos c o b vamos a encontrar unos especialmente especiales 😉 que no se corresponden con dispositivos físicos reales de nuestra máquina, como por ejemplo /dev/random, /dev/urandom, /dev/tty, /dev/loop, /dev/null,…

Por cierto, a parte del atributo c o b, tal vez te llamó la atención cuando hiciste el ls -l /dev que hay una columna con unos números «raros». Se trata del número mayor y el número menor, otro de los atributos que tienen estos ficheros especiales. El número mayor identifica al controlador o driver del dispositivo, mientras que el menor identifica al propio dispositivo, además de la partición o número si existen varios dispositivos iguales.

De hecho, cuando usamos mknod para crear un dispositivo (esto lo dejaremos para lecciones futuras), hace falta especificar si es c o b, y además el major y minor number. Para ver el uso dinámico del número mayor asignado para los dispositivos, puedes verlo en:

cat /proc/devices

Volviendo al tema de los números mayores y menores de /dev, verás al listar los dispositivos que la primera columna se corresponde a los números mayores (1, 4, 7, 10,…), mientras que la segunda es el número menor (1, 3, 5, 64, 65,…). Lo comento porque también me han preguntado si los números mayores son siempre un valor superior a los menores, y no, no tiene nada que ver. Pueden ser incluso los mismos valores.

Dicho esto, vamos a ver un listado de los dispositivos más importantes que encontrarás en /dev:

/dev/audio Dispositivo referente a la tarjeta de sonido, más concretamente al secuenciador del sistema de audio. Si envías algo aquí escucharás un sonido por tus altavoces.
/dev/bus Buses del sistema.
/dev/cdrom Unidad óptica (CD, DVD, BD,…)
/dev/console Consola maestra. No es un dispositivo físico.
/dev/core Enlace a /proc/kcore, es decir, referente a la RAM.
/dev/cpu_dma_latency Control de los C-states de la CPU.
/dev/dsp Dispositivo de audio referente al procesador de señal digital o DSP.
/dev/dump Donde el kernel hace su dump en caso de Kernel Panic
/dev/eth Adaptador de red Ethernet (eth0, eth1,…). En caso de ser WiFi se puede llamar de otras formascomo wlp2s0, …
/dev/fd Para el Floppy Disc, es decir, la disquetera.
/dev/full Dispositivo no físico y similar a /dev/null y /dev/zero. Si lo lees siempre falla, si intentas escribir te devuelve error de dispositivo lleno, si realizas búsquedas en él siempre resultan exitosas.
/dev/kqemu  Dispositivo no fisico usado por el software de emulación Qemu, similar a otros dispositivos usados por VirtualBox como /dev/vboxdrv, etc.
/dev/kmem Acceso a bajo nivel de la memoria virtual usada por el kernel.
/dev/loop Dispositivo de lazo o loop device. Es similar a los vnd o vnode disk de *BSD o lofi en Solaris. Un pseudo dispositivo para acceder como un dispositivo de bloques. Muy práctico, entre otras cosas, para montar una imagen ISO en él sin necesidad de quemarla en un disco óptico real.
/dev/mapper  Luegar donde se encuentrna los volúmenes lógicos creados por LVM.
/dev/mem  Dispositivo de acceso a la memoria principal (RAM).
/dev/mmc Dispositivo para tarjetas de memoria como las SD, con nombres como /dev/mmcblk0
/dev/modem Enlace hacia el modem.
/dev/mouse Ratón.
/dev/null Es el periférico nulo, no se corresponde con un dispositivo físico real, pero es un fichero siempre lleno de «nada», una especie de pozo sin fondo o papelera a la que tirar lo que se quiera.
/dev/ram No confundir con la RAM, sino que es para la RAM disk, es decir, pedazos de la memoria principal usados para cargar de forma más rápida que si se usase el medio de almacenamiento secundario.
/dev/random No es un dispositivo físico, simplemente genera números pseudo-aleatorios recogiendo señales de ruído del sistema (tasa de paquetes de red, movimiento del mouse, pulsaciones de teclado, sensores de temperatura, HID, etc.) para recoger entropía y mediante un algoritmo lo procesa para transformarlo en bits aleatorios. Implementado por primera vez en Linux y luego copiado para otros sistemas *nix. Se usa mucho en criptografía.
/dev/rtc Real Time Clock o RTC, es decir, para el acceso al reloj de tiempo real del sistema.
/dev/sd Medios de almacenamiento secundario como los discos duros. Antes se usaba /dev/hd, pero para los nuevos SCSI y SATA se emplea /dev/sd. Por ejemplo, /dev/sda3 y /dev/sdc1 se corresponde a la partición 3 del primer disco duro y la primera partición del tercer disco duro.
/dev/stdin y /dev/stdout Dispositivo de entrada y salida estándar. Por lo general, la entrada estándar es el teclado y la salida el monitor.
/dev/tty Consolas o terminales reales, es decir, aquellas que se pueden acceder con las teclas Ctrl+Alt+Fn (F1, F2,…). Similar a /dev/console, solo que console pertenece al administrador del sistema, o /dev/xconsole del superusuario.
/dev/ttyS ttyS0, ttyS1,… puertos seriales.
/dev/uhid Dispositivos User Space HID (Human Interface Device).
/dev/urandom Contraparte de /dev/random. Reutiliza una fuente interna para producir bits pseudo-aleatorios. Las llamadas de lectura nunca se bloquearán cuando la fuente de entropía está vacía a diferencia de random, pero se consigue menos entropía. Es decir, random se puede leer mientras haya información en la pila de eventos del sistema y después se bloquea hasta que sucedan nuevos eventos que generen más ruído. En el caso de urandom se puede seguir leyendo, pero aporta menos seguridad.
/dev/usb Puertos USB.
/dev/video Acceso a dispositivos de vídeo, como por ejemplo webcams.
/dev/zero No es un dispositivo físico, provee de un flujo de caracteres null (ASCII NUL, o 0x00) para sobreescribir información o eliminar datos. A diferencia de /dev/null, /dev/zero se puede leer y siempre devuelve NULL.

Espero que con esto los dispositivos no tengan secretos para ti…

Trabajar un poco con los dispositivos:

Como he dicho, al ser ficheros, se pueden listar como ya viste antes, se podría ver el contenido con el contactenador cat, etc. Vamos a ver algunos ejemplos de lo que podríamos hacer con nuestros dispositivos de bloques y caracteres:

  • Con el contatenador podemos hacer:
cat /dev/random
  • En antiguas impresoras que entendían caracteres ASCII se podía imprimir una linea o fichero directamente usando redirecciones. Por ejemplo:
echo "Prueba" > /dev/lp0
cat prueba.txt > /dev/usb/lp1
  • También puedes crear una imagen ISO de un CD/DVD/BD fácilmente:
dd if=/dev/cdrom of=optica.iso
  • Puedes almacenar información desde un dispositivo en una variable y luego leerlo:
read X < /dev/random
echo $X
  • También redirigir la salida de un dispositivo a la entrada de otro, por ejemplo, enviar un ruído desde /dev/urandom a la entrada de /dev/audio y podrás escuchar ruído en tus altavoces:
cat /dev/urandom | padsp tee /dev/audio > /dev/null
  • Eliminar el contenido de un fichero llenándolo del contenido de /dev/null, es decir, llenándolos de «nada»:
cat /dev/null > documento.txt
  • Silenciar la salida de error enviándolo a un pozo sin fondo:
./a.out 2> /dev/null
  • Sobreescribir un medio de almacenamiento (la partición 4º del segundo disco duro en este caso) con caracteres NULL o ceros para eliminar la información de forma segura:
dd if=/dev/zero of=/dev/sdb4 bs=4M
  • Puedes eliminar un dispositivo… ¡Espera! ¿Realmente se puede? Sí se puede con privilegios, pero volverá a estar ahí cuando reinicies el sistema como si nada. También sería posible resucitarlo con el comando mknod sin reiniciar. Es curioso y suelen preguntarme por esto bastante. Me gustaría decir también, que al ser ficheros especiales y solo servir como puntero hacia el controlador del kernel, si cualquier programa o servicio ya abrió el fichero, nada pasará, seguiría funcionando aunque lo borre. Pero si se realiza una nueva conexión tras haberlo eliminado, entonces el programa, comando o servicio dará un error «file not found» o «fichero no encontrado».
sudo rm /dev/null

¡¿Qué?! ¿Podrías hacer todo eso si no estuvieses en un UNIX?

Espero haberte ayudado, en el próximo de esta serie seguiré con más detalles sobre LPIC-1 101.1…

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar