Obtener información del núcleo

A pesar de que el sistema de archivos proc es virtual y la información que contiene se construye cada vez que el usuario realiza una operación de lectura, el nombre de los archivos y directorios que podemos encontrar en el directorio /proc/ está predefinido por el núcleo y es bien conocido.

Esta sección presenta un repaso de los archivos y directorios más relevantes, junto con instrucciones para interpretar su contenido. Para una descripción más exhaustiva, se recomienda documentación especializada como la "Reference Guide" de Red Hat 9 que mencionábamos en el apartado anterior, o la propia página de manual de "proc" (man proc).

Algunos de los archivos más importantes son los siguientes:

  1. /proc/cmdline. Muestra los parámetros con los que se inició el núcleo en tiempo de arranque. Por ejemplo:

    auto BOOT_IMAGE=linux ro BOOT_FILE=/boot/vmlinuz-2.4.20-20.8 hdc=ide-scsi 
    root=LABEL=/
           
  2. /proc/cpuinfo. Identifica el tipo de procesador del sistema y sus parámetros. Por ejemplo:

    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 7
    model name      : Pentium III (Katmai)
    stepping        : 3
    cpu MHz         : 498.858
    cache size      : 512 KB
    fdiv_bug        : no
    hlt_bug         : no
    f00f_bug        : no
    coma_bug        : no
    fpu             : yes
    fpu_exception   : yes
    cpuid level     : 2
    wp              : yes
    flags           : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov 
    pat pse36 mmx fxsr sse
    bogomips        : 996.14
           
  3. /proc/filesystems. Muestra los sistemas de ficheros que actualmente soporta el núcleo. Es necesario disponer del soporte de sistema de ficheros con el que está formateada una partición (o disquete, cd, etc.) para poder montarlo y así acceder a su contenido. Por ejemplo:

    nodev   rootfs
    nodev   bdev
    nodev   proc
    nodev   sockfs
    nodev   tmpfs
    nodev   shm
    nodev   pipefs
            ext2
    nodev   ramfs
            iso9660
    nodev   devpts
    nodev   usbdevfs
    nodev   usbfs
    nodev   autofs
    nodev   binfmt_misc
            vfat
           

    La primera columna indica si actualmente existe alguna partición montada con dicho sistema de archivos (vacío) o no (nodev). La segunda columna indica el tipo de sistema de archivos. Si el núcleo soporta otros sistemas de archivos como módulos que aún no se han cargado, estos no aparecen en la lista (hasta que son cargados, obviamente).

  4. /proc/meminfo. Muestra información sobre el uso actual de la memoria RAM, indicando la cantidad de memoria utilizada en varios conceptos (compartida, en "buffers" de entrada/salida, libre, intercambio, etc.). Veamos un ejemplo:

            total:    used:    free:  shared: buffers:  cached:
    Mem:  393965568 203403264 190562304        0  5488640 111288320
    Swap: 526409728         0 526409728
    MemTotal:       384732 kB
    MemFree:        186096 kB
    MemShared:           0 kB
    Buffers:          5360 kB
    Cached:         108680 kB
    SwapCached:          0 kB
    Active:         175636 kB
    ActiveAnon:      65804 kB
    ActiveCache:    109832 kB
    Inact_dirty:       452 kB
    Inact_laundry:       0 kB
    Inact_clean:      3756 kB
    Inact_target:    35968 kB
    HighTotal:           0 kB
    HighFree:            0 kB
    LowTotal:       384732 kB
    LowFree:        186096 kB
    SwapTotal:      514072 kB
    SwapFree:       514072 kB
           

    Las dos primeras líneas muestran un resumen del estado de la memoria RAM y de la memoria de intercambio (o swap), con cantidades expresadas en bytes. El resto de líneas muestran la misma información de manera más detallada y expresada en Kbytes. Los campos más relevantes son MemTotal (memoria física total), MemFree (memoria física no utilizada actualmente), SwapTotal (total de memoria de intercambio) y SwapFree (cantidad de memoria de intercambio no utilizada actualmente).

  5. /proc/modules. Muestra un listado de los módulos de núcleo presentes en el sistema (cargados actualmente o no). Este listado puede variar sensiblemente de un sistema a otro (en un núcleo monolítico puro, estaría vacío). Por ejemplo:

    nls_iso8859-1           3516   1 (autoclean)
    nls_cp437               5148   1 (autoclean)
    vfat                   13100   1 (autoclean)
    fat                    38776   0 (autoclean) [vfat]
    sr_mod                 18200   0 (autoclean)
    ymfpci                 45516   0 (autoclean)
    ac97_codec             14600   0 (autoclean) [ymfpci]
    uart401                 8420   0 (autoclean) [ymfpci]
    sound                  74196   0 (autoclean) [uart401]
    soundcore               6500   4 (autoclean) [ymfpci sound]
    binfmt_misc             7464   1
    autofs                 13332   0 (autoclean) (unused)
    ipt_REJECT              4024   2 (autoclean)
    iptable_filter          2412   1 (autoclean)
    ip_tables              15096   2 [ipt_REJECT iptable_filter]
    ide-scsi               12176   0
    scsi_mod              107608   2 [sr_mod ide-scsi]
    ide-cd                 35808   0
    cdrom                  33728   0 [sr_mod ide-cd]
    CDCEther               14492   1
    acm                     7904   0 (unused)
    mousedev                5588   1
    keybdev                 2976   0 (unused)
    hid                    22340   0 (unused)
    input                   5920   0 [mousedev keybdev hid]
    usb-uhci               26412   0 (unused)
    usbcore                78944   1 [CDCEther acm hid usb-uhci]
           

    La primera columna muestra el nombre del módulo, la segunda su tamaño en memoria (en bytes), la tercera si está actualmene cargado (1) o no (0) y la cuarta y la quinta muestran información sobre si está en uso por otros módulos o no y, en su caso, cuáles son estos módulos).

  6. /proc/mounts. Proporciona información sobre los sistemas de archivos actualmente montados en el sistema (ver ejemplo en sección anterior).

  7. /proc/swaps. Muestra información sobre el estado de la memoria de intercambio, pero subdividido por particiones de intercambio. Conocer esta información puede ser interesante si el sistema dispone de múltiples particiones de este tipo.

  8. /proc/uptime. Ofrece el tiempo (en segundos) desde que el sistema se inició, y la cantidad de este tipo en que el procesador ha estado ocioso. Por ejemplo:

    3131.40 2835.67
           
  9. /proc/version. Muestra la versión del núcleo y la del compilador de C (gcc). En el caso de Red Hat Linux, muestra también la versión de Red Hat instalada:

    Linux version 2.4.20-20.8 (bhcompile@daffy.perf.redhat.com) 
    (gcc version 3.2 20020903 (Red Hat Linux 8.0 3.2-7)) 
    #1 Mon Aug 18 14:59:07 EDT 2003
           

