LPIC-1 101.1: comprendiendo /sys, udev y dbus

En Linux existen algunas interfaces muy interesantes como /sys y /proc. Ambos son pseudo sistemas de archivos o FS sintéticos, es decir, están funcionando sobre el File System que estés usando para tu partición (ext4, btrfs,…). En los entornos UNIX son expertos en ofrecer interfaces uniformes para distintas partes del sistema, y eso es lo que se ha hecho con /dev (analizada en el artículo anterior), /sys y /proc.

Con SysFS y ProcFS se crean las estructuras /sys y /proc respectivamente. El primero para disponer de un espacio de información para dispositivos y controladores desde el kernel hacia el espacio de usuario, empleado por ejemplo por udev. Cada objeto añadido al árbol generará un nuevo directorio dentro de /sys/ que contendrá a su vez una serie de ficheros (atributos). En el caso de /proc, ya la trataremos cuando veamos el tema de la gestión de procesos. Pero sí que me interesa de ella para el LPIC-1 Tema 101.1 que sepas que allí también puedes encontrar información de hardware.

Para aquellos que provienen de *BSD, quizás /sys os recuerde bastante a sysctl.

¿Cómo obtener información del hardware desde /proc?

Muchas herramientas de las que usas diariamente obtienen información del hardware desde /proc, de hecho, dichas herramientas no son más que unos programas simples que simplemente te presentan la información conseguida de una forma más amigable u ordenada. Repito, para este bloque solo me interesa que conozcas los ficheros que aportan información de hardware, no todo lo referente a procesos que analizaremos en el futuro.

Aunque desde Linux v2.6 casi todo aquello que no tenía que ver con procesos fue movido desde /proc a /sys, aún siguen quedando algunos ficheros sobre hardware como:

/proc/acpi/ Anteriormente /proc/apm. Directorio que almacena información sobre el sistema de gestión de energía ACPI.
/proc/asound/ Directorio con información sobre el sistema de sonido ASLA.
/proc/bus/ Directorio con información sobre buses de tipo PCI y USB.
/proc/cpuinfo Fichero con información sobre la CPU, como el vendedor, familia, Stepping, ID, modelo, frecuencia de reloj, cache, núcleos, flags, valor de BogoMIPS, siblings (núcleos lógicos en sistemas SMT), etc. Algunas de las herramientas que aportan información sobre la CPU usan este fichero como fuente, por ejemplo lscpu.
/proc/devices Fichero con información de dispositivos c o b.
/proc/dma Fichero con información sobre canales DMA ISA en uso. Útil, por ejemplo, para detectar problemas de conflictos de hardware por tener dos o más dispositivos compitiendo por el mismo canal.
/proc/ide Información sobre el bus IDE.
/proc/interrupts Mapa de interrupciones de hardware o IRQs utilizadas. Muy importante también a la hora de resolver problemas.
/proc/iomem Mapa de memoria física del sistema.
/proc/ioports Puertos de E/S usados. Puedes visualizar las direcciones de E/S empleadas por los dispositivos. Si uno o más usan la misma dirección podrían estar generando conflictos.
/proc/irq/ Es un directorio que contiene las IRQs o interrupciones soportadas por el set de la CPU.
/proc/kcore Representa la memoria física del sistema y muestra un tamaño igual a la memoria RAM dado en bytes.
/proc/loadavg Carga promedia de la CPU con respecto al sobretiempo de CPU y E/S. El comando uptime obtiene también información consultando este fichero.
/proc/mdstat Si dispones de una configuración RAID, aquí tendrás información sobre ella.
/proc/meminfo Datos sobre el uso de la memoria RAM. Almacena cantidad de memoria total, libre, usada, SWAP, etc. Herramientas como free, top y ps hacen uso de él como fuente.
/proc/mtrr Información sobre MTTR (Memory Type Range Registers) si está soportado por la CPU.
/proc/net/ Directorio con información de red. Dentro puedes encontrar lista de tabla ARP manejada por el kernel en el fichero /proc/net/arp, estados de los dispositivos de red en el fichero /poc/net/dev, información sobre TCP y UDP en /proc/net/tcp y /proc/net/udp, etc.
/proc/parport Información sobre puertos paralelos.
/proc/partitions Datos sobre la asignación de bloques para las particiones.
/proc/pci Lista completa de dispositivos PCI.
/proc/scsi Directorio con dispositivos SCIS o IDE emulados por SCSI. Recuerda que Linux trata los SATA también como SCSI.
/proc/swap Información sobre la partición o fichero SWAP.

He dejado atrás algunos que no interesaban demasiado para este bloque del exámen y también /proc/sys/, en este caso me gustaría tratarlo de una forma especial ahora. Se trata de un directorio muy importante con información sobre el sistema (variables de entorno del kernel). A diferencia de los anteriores, se puede leer la información (cat /proc/sys/<nombre>) y también se puede modificar para activar, desactivar o cambiar parámetros del kernel. Dentro encontrarás algunos ficheros como:

/proc/sys/abi Mantiene parámetros de ejecución usados para emular entornos de ejecución de otros sistemas UNIX. Solo lo encontrarás si el kernel fue compilado para AMD64 o EM64T (x86-64).
/proc/sys/dev Parámetros particulares para dispositivos físicos conectados al sistema.
/proc/sys/fs Opciones e información sobre el sistema de archivos (manejo de ficheros, inodos, quotas,…).
/proc/sys/kernel/ Configuraciones que afectan al comportamiento del kernel.
/proc/sys/net Referente al networking, es decir, información y parámetros de redes.
/proc/sys/vm/ Usado para ajustar valores del subsistema de memoria virtual. Por ejemplo, podrías ajustar el funcionamiento del demonio o servicio kswapd, cantidad de memoria destinada a buffers del núcleo, máximo de áreas de la memoria principal para procesos, etc.

Dentro puedes encontrar ficheros tan importantes como drop_caches, que se encarga de decirle al kernel qué hacer con el contenido de la cache alojada en RAM. Un valor 0 no libera nada, lo deja todo en manos del kernel. El valor 1 libera pagecache (memoria cache de paginación). Un valor 2 libera inodos y dentries (Directory Entries, relación de la estructura directorios-ficheros). El 3 para pagecache, inodos y dentries.

Para concluir esta sección, voy a poner unos ejemplos de cómo se podría obtener información y luego modificar esos parámetros del kernel:

#Saber la cantidad de ficheros máximo que el kernel puede alojar de forma dinámica y luego modificar el valor a 8192 ficheros:

cat /proc/sys/fs/file-max
echo 8192 > /proc/sys/fs/file-max

#Obtener la configuración actual y modificar a 0 el parámetro sobre la administración de memoria principal por parte del kernel:

cat /proc/sys/vm/drop_caches
sync && echo 0 /proc/sys/vm/dorp_caches

/sys a fondo:

