DESARROLLO
La palabra "procfs" proviene de "process file system". Antes de
comenzar a estudiar el directorio /proc de Linux, es necesario comprender el
término "archivo virtual". La mayoría de usuarios de computadoras comprenderán
con mucha facilidad el término archivo relacionándolo directamente con ejemplos
tales como los archivos de texto que se pueden generar con cualquier procesador
de texto. Una característica de este tipo de archivos es que a mayor texto que
almacena el archivo, mayor es el espacio en disco que consume dicho archivo. Por
ejemplo, una línea corta de texto ocupa menos espacio en disco que esa misma
línea copiada cien veces. Sin embargo al hablar de "archivos virtuales"
las cosas son diferentes, pues este tipo de archivos no consumen espacio en el
disco duro, sino que se almacenan en la memoria volátil, es decir la aquel tipo
de memoria cuya información se pierde al interrumpirse el flujo de corriente
eléctrica, esto es, la memoria RAM.
Para comprobar la diferencia entre un archivo que se almacena en el disco duro y
un archivo virtual, se puede hacer el experimento de usar el comando "du"
para ver el tamaño de un archivo virtual y luego el comando "cat" para
ver su contenido, de esta forma:
root1@root:~$ du /proc/acpi/processor/CPU0/info
0 /proc/acpi/processor/CPU0/info
root1@root:~$ cat /proc/acpi/processor/CPU0/info
processor id: 0
acpi id: 0
bus mastering control: no
power management: no
throttling control: no
limit interface: no
Como se pudo ver en el ejemplo anterior, al usar "du /proc/acpi/processor/CPU0/info"
aparece que el archivo /proc/acpi/processor/CPU0/info usa un espacio en
el disco duro de 0, es decir que no está consumiendo absolutamente nada de
espacio en el disco duro. Sin embargo, al usar "cat /proc/acpi/processor/CPU0/info"
se muestra que /proc/acpi/processor/CPU0/info contiene la siguiente
información:
processor id: 0
acpi id: 0
bus mastering control: no
power management: no
throttling control: no
limit interface: no
Parece imposible que un archivo que contiene 6 líneas de información tenga un
tama ño de 0. Sin embargo con esto se concluye que /proc/acpi/processor/CPU0/info
es un archivo virtual, es decir que aunque tenga un tamaño de 0 bytes, puede
contener una gran cantidad de información.
Otra prueba interesante que se le puede hacer al archivo /proc/acpi/processor/CPU0/info
es la siguiente:
root1@root:~$ ls -la /proc/acpi/processor/CPU0/info
-r--r--r-- 1 root root 0 2007-09-06 21:53 /proc/acpi/processor/CPU0/info
Al listar el archivo con "ls -la", aparece la hora "21:53".
Suponiendo que 8 minutos más tarde se vuelve a realizar el mismo procedimiento,
el resultado será:
root1@root:~$ ls -la /proc/acpi/processor/CPU0/info
-r--r--r-- 1 root root 0 2007-09-06 22:01 /proc/acpi/processor/CPU0/info
Lo que se muestra con eso es que el archivo /proc/acpi/processor/CPU0/info está
siendo modificado constantemente aún cuando el usuario no lo esté abriendo ni
guardando cambios en dicho archivo. Eso también revela el comportamiento de un
archivo virtual.
Debido a que el contenido de /proc no se encuentra guardado en ningún
dispositivo físico (disco duro, CD, DVD, etc.), sino que es construido y
presentado dinámicamente, al listar el contenido de uno de los directorios que
se encuentra dentro de /proc en dos momentos diferentes, es probable que
el contenido no coincida debido a que se reflejará lo que hay en dos momentos
distintos, en cada uno de los cuales se mostrará el estado actual del núcleo o
kernel de Linux en un tiempo determinado. Por esa razón el contenido de /proc
varía con el tiempo y de un sistema a otro (por ejemplo, al disponer de hardware
distinto). Lo mismo ocurre al visualizar gráficamente el contenido de /proc,
que todo se mantiene en actualización constante y pueden aparecer nuevos
directorios o desaparecer algunos sin que el usuario haya hecho ningún cambio
añadiendo o eliminando archivos o directorios.
Se puede afirmar entonces que el sistema de archivos virtual /proc
permite conocer el estado interno del núcleo o kernel de Linux desde nivel de
usuario.
El sistema de archivos /proc permite tanto revisar el estado como también
modificar el comportamiento del kernel o núcleo de Linux en cualquier momento.
Como una excelente definición de /proc, se puede decir que es una
interfaz entre el kernel o núcleo de Linux y el nivel de usuario con la forma de
un sistema de archivos virtual. La utilidad que esto tiene es que se puede
obtener y modificar la información del núcleo de Linux interactuando con el
sistema de archivos /proc.
Cambiar Archivos Virtuales
En general, todos los archivos que se encuentran en el directorio /proc
solamente se pueden leer. Sin embargo, algunos se pueden usar para ajustar la
configuración del kernel. Esto ocurre con los archivos del subdirectorio /proc/sys.
Para cambiar el valor de un archivo virtual se debe usar el comando "echo" y el
símbolo ">", para redirigir el nuevo valor al archivo. Por ejemplo, para cambiar
el nombre del host simplemente se debe escribir lo siguiente:
echo www.jaimemontoya.com > /proc/sys/kernel/hostname
Otros archivos actúan como conmutadores binarios o booleanos. Por ejemplo al
escribir "cat /proc/sys/net/ipv4/ip_forward" se verá el valor 0 o
el valor 1. El valor 0 indica que el kernel no está realizando el
reenvío de paquetes. Si se usa el comando "echo" para cambiar el valor del
archivo ip_forward a 1, el kernel activará inmediatamente el reenvío de
paquetes:
echo 1 > /proc/sys/net/ipv4/ip_forward
Como se puede ver, /proc es capaz de cambiar el comportamiento del kernel en
varios aspectos. Aunque después de reiniciar el sistema, los cambios hechos en /proc
se van, debido a que el kernel no guarda dichos cambios para uso posterior, se
pueden hacer cambios permanentes recompilando el kernel, de modo que los scripts
de init (la madre o padre de todos los procesos) escriban a /proc y que no se
tengan que estar editando los archivos virtuales de /proc cada vez que se
reinicie la computadora.
Obtención de Información Útil del Sistema/Kernel desde /proc
El sistema de archivos virtual /proc puede ser usado para obtener útil
información acerca del sistema y del kernel en ejecución. Algunos de los
archivos virtuales de frecuente uso son:
· /proc/cpuinfo - información sobre el CPU (modelo, familia, tamaño de la
memoria caché, etc)
· /proc/meminfo - información sobre la memoria RAM física, espacio de
intercambio swap, etc.
· /proc/mounts - lista de los sistemas de archivos montados.
· /proc/devices - lista de todos los dispositivos disponibles
· /proc/filesystems - lista de los sistemas de archivos soportados.
· /proc/modules - lista de módulos cargados.
· /proc/version - versión del kernel.
· /proc/cmdline - parámetros pasados al kernel al momento de iniciar.
Directorios en /proc
Primeramente aparecen los directorios de proceso, los cuales pueden hacer
referencia al ID de un proceso y contener información específica de ese proceso.
Por ejemplo pueden tenerse los siguientes directorios de proceso:
· /proc/1
· /proc/1177
· /proc/2335
· /proc/4536
· /proc/586
· /proc/9
El directorio /proc/acpi es justamente para el sistema ACPI (Advanced
Configuration and Power Interface), que fue diseñado para permitir al sistema
operativo configurar y controlar los componentes individuales de hardware. Por
ejemplo, ACPI puede mostrar información sobre la batería en una laptop, el
adaptador de corriente AC, la temperatura, ventilador del procesador, etc. Por
ejemplo la temperatura se puede conocer de esta forma:
root1@root:~$ cat /proc/acpi/thermal_zone/THRM/temperature
temperature: 40 C
El directorio /proc/asound muestra información acerca de los controladores de
audio. Debe tenerse presente que /proc/asound solamente existirá después que se
haya insertado el primer módulo ALSA (en el caso de Linux Debian Etch al haber
ejecutado "# apt-get install alsa-*" por ejemplo, para la instalación de los
controladores para la tarjeta de sonido). Si no existiera /proc/asound,
simplemente significa que el módulo de sonido no fue cargado correctamente.
El directorio /proc/bus contiene información específica sobre los diversos buses
disponibles en el sistema. Por ejemplo /proc/bus/pci contiene los datos actuales
de los buses PCI disponibles, mientras que /proc/bus/usb contiene la información
de los buses USB disponibles.
/proc/driver es un directorio que contiene información para drivers específicos
que el kernel está utilizando.
/proc/fs muestra qué sistemas de archivos están siendo exportados. Esto consiste
en montar sistemas de archivos sobre la red e interactuar con esos sistemas de
archivos como si estuvieran montados localmente.
El directorio /proc/ide contiene información sobre los dispositivos IDE del
sistema. Cada canal IDE está representado como un directorio separado, por
ejemplo /proc/ide/ide0 y /proc/ide/ide1.
/proc/irq es un directorio que se usa para configurar la afinidad de una IRQ con
una CPU. La palabra IRQ proviene de Interrupt ReQuest, donde una interrupción es
simplemente una señal que el hardware puede enviar cuando quiere la atención del
procesador.
El directorio /proc/net proporciona una visión exhaustiva de diversos parámetros
y estadísticas de red. Cada directorio y archivo virtual dentro de este
directorio describe aspectos sobre la configuración de la red del sistema.
El directorio /proc/scsi es para dispositivos SCSI conectados.
/proc/self crea un enlace al proceso en ejecución. Esto le permite verse a sí
mismo sin tener que conocer su ID de proceso. Dentro de un entorno de la Shell,
una lista del directorio /proc/self produce el mismo contenido que una lista del
directorio del proceso para ese proceso. Esto significa que con /proc/self
se
puede mostrar el proceso actual o el proceso en ejecución en un momento dado.
Por ejemplo:
root1@root:~$ ls -lah /proc/self
lrwxrwxrwx 1 root root 64 2007-09-07 01:59 /proc/self -> 6394
Se muestra que el proceso en ejecución es el 6394.
El directorio /proc/sys es diferente de otros en /proc porque no sólo
proporciona información sobre el sistema sino también permite al administrador
activar y desactivar características del kernel. Una buena forma de determinar
si un archivo particular se puede configurar o si solamente está diseñado para
proporcionar información es viendo los permisos que tiene dicho archivo. Si el
root o superusuario tiene permisos de escritura, entonces es un archivo que se
puede modificar, pero si solamente existen permisos de lectura, el archivo es
únicamente para mostrar información y no para que sea modificado.
El directorio /proc/tty proporciona información acerca de los dispositivos tty
disponibles y que se están usando en el sistema.
Obviamente el /proc es una herramienta poderosa con muchísimas aplicaciones
útiles. Por ejemplo se puede conocer en detalle la información del CPU de esta
manera:
root1@root:~$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 10
model name : AMD Athlon(tm) XP 2800+
stepping : 0
cpu MHz : 2083.242
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36
mmx fxsr sse syscall mmxext 3dnowext 3dnow ts
bogomips : 4170.79
A continuación se explica cada una de las salidas que resultaron de ejecutar "$
cat /proc/cpuinfo".
"processor: 0"= significa que el número "0" es el que el sistema le ha dado al
procesador para identificarlo. Suponiendo que hubiera existido otro procesador,
podría haber aparecido "processor: 3". Nunca puede repetirse el número, pues
cada procesador es identificado por un número único.
"vendor_id: AuthenticAMD"= identifica el fabricante del CPU.
"cpu family: 6" = muestra la familia de procesadores a la que pertenece el
procesador detectado por el sistema, en este caso a la familia 6, a la que
también pertenecen procesadores tales como Pentium II, Pentium III, Intel Core™
Duo processor, Intel Core™2 Duo processor, etc.
"model: 10" = es el modelo específico del procesador en relación a los de su
mismo tipo, donde un modelo con un número mayor que "10" correspondería en este
caso a una versión más reciente mientras que un modelo con un número menor que
"10" sería una versión o modelo más atrasado cronológicamente hablando
"model name: AMD Athlon(tm) XP 2800+" = releva el nombre completo del modelo del
procesador.
"stepping: 0" = entre menor es el número, más atrasada es la revisión que se le
ha hecho al procesador. Ningún procesador es perfecto, de modo que luego de
sacarlos al mercado, al hacer nuevas revisiones y mejoras significativas, el
número irá aumentando.
"cpu MHz: 2083.242" = muestra la velocidad del procesador en MHz.
"cache size: 512 KB"= la memoria caché es un conjunto de datos duplicados de
otros datos originales, con la propiedad de que los datos originales son
costosos de acceder, normalmente en tiempo, respecto a la copia en el caché.
Cuando se accede por primera vez a un dato, se hace una copia en el caché; los
accesos siguientes se realizan a dicha copia, haciendo que el tiempo de acceso
medio al datos sea menor. En este caso el procesador cuenta con 512 KB de
memoria caché.
"fdiv_bug: no" = el 30 de octubre de 1994 el profesor Thomas Nicely descubrió un
error en la unidad de coma flotante del Intel Pentium. Nicely observó que
algunas operaciones de división devolvían siempre un valor erróneo por exceso.
Otras personas confirmaron rápidamente estos errores en las divisiones. Este
fallo de diseño se hizo notorio muy rápidamente y se le dio el nombre de "error
FDIV del Pentium" (FDIV es la instrucción de división en coma flotante de los
microprocesadores x86. En este caso el procesador AMD Athlon(tm) XP 2800+ no
tiene ese error.
"hlt_bug: no" = HLT es una instrucción de lenguaje ensamblador que detiene el
procesador cuando no hay trabajo por hacer, reduciendo significativamente el
calentamiento del procesador. El procesador en estudio no tiene errores con la
ejecución de esta instrucción.
"f00f_bug: no" = el procesador no tiene el error "f00f", que consiste en que
cuando el procesador recibe una instrucción específica inválida, la computadora
podría dejar de responder hasta que se apague o reinicie. Este procesador en
estudio no tiene ese error.
"coma_bug: no" = en este caso el CPU se queda en un ciclo infinito ejecutando
instrucciones pero no respondiendo a ningún estímulo externo. Es contrario al
"f00f_bug", donde el procesador se detiene. En el caso de "coma_bug", el
procesador en vez de detenerse se mantiene operando pero igualmente sin
responder correctamente.
"fpu: yes" = el procesador es capaz de trabajar con FPU (Floating Point Unit),
es decir punto flotante en los cálculos.
"fpu_exception: yes"= el procesador automáticamente detecta y maneja excepciones
o condiciones que pueden afectar potencialmente un cálculo, por ejemplo dividir
entre cero ("x / 0") o la raíz de un número negativo ("square(x)"), etc.
"cpuid level: 1" = se deriva de "CPU IDentification" y es una instrucción para
la arquitectura x86. Esto permite al software determinar la presencia y
características del procesador.
"flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36
mmx fxsr sse syscall mmxext 3dnowext 3dnow ts" = son usadas para controlar o
indicar el estado intermedio o final o de salida de diferentes operaciones.
"bogomips: 4170.79" = es el valor BogoMIPS, que es una unidad de medida de la
velocidad del CPU o computador inventada por Linus Torvals para el kernel de
Linux.
AUTOR
Jaime Montoya
jaimemontoya@jaimemontoya.com
www.jaimemontoya.com
Santa Ana, 8 de septiembre de 2007
El Salvador