En cuanto a los subdirectorios más relevantes de /proc/, podríamos destacar los siguientes:

  1. /proc/#número#/. Dentro de /proc/ existe un subdirectorio por cada proceso que actualmente es conocido por el sistema. El nombre del subdirectorio es precisamente el PID (Process IDentifier) del proceso, es decir, el número entero positivo por el cual el núcleo de Linux identifica unívocamente a cada proceso en el sistema. Dentro del subdirectorio correspondiente a cada proceso podemos encontrar varios subdirectorios y archivos. Por ejemplo, si sabemos que el PID del proceso que ejecuta el emacs en el que estamos editando estas líneas es el 20540, podemos ver su contenido:

    [root@yoda root]# ll /proc/20540
    total 0
    -r--r--r--    1 aterrasa aterrasa        0 dic  9 09:57 cmdline
    lrwxrwxrwx    1 aterrasa aterrasa        0 dic  9 09:57 cwd -> /home/aterrasa/
    /DOCBOOK/comos-linux-basico
    -r--------    1 aterrasa aterrasa        0 dic  9 09:57 environ
    lrwxrwxrwx    1 aterrasa aterrasa        0 dic  9 09:57 exe -> /usr/bin/emacs
    dr-x------    2 aterrasa aterrasa        0 dic  9 09:57 fd
    -r--r--r--    1 aterrasa aterrasa        0 dic  9 09:57 maps
    -rw-------    1 aterrasa aterrasa        0 dic  9 09:57 mem
    -r--r--r--    1 aterrasa aterrasa        0 dic  9 09:57 mounts
    lrwxrwxrwx    1 aterrasa aterrasa        0 dic  9 09:57 root -> /
    -r--r--r--    1 aterrasa aterrasa        0 dic  9 09:57 stat
    -r--r--r--    1 aterrasa aterrasa        0 dic  9 09:57 statm
    -r--r--r--    1 aterrasa aterrasa        0 dic  9 09:57 status
           

    De estos archivos, los más importantes son:

    • cmdline. Contiene la línea de órdenes que inició el proceso.

    • cwd. Es un enlace simbólico al directorio de trabajo actual del proceso.

    • environ. Contiene la lista de variables de entorno del proceso.

    • exe. Enlace simbólico que apunta al fichero ejecutable (normalmente binario) del proceso.

    • fd/. Directorio que contiene enlaces simbólicos a los descriptores de fichero abiertos por el proceso actualmente.

    • maps. Contiene información acerca de los mapas de memoria (virtual) ocupada por el proceso, incluyendo información sobre la ubicación de sus ejecutables y bibliotecas.

    • stat, statm, y status. Estos archivos contienen diferentes imágenes del estado actual del proceso, incluyendo estado de la memoria, información de protección, etc.

  2. /proc/self/. Enlace simbólico al subirectorio del proceso que actualmente está en ejecución.

  3. /proc/fs/. Contiene información sobre los directorios que actualmente se están exportando (sólo tiene información si el sistema es un servidor NFS).

  4. /proc/ide/. Contiene información sobre los discos duros IDE que están conectados en el sistema, incluyendo datos de los manejadores, opciones de configuración y estadísticas de uso.

  5. /proc/net/. Este directorio contiene información exhaustiva sobre protocolos, parámetros y estadísticas relacionadas con el acceso a la red.

  6. /proc/scsi/. Equivale al directorio /proc/ide/, pero para dispositivos SCSI.

  7. /proc/sys/. Este subdirectorio es especial y distinto del resto de directorios que hemos visto hasta ahora, puesto que no sólo permite leer informacion actual del núcleo, sino que permite modificarla en algunos casos. Esto se explica con más detalle en la siguiente sección.