Lo primero, dejar claro que puedes hacer uso de herramientas como sysctl para realizar configuraciones en /etc/sysctl.conf o /etc/sysctl.d/*.conf. El contenido podría parecerse en ciertos aspectos a /proc, solo que aquí no está orientado a procesos, sino a hardware:

/sys/block/ Directorio con los dispositivos de bloques.
/sys/bus/ Directorio con enlaces simbólicos relacionados con los dispositivos y sus respectivos buses.
/sys/class/ Agrupa, según la clase, a los dispositivos (red, sonido, GPIO, DMA, SCSI,…).
/sys/devices/ Capa física / Dispositivos. Especialmente importante es /sys/devices/system/cpu, donde encontrarás información sobre la gestión que se hace de la CPU, puedes cambiar gobernadores, frecuencia de reloj si soporta gestión dinámica de frecuencia, etc., es decir, interactuar con módulos como cpufreq y cpuidle. Dentro de cpu/ encontrarás diversos directorios para cada núcleo o CPU en sistemas MP.
/sys/firmware Acerca del firmware, como por ejemplo /sys/firmware/efi.
/sys/fs/ Contiene información sobre los FS (ext4/, cgroups/, btrfs/, ecryptfs/, fuse/, pstore/,…). Por ejemplo, podrías cambiar de grupo a un proceso por su PID.
/sys/hypervisor/ Directorio con información sobre el hipervisor (virtualización).
/sys/kernel/ Directorio para el kernel. Por ejemplo, en /sys/kernel/config se monta configfs, el FS virtual para la RAM que sirve para configurar el kernel.
/sys/module/ Módulos del kernel.
/sys/power/ Acerca de temas de potencia, apagado, reinicio, suspensión, hibernación, etc.

udev:

¿Recuerdas devfsd y hotplug? Pues olvídalos, porque el sucesor se llama udev. El nombre del gestor de dispositivos actual proviene de User-space /DEV. Los «culpables» de que exista son Greg Kroah-Hartman y Kay Sievers. Y por cierto, como curiosidad podéis fijaros dónde se encuentra ahora integrado, en systemd.

Gracias a udev, Linux es capaz de gestionar (agregar o quitar) de forma dinámica device nodes dentro del directorio /dev., es decir, maneja todos los eventos en el espacio de usuario mientras los dispositivos de hardware se agregan o se retiran del sistema, incluída la carga del firmware requerido para cada dispositivo. Y aunque trabaje sobre /dev, udev depende directamente del sistema de archivos sysfs.

Explicado de un modo menos abstracto, imagina que conectas un dispositivo USB a tu PC. Inmediatamente se debe notificar a todas las aplicaciones que tienen la capacidad para hacer uso de ese dispositivo que está disponible de forma automática. Pues a eso se dedica udev junto con la interfaz del kernel uevent, que en conexión con udev le informará de todo los eventos para que sean notificados en el espacio de usuario…

Existe un comando llamado udevadm con el que podemos obtener información de udev bastante interesante. Por ejemplo, puedes ejecutar la siguiente orden y conectar o desconectar algún componente de hardware y ver qué ocurre:

udevadm monitor

Obtener información de un dispositivo (p.e.: tu disco duro) con:

udevadm info /dev/sda

Puedes afinar aún más la búsqueda y filtrar solo un tipo de información concreta, por ejemplo «property»:

udevadm info --query=property /dev/sda

No lo voy a estar repitiendo en todos los artículos, pero recuerda que para ver más opciones, parámetros de los comandos, etc., usa man. ¡Siempre debe ser tu mejor aliado!

En el próximo artículo sobre LPIC-1 seguiré con otras herramientas y formas de trabajar con dispositivos… Finalizo el apartado agregando que para trabajar con udev puedes observar el fichero de configuración /etc/udev/udev.conf. Dejo para LPIC-2 explicar cómo crear reglas para udev y el directorio /etc/udev/rules.d/*.rules, /lib/udev/rules.d/*.rules, etc.

Me está costando un poquito orientarme para los temas a tratar en los artículos, pero con ayuda de la Wiki de LPI intento llevarlo bajo control. El motivo es que yo estructuré mi curso de una forma totalmente diferente y que entiendo que es mejor para los alumnos, ya que cuando trato udev, por poner un ejemplo, introduzco toda la información sobre ese sistema. En cambio, en los LPIC se separan algunas cosas para el LPIC-1, otras se dan en el LPIC-2 y todo está más fraccionado…

dbus:

El software dbus (Desktop Bus) es un sistema de IPC (Inter-Process Communication) desarrollado bajo el proyecto freedesktop.org. Es un sistema encargado de posibilitar la comunicación entre procesos, es decir, entre programas. Tiene tre capas, una biblioteca libdbus para permitir a dos apps intercambiar mensajes, un demonio que actúa como un bus de mensajes y wrappers para usar en ciertos frameworks.

Hice un pequeño diagrama para el curso del que soy profesor que voy a recuperar para este artículo, ya que te podría ayudar a entender cómo trabaja d-bus:

diagrama D-Bus

En LPIC-1, d-bus se da muy por encima. Pero tal vez entiendo que deberías conocer algunas herramientas que te pueden ser útiles como qdbus y dbus-send. La primera como una interfaz de comunicación para apps basadas en Qt y la segunda para poder enviar mensajes a través del bus de mensajes…

En el próximo artículo seguimos con LPIC-1 Tema 101.1, donde veremos una serie de herramientas con las que obtener información y manipular hardware… Creo que con ese dejaremos por terminado 101.1 y pasaremos al 101.2 (proceso de arranque).

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