viernes, 15 de febrero de 2008

Descubre las posibilidades del directorio /proc

El directorio /proc es una bestia extraña. Aunque realmente no existe, puedes explorarlo. Sus archivos de longitud cero, no son binarios ni textos, pero igual se pueden mostrar. Este directorio especial contiene todo el detalle del sistema Linux, incluyendo el kernel, procesos y parámetros de configuración. Estudiando el directorio /proc, puedes aprender como trabajan los comandos en Linux y hacer algunas tareas administrativas.

Bajo Linux, todo se maneja como archivo, hasta los dispositivos son accesados como archivos (en el directorio /dev). Aunque creas que cualquier archivo "normal" pueden ser texto o binario, el directorio /proc contiene un tipo extraño: archivos virtual. Los archivos son listados, pero en realidad no existen en el disco; el sistema operativo los crea al vuelo si tratas de leerlos.

La mayoría de los archivos virtuales tienen la fecha actual, lo cual indica que están en constante actualización. EL directorio /proc se crea el mismo cada vez que se inicia la PC. Necesitas trabajar como root para poder examinar el directorio completo: algunos de sus archivos son manejados por el usuario que los cargo. Aunque la mayoría de los archivos son de "solo lectura", algunos son escribibles (/proc/sys) permiten cambiar los parámetros del kernel. (Por supuesto mucho cuidado al hacer esto).

La organización del directorio /proc

EL directorio /proc esta organizado en directorios y sub-directorios virtuales, y los grupos de archivos por tópicos similares. Trabajando como root, el comando ls /proc trae de vuelta algo como esto:

1     2432  3340  3715  3762  5441  815        devices      modules
129 2474 3358 3716 3764 5445 acpi diskstats mounts
1290 248 3413 3717 3812 5459 asound dma mtrr
133 2486 3435 3718 3813 5479 bus execdomains partitions
1420 2489 3439 3728 3814 557 dri fb self
165 276 3450 3731 39 5842 driver filesystems slabinfo
166 280 36 3733 3973 5854 fs interrupts splash
2 2812 3602 3734 4 6 ide iomem stat
2267 3 3603 3735 40 6381 irq ioports swaps
2268 326 3614 3737 4083 6558 net kallsyms sysrq-trigger
2282 327 3696 3739 4868 6561 scsi kcore timer_list
2285 3284 3697 3742 4873 6961 sys keys timer_stats
2295 329 3700 3744 4878 7206 sysvipc key-users uptime
2335 3295 3701 3745 5 7207 tty kmsg version
2400 330 3706 3747 5109 7222 buddyinfo loadavg vmcore
2401 3318 3709 3749 5112 7225 cmdline locks vmstat
2427 3329 3710 3751 541 7244 config.gz meminfo zoneinfo
2428 3336 3714 3753 5440 752 cpuinfo misc
Los directorios numerados corresponden a cada proceso que esta ejecutándose; un atajo, symlink o enlace simbolico es self el cual apunta al proceso actual. Algunos archivos virtuales proveen informacion sobre el hardware, como el archivo /proc/cpuinfo, /proc/meminfo, y /proc/interrupts. Otros archivos proveen informacion relacionada como /proc/filesystems o /proc/partitions. Los archivos bajo /proc/sys están relacionados a los parámetros de configuración del kernel, como veremos mas adelante.

EL comando cat /proc/meminfo debería mostrar algo como esto:


MemTotal:       483488 kB
MemFree: 9348 kB
Buffers: 6796 kB
Cached: 168292 kB
.
.
.

Si intentas los comandos top o free, deberías reconocer alguno de estos números. De hecho, muchas de las utilidades ya conocidas acceden al directorio /proc para obtener informacion.
Por ejemplo, si quieres saber que kernel estas ejecutando, usas el el comando uname -srv o te vas a la fuente ejecutas cat /proc/version. Otros archivos interesantes incluyen:

  • /proc/acpi: Un directorio similar que ofrece abundante data sobre Interfaces de Poder y Configuración Avanzada (Advanced Configuration and Power Interface). Por ejemplo, para ver si tu laptop esta conectada a la corriente, puedes usar el comando cat /proc/acpi/ac_adapter/AC/state y obtendrás "on line" or "off line."
  • /proc/cmdline: Muestra los parámetros que se fueron pasados al kernel al momento de iniciar (bootear). En este caso seria algo así:
root=/dev/disk/by-id/scsi-SATA_FUJITSU_MHS2040_NLA5T3314DW3-part3 vga=0x317 resume=/dev/sda2 splash=silent PROFILE=QuintaWiFi, lo cual menciona que partición es el sistema de fichero raíz, que modo VGA se usa y mas.

  • /proc/cpuinfo: Provee informacion de tu sistema. Por ejemplo en una laptop se si se ejecuta cat /proc/cpuinfo se obtendría algo así:

 processor       : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 8
model name : Mobile AMD Athlon(tm) XP 2200+
stepping : 1
cpu MHz : 927.549
cache size : 256 KB

Esto muestra que se tiene un solo procesador, numerado 0, de la familia 80686 (el 6 en el cpu family va como el dígito medio), un procesador AMD Athlon XP, corriendo a menos de un 1GHz.

  • /proc/loadavg: el archivo muestra el promedio de carga del procesador, su informacion incluye el uso del CPU en los últimos 10 minutos, así como el numero de procesos ejecutados actualmente.
  • /proc/stat: también da estadísticas, pero va hacia el ultimo booteo.
  • /proc/uptime: archivo pequeño que solo muestra 2 números, en cuantos segundos tu sistema ha estado activo, y en cuantos ha estado inactivo.
  • /proc/devices: muestra todos los dispositivos carácter y bloques cargados y configurados actualmente. /proc/ide y /proc/scsi proveen informacion sobre los dispositivos IDE y SCSI.
  • /proc/ioports: muestra informacion sobre las regiones usadas para comunicación I/O con aquellos dispositivos.
  • /proc/filesystems: muestra que tipo de sistemas de fichero son soportados por tu kernel. Una porción de este se vería así:

nodev   sysfs
nodev rootfs
nodev bdev
nodev proc
nodev cpuset
...some lines snipped...
nodev ramfs
nodev hugetlbfs
nodev mqueue
ext3
nodev usbfs
ext2
nodev autofs

La primera columna muestra cualquier sistema de fichero que esta montado en un bloque de dispositivo, en este caso muestra particiones configuradas con ext2 y ext3.

  • /proc/mounts: muestra todo lo montado en tu maquina (esta salida se muestra mejor en /etc/mtab). Igualmente, /proc/partitions y /proc/swaps muestra todas las particiones y el espacio de intercambio (swap).
  • /proc/fs: si estas exportando el sistema de fichero con NFS, este directorio contiene entre sus subdirectorios y archivos los archivos /proc/fs/nfds/exports, el cual muestra el sistema de fichero que esta siendo compartido y sus permisos.
  • /proc/net: no puedes usar este para informacion de la red. Describir cada archivo el ese directorio requiere mucho espacio, pero incluye /dev (cada dispositivo de red), varios archivos relacionados a iptables, estadísticas de red y socket, informacion inalambrica y mas.
Hay muchos archivos relacionados con la RAM. Ya se menciono /proc/meminfo, pero también se tiene /proc/iomem, el cual muestra cuanta RAM se esta usando en tu sistema, y /proc/kcore, representa la memoria RAM física en tu sistema. No intentes el comando cat en estos archivos, porque son binarios. Finalmente, hay muchos archivos relacionados con el hardware, tales como /proc/interrupts y /proc/irq, /proc/pci (todos los dispositivos PCI), /proc/bus.


Que se esta procesando

Como ya se dijo, los directorios numerados representan todos los procesos ejecutándose. Cuando un proceso termina, su directorio /proc desaparece automáticamente. Si revisas alguno de esos directorios mientras existe, veras varios archivos como estos:

attr             cpuset   fdinfo    mountstats  stat
auxv cwd loginuid oom_adj statm
clear_refs environ maps oom_score status
cmdline exe mem root task
coredump_filter fd mounts smaps wchan
Miremos los principales archivos:
  • cmdline: contiene el comando que inicio el proceso, con sus parámetros.
  • cwd: un enlace simbólico al directorio actual del proceso; enlaces exe hacia el proceso ejecutable, y los enlaces root hacia su directorio raíz.
  • environ: muestra todas las variables de entorno para el proceso.
  • fd: contiene todos los archivos descriptores para un proceso, mostrando que archivos y dispositivos se están usando.
  • maps, statm, and mem: manejo de la memoria en uso por proceso.
  • stat and status: provee informacion sobre el estatus del proceso.
Estos archivos proveen varios retos de código de programación. Por ejemplo, si quieres cazar procesos zombies, deberías escanear todos los directorios numerados y revisar cualquier (Z) que aparezca en el archivo /status.

Ajustando el sistema: /proc/sys
/proc/sys no solo provee informacion sobre el sistema, también permite cambiar los parámetros del kernel al vuelo, y habilitar y deshabilitar características. (Por supuesto mucho cuidado con esto!).

Para determinar si puedes configurar el archivo o si esta en modo de solo lectura usa el comando ls -ld, si el archivo tiene el atributo W, quiere decir que puedes usarlo para configurar el kernel. Por ejemplo, ls -ld /proc/kernel/* empieza algo así:

dr-xr-xr-x 0 root root 0 2008-01-26 00:49 pty
dr-xr-xr-x 0 root root 0 2008-01-26 00:49 random
-rw-r--r-- 1 root root 0 2008-01-26 00:49 acct
-rw-r--r-- 1 root root 0 2008-01-26 00:49 acpi_video_flags
-rw-r--r-- 1 root root 0 2008-01-26 00:49 audit_argv_kb
-r--r--r-- 1 root root 0 2008-01-26 00:49 bootloader_type
-rw------- 1 root root 0 2008-01-26 00:49 cad_pid
-rw------- 1 root root 0 2008-01-26 00:49 cap-bound
Puedes ver que bootloader_type no quiere decir que esta cambiado, pero otros archivos lo están. Para cambiar un archivo usa algo como echo 10 >/proc/sys/vm/swappiness. Este ejemplo en particular te permitiría afinar la performance de la paginacion de la memoria virtual. Pero estos cambios son solo temporales, y desaparecerán cuando se reinicie tu sistema; usa sysctl y el archivo /etc/sysctl.conf para que los cambios sean permanentes.

Veamos algo de los directorios de /proc/sys:
  • debug: su mismo nombre lo dice, contiene informacion de depuración, esto es bueno si eres desarrollador del kernel.
  • dev: provee parámetros para dispositivos específicos en tu sistema, por ejemplo revisa el directorio /dev/cdrom.
  • fs: ofrece informacion sobre cada aspecto del sistema de fichero.
  • kernel: Afecta la configuración y operación directa del kernel.
  • net: permite control lo relacionado a la red. Cuidado que algún descuido puedes perder tu conectividad.
  • vm: trabaja con el subsistema VM.

Conclusión

El directorio especial /proc provee informacion muy detallada acerca del trabajo interior de Linux y te permite afinar tu sistema. Si estudias un poco mas sobre todas las posibilidades del directorio, estarás habilitado para perfeccionar tu sistema Linux.



No hay comentarios: