NOTA: Este documento está en parte no traducido. Las partes no traducidas han sido acotadas con la palabra ---FIXME---. ----------------------------------------------------------------------- E L S I S T E M A D E F I C H E R O S /proc ----------------------------------------------------------------------- /proc/sys Terrehon Bowden 27 Enero 1999 Bodo Bauer Traducción: David Martínez 27 Noviembre 2000 ----------------------------------------------------------------------- Versión 1.1 Kernel version 2.2 ----------------------------------------------------------------------- Contenidos 1 Introducción/Créditos. 1.1 Asuntos legales. 2 El sistema de ficheros /proc. 2.1 Subdirectorios específicos de cada proceso. 2.2 Datos del núcleo. 2.3 Dispositivos IDE en /proc/ide. 2.4 Información de red en /proc/net. 2.5 Información SCSI. 2.6 Información de puertos paralelos en /proc/parport. 2.7 Información sobre TTY en /proc/tty. 3 Leyendo y modificando parámetros del núcleo. 3.1 /proc/sys/debug y /proc/sys/proc. 3.2 /proc/fs - Datos de los sistemas de ficheros. 3.3 /proc/fs/binfmt_misc - Formatos binarios variados. 3.4 /proc/sys/kernel - Parámetros generales del núcleo. 3.5 /proc/sys/vm - El subsistema de memoria virtual. 3.6 /proc/sys/dev - Parámetros específicos de dispositivos. 3.7 /proc/sys/sunrpc - Llamadas a procedimiento remoto (RPC's). 3.8 /proc/sys/net - Cosas relativas a redes. 3.9 /proc/sys/net/ipv4 - Opciones de IPv4. 3.10 Appletalk. 3.11 IPX. ----------------------------------------------------------------------- 1 Introducción/Créditos. Esta documentación es parte de un libro que saldrá próximamente a la venta publicado por IDG Books en la distribución SuSE de Linux. Como no hay una documentación completa para el sistema de ficheros /proc, y hemos usado muchas fuentes gratuitas para escribir este capítulo, parece normal devolver el trabajo a la comunidad Linux. Este trabajo está basado en las versiones 2.1.132 y los núcleos pre-2.2.0. Me preocupa que este manual esté lejos de estar completo, pero espero que resulte útil. Por lo que sé, este es el primer documento tipo "todo en uno" sobre el sistema de ficheros /proc. Está enfocado en hardware Intel x86, así que si está buscando características de PPC, ARM, SPARC, APX, etc., probablemente no encontrará lo que busca. Además cubre sólamente redes IPv4, pero ni IPv6 ni otros protocolos (lo siento). Querríamos dar las gracias a Alan Cox, Rik van Riel, y Alexey Kuznetsov. También queremos extender nuestro agradecimiento a Andi Kleen por su documentación, que usamos de forma intensiva para crear este documento, así como la información adicional que nos consiguió. Gracias también a todo aquel que haya contribuido con fuentes o documentos para el núcleo Linux y haber ayudado a crear una estupenda pieza de software. Si tiene algún comentario, correcciones, o algo para añadir, por favor, no dude en contactar con Bodo Bauer en bb@ricochet.net. Nos alegrará añadirlo a este documento. La última versión de este documento está disponible en http://www.suse.com/~bb/Docs/proc.html como fichero HTML, ASCII, y Postscript. 1.1 Asuntos legales. No garantizamos la exactitud de este documento, y si nos viene quejándose sobre cómo se ha cargado su sistema debido a una documentación incorrecta, no nos sentiremos responsables... ----------------------------------------------------------------------- 2 El sistema de ficheros /proc. El sistema de ficheros /proc actúa como una interfaz para las estructuras internas de datos del núcleo. Puede usarse para obtener información sobre el sistema y para cambiar ciertos parámetros del núcleo mientras se ejecuta. Contiene (entre otras cosas) un subdirectorio por cada proceso ejecutándose en el sistema ---FIXME-->which is named after the process id (PID) of the process.<--FIXME--- El enlace self apunta al proceso que esté leyendo el sistema de ficheros. 2.1 Subdirectorios específicos de cada proceso. Cada subdirectorio de proceso contiene los elementos listados en la tabla 1.1. _________________________________________________ cmdline Argumentos de la línea de comandos. environ Valores de las variables de entorno. fd Directorio, que contiene todos los descriptores de ficheros. mem Memoria retenida por este proceso. stat Estado del proceso. status Estado del proceso en forma humanamente legible. cwd Enlace al directorio actual de trabajo. exe Enlace al ejecutable de este proceso. maps Mapas de memoria. root Enlace al directorio raíz de este proceso. statm Información del estado de la memoria del proceso. _________________________________________________ Tabla 1.1: Elementos específicos de cada proceso en /proc. Por ejemplo, para obtener la información de estado de un proceso, todo lo que tiene que hacer es leer el fichero /proc/PID/status: > cat /proc/self/status Name: cat State: R (running) Pid: 5633 PPid: 5609 Uid: 501 501 501 501 Gid: 100 100 100 100 Groups: 100 16 VmSize: 804 kB VmLck: 0 kB VmRSS: 344 kB VmData: 68 kB VmStk: 20 kB VmExe: 12 kB VmLib: 660 kB SigPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000000000 SigCgt: 0000000000000000 CapInh: 00000000fffffeff CapPrm: 0000000000000000 CapEff: 0000000000000000 Esto le muestra casi la misma información que obtendría si lo viese con el comando ps. De hecho, ps usa el sistema de ficheros /proc para obtener la información que muestra. El fichero statm contiene información más detallada sobre el uso de memoria del proceso. Contiene siete valores que significan lo siguiente: size tamaño total del programa. resident size of in memory portions. ---FIXME--- shared número de páginas que están compartidas. trs número de páginas que son 'código'. drs número de páginas de datos/pila. lrs número de páginas de biblioteca (library). dt número de páginas marcadas como sucias. La relación texto/datos/biblioteca sólo se puede aproximar por heurística. 2.2 Datos del núcleo. De manera similar a las entradas para procesos, hay ficheros que dan información sobre el núcleo que está ejecutándose. Los ficheros necesarios para obtener dicha información se hallan en /proc y están listados en la tabla 1.2. No todos estos ficheros estarán presentes en su sistema. Depende de la configuración del núcleo y de los módulos que haya cargados, el que estos ficheros existan o no. ________________________________________________ apm Información de la gestión avanzada de energía. cmdline Línea de comandos del núcleo. cpuinfo Información sobre la CPU. devices Dispositivos disponibles (de bloques y de caracteres). dma Canales DMA usados. filesystems Sistemas de ficheros soportados. interrupts Uso de interrupciones. ioports Uso de puertos de E/S (I/O ports). kcore Imagen del centro del núcleo. ---FIXME--- ¿Kernel core image? kmsg Mensajes del núcleo. ksyms Tabla de símbolos del núcleo. loadavg Carga media. locks Bloqueos del núcleo. meminfo Información de memoria. misc Miscelánea. modules Lista de módulos cargados. mounts Sistemas de ficheros montados. partitions Tabla de particiones que el sistema conoce. rtc Reloj en tiempo real. slabinfo Información de la slab pool ---FIXME--- stat Estadísticas globales. ---FIXME--- Overall statistics? swaps Utilización del espacio de intercambio. uptime Tiempo que lleva encendido el sistema. version Versión del núcleo. ________________________________________________ Tabla 1.2: Información del núcleo en /proc. Puede, por ejemplo, revisar qué interrupciones estén actualmente en uso y para qué están siendo usadas mirando en el fichero /proc/interrupts: > cat /proc/interrupts CPU0 0: 8728810 XT-PIC timer 1: 895 XT-PIC keyboard 2: 0 XT-PIC cascade 3: 531695 XT-PIC aha152x 4: 2014133 XT-PIC serial 5: 44401 XT-PIC pcnet_cs 8: 2 XT-PIC rtc 11: 8 XT-PIC i82365 12: 182918 XT-PIC PS/2 Mouse 13: 1 XT-PIC fpu 14: 1232265 XT-PIC ide0 15: 7 XT-PIC ide1 NMI: 0 Hay tres directorios más de importancia en /proc: net, scsi y sys. La regla de oro es que los contenidos, o incluso la existencia misma de estos directorios depende de la configuración de su núcleo. Si no está activado el soporte scsi, el directorio scsi puede no existir. Lo mismo es cierto con net, que sólo está ahí cuando el soporte de red está presente en el núcleo actual. El fichero slabinfo da información sobre el uso de memoria en el ---FIXME--- slab level. Linux usa ---FIXME---slab pools para la gestión de memoria por encima del nivel de página en la versión 2.2. Los objetos usados más comúnmente tienen su propia ---FIXME--- slab pool (como buffers de red, caché de directorio, etc.). 2.3 Dispositivos IDE en /proc/ide. Este directorio contiene información sobre todos los dispositivos IDE de los que el núcleo está al tanto. Hay un subdirectorio por cada dispositivo (p.ej. disco duro) que contiene los siguientes ficheros: cache La caché. capacity Capacidad del medio. driver Controlador y versión. geometry Geometría física y lógica. identify Bloque de identidad del dispositivo. media Tipo de medio. model Identificador del dispositivo. settings Configuración del dispositivo. smart_thresholds IDE disk management thresholds ---FIXME--- smart_values IDE disk management values 2.4 Información de red en /proc/net. Este directorio sigue la tendencia anterior. La tabla 1.3 lista los ficheros y su significado. ____________________________________________________ arp Tabla de ARP del núcleo. dev Dispositivos de red con sus estadísticas. dev_mcast Lista los grupos multicast Layer2 a los que un dispositivo está escuchando (índice de interfaz, etiqueta, número de referencias, número de direcciones enlazadas). dev_stat Estado del dispositivo de red. ip_fwchains Enlaces de cadenas del cortafuegos (firewall chain linkage). ip_fwnames Cadenas del cortafuegos. ip_masq Directorio que contiene las tablas de enmascaramiento. ip_masquerade Tabla de enmascaramiento mayor (major masquerading table). ---FIXME--- netstat Estadísticas de red. raw Estadísticas del dispositivo en bruto. route Tabla de enrutado del núcleo. rpc Directorio que contiene información de RPC. rt_cache Caché de enrutado. snmp Datos sobre SNMP. sockstat Estadísticas de sockets. tcp Sockets TCP. tr_rif Tabla de enrutado RIF para Token Ring. udp Sockets UDP. unix Sockets del dominio UNIX. wireless Datos del interfaz inalámbrico (Wavelan, etc.). igmp Direcciones multicast IP a las que este ---FIXME---host se ha unido. psched Parámetros del planificador de paquetes globales. (Global packet scheduler parameters) netlink Lista de sockets PF_NETLINK. ip_mr_vifs Lista de interfaces virtuales multicast. ip_mr_cache Lista del caché de enrutado multicast. udp6 Sockets UDP (IPv6). tcp6 Sockets TCP (IPv6). raw6 Estadísticas del dispositivo en bruto(raw) (IPv6). igmp6 Direcciones multicast IP a las que se ha unido este ---FIXME---host (IPv6). if_inet6 Lista de direcciones de interfaces IPv6. ipv6_route Tabla de enrutado del núcleo para IPv6. rt6_stats Estadísticas globales de las tablas de enrutado de IPv6. sockstat6 Estadísticas de sockets (IPv6). snmp6 Datos sobre SNMP (IPv6). ____________________________________________________ Tabla 1.3: Información de red en /proc/net. Puede usar esta información para ver qué dispositivos de red están disponibles en su sistema y cuánto tráfico fue encaminado a esos dispositivos: > cat /proc/net/dev Inter-|Receive |[... face |bytes packets errs drop fifo frame compressed multicast|[... lo: 908188 5596 0 0 0 0 0 0 [... ppp0:15475140 20721 410 0 0 410 0 0 [... eth0: 614530 7085 0 0 0 0 0 1 [... ...] Transmit ...] bytes packets errs drop fifo colls carrier compressed ...] 908188 5596 0 0 0 0 0 0 ...] 1375103 17405 0 0 0 0 0 0 ...] 1703981 5535 0 0 0 3 0 0 2.5 Información SCSI. Si tiene un adaptador de ---FIXME---host SCSI, encontrará subdirectorios en /proc/scsi que llevan por nombre el controlador del adaptador. También puede ver una lista de todos los dispositivos SCSI reconocidos en /proc/scsi: >cat /proc/scsi/scsi Attached devices: Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: QUANTUM Model: XP34550W Rev: LXY4 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi0 Channel: 00 Id: 01 Lun: 00 Vendor: SEAGATE Model: ST34501W Rev: 0018 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi0 Channel: 00 Id: 02 Lun: 00 Vendor: SEAGATE Model: ST34501W Rev: 0017 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi0 Channel: 00 Id: 04 Lun: 00 Vendor: ARCHIVE Model: Python 04106-XXX Rev: 703b Type: Sequential-Access ANSI SCSI revision: 02 El directorio bajo el nombre de cada controlador contiene un fichero por cada adaptador encontrado en el sistema. Estos ficheros contienen información sobre el dispositivo, como la IRQ y el rango de direcciones de E/S: >cat /proc/scsi/ncr53c8xx/0 General información: Chip NCR53C875, device id 0xf, revision id 0x4 IO port address 0xec00, IRQ número 11 Synchronous period factor 12, max commands per lun 4 2.6 Información de puerto paralelo en /proc/parport. El directorio /proc/parport contiene información sobre los puertos paralelos de su sistema. Tiene un subdirectorio por cada puerto, cuyo nombre es el número del puerto (0,1,2,...). Este directorio contiene cuatro ficheros: autoprobe Resultados del sondeo automático para este puerto. devices Módulos de dispositivo conectados. hardware Información del hardware (tipo de puerto, E/S del puerto, DMA, IRQ, etc.) irq Interrupción usada, si la hay. 2.7 Información de TTY en /proc/tty. Se puede encontrar información sobre las tty's disponibles y las que están siendo usadas, en /proc/tty. En este directorio encontrará entradas para los controladores y las disciplinas de la línea, como se muestra en la tabla inferior: drivers Lista de controladores y su uso. ldiscs Disciplinas de línea registradas. driver/serial Estadística de uso y estado de las líneas de una sola tty. Para ver qué tty's están actualmente en uso, puede mirar sencillamente dentro del fichero /proc/tty/drivers: >cat /proc/tty/drivers pty_slave /dev/pts 136 0-255 pty:slave pty_master /dev/ptm 128 0-255 pty:master pty_slave /dev/ttyp 3 0-255 pty:slave pty_master /dev/pty 2 0-255 pty:master serial /dev/cua 5 64-67 serial:callout serial /dev/ttyS 4 64-67 serial /dev/tty0 /dev/tty0 4 0 system:vtmaster /dev/ptmx /dev/ptmx 5 2 system /dev/console /dev/console 5 1 system:console /dev/tty /dev/tty 5 0 system:/dev/tty unknown /dev/tty 4 1-63 console ----------------------------------------------------------------------- 3 Leyendo y modificando parámetros del núcleo. Una parte muy interesante /proc es el directorio /proc/sys. No sólo proporciona información, sino que además le permite cambiar parámetros de dentro del núcleo. Sea muy cuidadoso cuando intente esto. Puede optimizar su sistema, pero también puede dejarlo "fuera de combate". Nunca juegue a tocar los parámetros del núcleo de un sistema en producción. Instale una máquina de desarrollo y haga las pruebas en ella para asegurarse de que todo funciona de la manera que desea. Puede no tener más alternativa que reiniciar la máquina una vez que se ha cometido un error. Para cambiar un valor, simplemente escriba el nuevo valor en el fichero. Más abajo se da un ejemplo en la sección de datos del sistema de ficheros. Necesita ser root para hacer esto. Puede crear su propio script de inicio para conseguir que todo esto se haga cada vez que su sistema arranque. Los ficheros en /proc/sys pueden usarse para ajustar y controlar distintos aspectos generales de la operación del núcleo Linux. Ya que algunos ficheros pueden interferir de forma inadvertida con su sistema, es aconsejable leer tanto la documentación como las fuentes antes de hacer realmente ajustes. En cualquier caso, sea muy cuidadoso cuando escriba en cualquiera de estos ficheros. Las entradas en /proc pueden cambiar ligeramente entre los núcleos 2.1.* y el núcleo 2.2, así que revise la documentación si le surge alguna duda. Encontrará la documentación en el directorio /usr/src/linux/Documentation/sys. Este capítulo está en gran parte basado en la documentación incluída en los núcleos pre-2.2. Gracias a Rick van Riel por proporcionar toda esa información. 3.1 /proc/sys/debug y /proc/sys/proc. Estos dos subdirectorios están vacíos. 3.2 /proc/fs - Datos del sistema de ficheros. Este subdirectorio contiene información específica del sistema de ficheros, manipuladores de ficheros, inodos, entradas de directorio (llamadas "dentry") y cuotas. Actualmente, estos ficheros están en /proc/sys/fs: dentry-state Estado del caché de directorios. Ya que las entradas de directorio son alojadas y desalojadas dinámicamente, este fichero da información sobre el estado actual. Mantiene seis valores, de los que los dos últimos son siempre cero y no se usan. Los otros cuatro significan: nr_dentry Parece ser cero todo el tiempo. nr_unused Número de entradas del caché sin usar. age_limit Tiempo en segundos tras el que una entrada puede reclamarse, cuando la memoria escasee. want_pages Interno. dquot-nr y dquot-max El fichero dquot-max muestra el máximo número de entradas de cuota de disco en el caché. El fichero dquot-nr muestra el número de entradas de cuotas de disco alojadas y el número de entradas de cuota de disco libres. Si el número de cuotas de disco libres es muy baja y tiene un gran número de usuarios simultáneos en el sistema, podría querer aumentar el límite. file-nr y file-max El núcleo aloja manipuladores de fichero de forma dinámica, pero al menos por el momento no los libera de nuevo. El valor en file-max denota el número máximo de manipuladores de fichero de forma dinámica que el núcleo de Linux alojará. Si obtuviese un montón de mensajes de error referentes a escasez de manipuladores de fichero (running out of file handles), podría querer aumentar este límite. El valor por defecto es 4096. Para cambiarlo, simplemente escriba el nuevo valor en el fichero: # cat /proc/sys/fs/file-max 4096 # echo 8192 > /proc/sys/fs/file-max # cat /proc/sys/fs/file-max 8192 Este método de modificación es prácticamente el mismo para todos los parámetros del núcleo susceptibles de ser modificados; simplemente introduzca el nuevo valor en el fichero correspondiente. Los tres valores de file-nr denotan el número de manipuladores de fichero alojados, los usados, y el número máximo de ellos. Cuando el número de manipuladores de fichero alojados se acerque al máximo, pero el número de los que estén siendo usados sea mucho menor, habrá encontrado un pico en el uso de manipuladores y no necesitará incrementar el máximo.---FIXME---(esto no está claro) Sin embargo, hay además un límite en el número de ficheros abiertos por proceso que, por desgracia, no se puede cambiar tan fácilmente. Su valor por defecto es 1024. Para cambiarlo tiene que editar los ficheros limits.h y fs.h del directorio /usr/src/linux/include/linux. Cambie la definición de NR_OPEN y recompile el núcleo. inode-state, inode-nr y inode-max Como sucede con los manipuladores de fichero, el núcleo aloja las estructuras de inodo dinámicamente, pero no las puede liberar de inmediato. El valor en inode-max denota el máximo número of manipuladores de inodo. Este valor debería ser 3 ó 4 veces más grande que el valor de file-max, ya que también se necesitan estructuras de inodo para manejar stdin, stdout, y los sockets de red. Si se queda sin inodos de una forma regular, debería incrementar este valor. El fichero inode-nr contiene los dos primeros valores de inode-state, así que pasaremos a ese fichero... inode-state contiene actualmente tres números y cuatro valores inútiles. Los números son (por orden) nr_inodes, nr_free_inodes, y preshrink. nr_inodes Representa el número de inodos que tiene alojados el sistema. Puede ser ligeramente superior que inode-max porque Linux utiliza páginas completas de memoria para alojarlos. nr_free_inodes Represents the number of free inodes and pre shrink is nonzero when the nr_inodes > inode-max and the system needs to prune the inode list instead of allocating more.---FIXME--- (frase espantosa donde las haya) super-nr y super-max De nuevo, el núcleo aloja estructuras de superbloque pero no las libera. El fichero super-max contiene el número máximo de manipuladores de superbloque, mientras que super-nr muestra el número de los alojados actualmente. Cada sistema de ficheros montado necesita un superbloque, así que si planea montar montones de sistemas de ficheros, puede que necesite aumentar estos valores. 3.3 /proc/fs/binfmt_misc - Formatos binarios variados. Para estos ficheros, existe el subdirectorio /proc/sys/fs/binfmt_misc. Éste maneja el soporte que el núcleo proporciona para formatos binarios variados. Binfmt_misc proporciona la posibilidad de registrar formatos binarios adicionales en el núcleo sin tener que compilar un módulo o núcleo adicional. Es por ello que binfmt_misc necesita conocer los números mágicos (o «magic») del comienzo del fichero o la extensión de fichero del binario en cuestión. Funciona manteniendo una lista enlazada de estructuras que contienen una descripción del formato binario, incluyendo un número mágico y su tamaño (o la extensión del fichero), offset y máscara, y el nombre del intérprete. Cuando se solicita, se inicia el intérprete especificado con el programa original como argumento, como hacen binfmt_java, binfmt_em86 y binfmt_mz. Ya que binfmt_misc no define ningún formato binario por defecto, habrá de registrar un formato adicional. Hay dos ficheros generales en binfmt_misc y un fichero por cada formato registrado. Los dos ficheros generales son register y status. Cómo registrar un nuevo formato binario echo :nombre:tipo:offset:magic:máscara:intérprete: > /proc/sys/fs/binfmt_misc/register con valores apropiados en nombre (el nombre para la entrada del directorio /proc), offset (por defecto 0, si se omite), número mágico (magic) y máscara (que pueden ser omitidos, valiendo por defecto 0xff) y por último pero no por ello menos importante, el intérprete al que se va a llamar (por ejemplo, y para probar, '/bin/echo'). El tipo puede ser M para usar número mágico o E para usar una extensión de fichero (dé la extensión en lugar del número mágico). Para revisar o poner a cero el estado del manipulador de formato binario: Si hace un cat en el fichero /proc/sys/fs/binfmt_misc/status, obtendrá el estado actual (activado/desactivado) de binfmt_misc. Cambie el estado escribiendo 0 (desactivar) o 1 (activar) o -1 (cuidado: esta opción borra todo formato binario registrado con anterioridad) en status. Por ejemplo, escriba echo 0 > status para desactivar binfmt_misc (temporalmente). Estado de un manipulador Cada manipulador registrado tiene una entrada en /proc/sys/fs/binfmt_misc. Estos ficheros realizan la misma función que status, pero su ámbito de acción se limita al formato binario actual. Leyendo el contenido de este fichero, recibirá toda la informacíon relativa al intérprete o al número mágico del formato binario. Un ejemplo de uso de binfmt_misc (emulando binfmt_java) cd /proc/sys/fs/binfmt_misc echo ':Java:M::\xca\xfe\xba\xbe::/usr/local/java/bin/javawrapper:' > register echo ':HTML:E::html::/usr/local/java/bin/appletviewer:' > register echo ':Applet:M::