Descubriendo las posibilidades del directorio /proc

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

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?

Comments are closed.