Una de las diferencias más grandes entre Windows y GNU/Linux que desconcierta a nuevos usuarios es el sistema de archivos. En Linux no hay más letras de unidad, sólo un directorio gigantezco que se llama directorio raíz en donde está todo.
Y ese todo es realmente todo. En particular hay un par de directorios medio raros y /proc es uno de los más raros. Este artículo explica muy claramente muchas de las cosas que hacen especial este directorio y lo que contiene además de algunas de las cosas que se pueden hacer con el mismo.
Notas
- Artículo original: Discover the possibilities of the /proc directory
- Autor original: el uruguayo Federico Kereki para Linux.com
- La salida de todos los ejemplos utilizados fueron reemplazadas por los de mi PC para que sean más acordes a la actualidad
- Via: Librenix
Traducción
El directorio /proc es una bestia extraña. No existe realmente, pero podemos explorarlo. Sus archivos de tamaño cero no son ni binarios ni de texto sin embargo se los puede examinar y ver. Este directorio especial contiene todos los detalles sobre tus sistemas Linux, incluyendo su núcleo, procesos y parámetros de configuración. Estudiando el directorio /proc puedes aprender cómo funcionan los programas en Linux y aún hacer algunas herramientas administrativas.
En Linux, todo es manejado como un archivo; aún los dispositivos son abstraídos como archivos (en el directorio /dev). Si bien puedes pensar que los archivos “normales” son o bien textos o binarios (o posiblemente archivos de dispositivos o tuberías), el directorio /proc contiene un tipo de archivo más extraño: archivos virtuales. Estos archivos se pueden listar pero no existen realmente en el disco; el sistema operativo los crea al vuelo si intentas leerlos.
La mayoría de los sistemas de archivo siempre tienen una marca temporal actualizada, lo que indica que están siendo actualizados constantemente. El directorio /proc en sí mismo es creado cada vez que inicias el equipo. Necesitas trabajar como root para poder examinar el directorio completo; algunos archivos (como los relacionados a los procesos) pertenecen al usuario que ejecutó el proceso. Si bien la mayoría de los archivos son sólo de lectura, en unos pocos (notablemente en /proc/sys) puedes escribir para modificar parámetros del núcleo (cosa que deberías de hacer con mucho cuidado por supuesto).
Recursos sobre /proc
Encontrar documentación sobre el sistema de archivo /proc puede ser una tarea tediosa porque está desparramada entre todo el código fuente del núcleo. Revisando el directorio /usr/src/linux/Documentation encontré el archivo proc.txt que contiene mucha información pero está algo desactualizada: su última actualización fue en Noviembre de 2000 cuando estaba por salir la versión 2.4.0 (N.d.T.: en realidad fue escrito en esa época y se actualizó por última vez en Junio de 2011, lo que no quiere decir que sea completo). Sin embargo, este directorio es más sencillo de revisar que los archivos de código fuente C. Nota que podrías conseguir más de lo que deseas; por ejemplo, el archivo laptop-mode.txt tiene más de 1000 líneas y sólo documenta el archivo /proc/sys/vm/laptop_mode.
Organización del directorio /proc
El directorio /proc está organizado en directorios y subdirectorios virtuales con sus archivos agrupados por categoría. Trabajando como root, la órden ls /proc devuelve algo como lo siguiente:
1 14455 170 1964 2220 5142 dma mtrr 10 14456 1729 1967 2234 5146 driver net 10822 14573 173 1974 2243 5147 execdomains pagetypeinfo 1145 15 1731 1975 2245 523 fb partitions 1176 1545 174 1976 2281 535 filesystems sched_debug 1179 1561 175 1978 2284 570 fs self 1194 1574 18 1998 2286 6 interrupts slabinfo 12 1591 1801 2 2289 7 iomem softirqs 1207 16 1814 2004 2292 8 ioports stat 1215 160 1855 2022 2299 893 irq swaps 1218 161 1858 2026 23 894 kallsyms sys 1275 1610 1859 2045 2307 895 kcore sysrq-trigger 1292 162 1864 2056 234 acpi keys sysvipc 13 1627 1865 20961 24 asound key-users timer_list 13070 1628 1869 21 25 buddyinfo kmsg timer_stats 13369 1629 1874 2173 26 bus kpagecount tty 13874 163 19 2194 2669 cgroups kpageflags uptime 13927 1630 1920 22 2750 cmdline loadavg version 13934 1631 1942 22113 288 consoles locks vmallocinfo 13935 1632 1948 22114 3 cpuinfo meminfo vmstat 14 1636 1952 22133 30326 crypto misc zoneinfo 14237 169 1953 22134 31901 devices modules 14450 17 1955 2216 3784 diskstats mounts
Los directorios numerados corresponden con los procesos que están ejecutando (más al respecto luego); el enlace simbólico self apunta al proceso actual. Algunos archivos virtuales proveen información sobre el soporte físico como /proc/cpuinfo, /proc/meminfo y /proc/interrupts. Otros proveen información relacionada con los archivos como /proc/filesystems o /proc/partitions. Los archivos en /proc/sys veremos están relacionados con los parámetros de configuración del núcleo.
La órden cat /proc/meminfo puede devolver algo parecido a lo siguiente:
# cat /proc/meminfo MemTotal: 4063188 kB MemFree: 1239204 kB Buffers: 191384 kB Cached: 1241840 kB [varias líneas eliminadas]
Si ejecutas top o free podrías reconocer algunos de esos números. De hecho, muchas utilidades muy conocidas acceden al directorio /proc para obtener su información. Por ejemplo, si deseas saber qué núcleo estás ejecutando utilizarías uname -srv, pero bien podrías recurrir a la fuente y tipear cat /proc/version.
Algunos otros archivos interesantes
/proc/apm: provee información sobre Manejo de poder avanzado («APM» por sus siglas en inglés), si está instalado.
/proc/acpi: un directorio similar al anterior que ofrece mucha información sobre el reemplazo de APM: interfaz avanzada de poder y configuración («ACPI» por sus siglas en inglés). Por ejemplo, para ver si tu portátil está conectada a la red eléctrica puedes utilizar cat /proc/acpi/ac_adapter/AC/state y obtener «on line» si lo está u «off line» si no lo está.
/proc/cmdline: muestra los parámetros que fueron pasados al núcleo al momento de iniciar. En mi caso contiene BOOT_IMAGE=/vmlinuz-2.6.39-2-amd64 root=UUID=6b950aa9-358a-4e7e-945f-ddc9972767e4 ro quiet que contiene la ubicación de mi raíz de sistema de archivos, la ubicación de la imagen a iniciar y un par de cosas más.
/proc/cpuinfo: provee información sobre el procesador del equipo. Por ejemplo, en mi equipo cat /proc/cpuinfo comienza con:
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 23 model name : Intel(R) Core(TM)2 Duo CPU E7400 @ 2.80GHz stepping : 10 cpu MHz : 2806.667 cache size : 3072 KB
Esto muestra que tengo un procesador, el número 0, de la familia 80686 (el código 6 de cpu family es el dígito intermedio): un Intel Core2Duo a 2.8 GHz.
/proc/loadavg: un archivo relacionado que muestra la carga promedio del procesador; esta información incluye el uso de la CPU en el último minuto, los últimos 5 minutos y los últimos 10 minutos así también como la cantidad actual de procesos ejecutando.
/proc/stat: también provee estadísticas, pero desde el último inicio del equipo.
/proc/uptime: un archivo corto que tiene sólo 2 números: la cantidad de segundos que el equipo ha estado prendido y la cantidad de segundos en los que ha estado inactivo.
/proc/devices: muestra todos los dispositivos de caracteres y bloque actualmente configurados y cargados. /proc/ide and /proc/scsi proveen datos sobre los dispositivos IDE y SCSI.
/proc/ioports: muestra información sobre las regiones de utilizadas para comunicación de Entrada/Salida con dichos dispositivos.
/proc/dma: muestra los canales Direct Memory Access en uso.
/proc/filesystems: muestra los tipos de sistema de archivos soportados por el núcleo. Este archivo podría verse de la siguiente forma:
nodev sysfs nodev rootfs nodev bdev nodev proc nodev cgroup nodev cpuset nodev tmpfs nodev devtmpfs nodev debugfs nodev securityfs nodev sockfs nodev pipefs nodev anon_inodefs nodev devpts nodev ramfs nodev hugetlbfs nodev pstore nodev mqueue nodev usbfs ext3 nodev fuse fuseblk nodev fusectl vfat
La primer columna muestra si el sistema de archivo está montado en un dispositivo de bloque. En mi caso, tengo particiones configuradas con ext3 montadas.
/proc/mounts: muestra todos los puntos de montaje utilizados por el equipo (su salida se parece a /etc/mtab). Similarmente, /proc/partitions y /proc/swaps muestran todas las particiones y espacio de intercambio.
/proc/fs: si estás exportando sistemas de archivos con NFS, este directorio tendrá entre sus muchos subdirectorios y archivos /proc/fs/nfsd/exports que mostrará los sistemas de archivos compartidos y sus permisos.
/proc/net: no se puede competir contra esta fuente de información de red. Describir cada archivo en este directorio necesitaría demasiado espacio pero incluye cada dispositivo, varios archivos relacionados con iptables, estadísticas de reds y zócalos, información inalámbrica y mucho más.
RAM: también hay varios archivos relacionados con memoria. Ya mencioné /proc/meminfo, pero también existe /proc/iomem que muestra la cantidad de memoria utilizada en el equipo y /proc/kcore que representa la memoria física de la máquina. A diferencia de otros archivos virtuales, /proc/kcore muestra un tamaño que es igual a tu memoria más un pequeño extra (no intentes usar cat sobre este archivo, su contenido es binario y desconfigurará la consola) (N.d.T.: si ya lo habías hecho, utiliza la órden reset en esa misma consola). Finalmente, hay muchos directorios y archivos relacionados con el soporte físico, como /proc/interrupts y /proc/irq, /proc/pci (todos los dispositivos PCI), /proc/bus y más; pero incluyen información muy específica que la mayoría de los usuarios no necesitan.
¿Qué hay en un proceso?
Como expliqué anteriormente, los directorios que tienen números por nombre representan los procesos que se están ejecutando. Cuando un proceso termina su directorio en /proc desaparace automáticamente. Si revisas cualquiera de estos directorios mientras todavía existe encontrarás muchos archivos, por ejemplo:
attr coredump_filter io mountstats root status autogroup cpuset limits net sched syscall auxv cwd loginuid oom_adj sessionid task cgroup environ maps oom_score smaps wchan clear_refs exe mem oom_score_adj stack cmdline fd mountinfo pagemap stat comm fdinfo mounts personality statm
Revisemos los archivos principales:
- cmdline: contiene la forma en la que se ejecutó el proceso, con todos sus parámetros
- cwd: un enlace simbólico al directorio de trabajo («working directory») del proceso
- exe: un enlace simbólico al ejecutable del proceso
- root: un enlace simbólico a lo que el proceso ve como directorio raíz
- environ: muestra todas las variables de entorno del proceso
- fd: contiene todos los descriptores de archivo del proceso, mostrando los archivos que está utilizando
- maps, statm, y mem: tienen que ver con la memoria siendo utilizada por el proceso
- stat y status: proveen información sobre el estado del proceso, el último es mucho más claro que el primero
Estos archivos proveen varios desafíos de programación. Por ejemplo, si deseas encontrar procesos zombie puedes revisar todos los directorios numerados y revisar si el archivo status contiene “(Z) Zombie”. Una vez necesité revisar si un proceso determinado estaba ejecutando, revisé los directorios leyendo el archivo cmdline buscando el archivo deseado (también se podría haber hecho esto con la salida del programa ps, pero eso está más allá del propósito de este artículo) (N.d.T.: el programa pgrep está hecho específicamente para eso). Si se desea programar una versión más bonita de top, tienes toda la información en la punta de tus dedos.
Modificando el sistema: /proc/sys
/proc/sys no sólo provee información sobre el sistema, también te permite cambiar parámetros del núcleo al vuelo, activando o desactivando funcionalidades (por supuesto, esto podría dañar el sistema ¡considerate advertido!).
Para saber si puedes configurar un archivo o si sólo es para lectura, utiliza ls -ld; si un archivo tiene el atributo “w” significa que puedes utilizarlo para controlar algo del núcleo. Por ejemplo, ls -ld /proc/sys/kernel/* comienza de la siguiente forma:
-rw-r--r-- 1 root root 0 Jun 25 19:29 /proc/sys/kernel/acct -rw-r--r-- 1 root root 0 Jun 25 19:29 /proc/sys/kernel/acpi_video_flags -rw-r--r-- 1 root root 0 Jun 25 19:29 /proc/sys/kernel/auto_msgmni -rw-r--r-- 1 root root 0 Jun 25 19:29 /proc/sys/kernel/blk_iopoll -r--r--r-- 1 root root 0 Jun 25 19:29 /proc/sys/kernel/bootloader_type
Puedes ver que bootloader_type no puede ser cambiado, pero los demás sí. Para cambiar un archivo puedes utilizar algo como echo 10 > /proc/sys/vm/swappiness. Este ejemplo particular ajusta la memoria virtual según la performance de paginación. Por cierto, estos cambios son sólo temporales y sus efectos desaparecerán al reiniciar el sistema; utiliza sysctl y el archivo /etc/sysctl.conf para que los cambios tengan efectos permanentes.
Estos son algunos de los directorios de /proc/sys:
- debug: tiene (¡oh sorpresa!), información de depiración ideal si te interesa desarrollar sobre el núcleo
- dev: provee los parámetros para dispositivos específicos del equipo; revisa por ejemplo el directorio
/proc/sys/dev/cdrom - fs: ofrece datos sobre todo aspecto posible del sistema de archivos
- kernel: permite modificar directamente la configuración y operación del núcleo
- net: permite controlar lo relacionado a la red; cuidado ya que tocar esto puede hacerte perder conectividad
- vm: se relaciona con el sub-sistema de memoria virtual
Conclusión
El directorio especial /proc provee información completa y detallada sobre el funcionamiento interno de Linux y permite afinar muchos aspectos de su configuración. Si dedicas tiempo a aprender sobre todas las posibilidades de este directorios podrás conseguir una máquina Linux mejor. ¿Y eso no es lo que queremos todos acaso?