El sistema de archivos proc ( procfs ) es un sistema de archivos especial en sistemas operativos tipo Unix que presenta información sobre procesos y otra información del sistema en una estructura jerárquica similar a un archivo, proporcionando un método más conveniente y estandarizado para acceder dinámicamente a los datos de los procesos almacenados en el núcleo que los métodos de rastreo tradicionales o el acceso directo a la memoria del núcleo . Normalmente, se asigna a un punto de montaje llamado /proc durante el arranque. El sistema de archivos proc actúa como una interfaz a las estructuras de datos internas sobre los procesos en ejecución en el núcleo. En Linux , también se puede utilizar para obtener información sobre el núcleo y para cambiar ciertos parámetros del núcleo en tiempo de ejecución ( sysctl ).
Muchos sistemas operativos tipo Unix admiten el sistema de archivos proc, incluidos System V , Solaris , IRIX , Tru64 UNIX , BSD , Linux , IBM AIX , [ 1 ] QNX y Plan 9 de Bell Labs . OpenBSD dejó de admitirlo en la versión 5.7, lanzada en mayo de 2015. Está ausente en HP-UX [ 1 ] y macOS . [ 2 ]
El núcleo de Linux lo extiende a datos no relacionados con procesos.
El sistema de archivos proc proporciona un método de comunicación entre el espacio del kernel y el espacio de usuario . Por ejemplo, el comando ps en Plan 9 y la versión GNU de la utilidad de informes de procesos ps utilizan el sistema de archivos proc para obtener sus datos, sin utilizar llamadas al sistema especializadas .
Historia
UNIX 8.ª edición
Tom J. Killian implementó la versión de /proc para UNIX 8.ª edición (V8) : presentó un artículo titulado "Procesos como archivos" en USENIX en junio de 1984. El diseño de procfs tenía como objetivo reemplazar la llamada al sistema ptrace utilizada para el rastreo de procesos. La documentación detallada se puede encontrar en la página del manual proc(4) .
SVR3
El sistema operativo original AT&T System V Release 3 (SVR3), disponible internamente para AT&T en 1986 y para el público en general en 1987, no incluía el sistema de archivos /proc , pero una versión incremental posterior sí lo hizo. Esta última solo contenía archivos que representaban los procesos, en lugar de los subdirectorios que ahora son comunes.
SVR4
Roger Faulkner y Ron Gomes adaptaron el sistema de archivos /proc de V8 a SVR4 y publicaron un artículo titulado "El sistema de archivos de procesos y el modelo de procesos en UNIX System V" en USENIX en enero de 1991. Este tipo de procfs admitía la creación de ps , pero solo se podía acceder a los archivos con las funciones read() , write() e ioctl () . Entre 1995 y 1996, Roger Faulkner creó la interfaz procfs-2 para Solaris-2.6, que ofrece un sistema de archivos /proc estructurado con subdirectorios.
Plan 9
Plan 9 implementó un sistema de archivos de procesos, pero fue más allá que V8. El sistema de archivos de procesos de V8 implementaba un único archivo por proceso. Plan 9 creó una jerarquía de archivos separados para proporcionar esas funciones e integró /proc como parte fundamental del sistema de archivos. Además, el enfoque de Plan 9 hacia la portabilidad permite que sistemas con arquitecturas y orden de bytes diferentes depuren los procesos de otros.
4.4BSD y derivados
4.4BSD clonó su implementación de /proc de Plan 9. A partir de febrero de 2011 , procfs se está eliminando gradualmente en FreeBSD, [ 3 ] y ha pasado a utilizar la interfaz sysctl en su lugar para información relacionada con procesos. Para proporcionar compatibilidad binaria con programas de espacio de usuario de Linux, el kernel de FreeBSD también proporciona linprocfs que es similar a procfs de Linux. [ 4 ] Fue eliminado de OpenBSD en la versión 5.7, que se lanzó en mayo de 2015, porque "siempre sufrió condiciones de carrera y ahora no se utiliza". [ 5 ] macOS no implementó procfs y los programas de espacio de usuario tienen que usar la interfaz sysctl para recuperar datos de procesos. [ 2 ]
Solaris
El comando /proc en Solaris estuvo disponible desde el principio (junio de 1992). Solaris 2.6, en 1996, introdujo procfs2 de Roger Faulkner.
Linux
Linux añadió por primera vez un sistema de archivos /proc en la versión 0.97.3 , en septiembre de 1992, y comenzó a ampliarlo a datos no relacionados con procesos en la versión 0.98.6, en diciembre de 1992.
A partir de 2020, la implementación de Linux incluye un directorio para cada proceso en ejecución, incluidos los procesos del kernel , en directorios llamados /proc/PID , donde PID es el número de proceso. Cada directorio contiene información sobre un proceso, que incluye:
- /proc/PID/cmdline , el comando que inició originalmente el proceso.
- /proc/PID/cwd , un enlace simbólico al directorio de trabajo actual del proceso.
- El archivo /proc/PID/environ contiene los nombres y valores de las variables de entorno que afectan al proceso.
- /proc/PID/exe , un enlace simbólico al archivo ejecutable original , si aún existe (un proceso puede seguir ejecutándose después de que su ejecutable original haya sido eliminado o reemplazado).
- /proc/PID/fd , un directorio que contiene un enlace simbólico para cada descriptor de archivo abierto .
- /proc/PID/fdinfo , un directorio que contiene entradas que describen la posición y los indicadores de cada descriptor de archivo abierto.
- /proc/PID/maps , un archivo de texto que contiene información sobre archivos y bloques mapeados (como el montón y la pila).
- El archivo /proc/PID/mem , una imagen binaria que representa la memoria virtual del proceso , solo puede ser accedido por un proceso que utilice ptrace .
- /proc/PID/root , un enlace simbólico a la ruta raíz tal como la ve el proceso. Para la mayoría de los procesos, este será un enlace a / a menos que el proceso se esté ejecutando en un entorno chroot .
- El archivo /proc/PID/status contiene información básica sobre un proceso, incluyendo su estado de ejecución y el uso de memoria.
- /proc/PID/task , un directorio que contiene enlaces duros a cualquier tarea que haya sido iniciada por este proceso (es decir, el proceso padre).
(Los usuarios pueden obtener el PID con una utilidad como pgrep , pidof o ps :
$ ls -l /proc/ $( pgrep -n python3 ) /fd # Lista todos los descriptores de archivo del proceso `python3' iniciado más recientemente total 0 lrwx------ 1 baldur baldur 64 2020-03-18 12:31 0 -> /dev/pts/3 lrwx------ 1 baldur baldur 64 2020-03-18 12:31 1 -> /dev/pts/3 lrwx------ 1 baldur baldur 64 2020-03-18 12:31 2 -> /dev/pts/3 $ readlink /proc/ $( pgrep -n python3 ) /exe # Lista el ejecutable utilizado para iniciar el proceso `python3' iniciado más recientemente /usr/bin/python3.8)
/proc también incluye información del sistema no relacionada con procesos, aunque en el kernel 2.6 gran parte de esa información se trasladó a un sistema de pseudoarchivos separado, sysfs , montado bajo /sys :
- Dependiendo del modo de administración de energía (si es que existe), cualquiera de los directorios, /proc/acpi o /proc/apm , que son anteriores a sysfs y contienen varios bits de información sobre el estado de la administración de energía.
- /proc/buddyinfo , información sobre el algoritmo buddy que maneja la fragmentación de memoria. [ 6 ]
- /proc/bus , que contiene directorios que representan varios buses en la computadora, como PCI / USB . Esto ha sido reemplazado en gran medida por sysfs en /sys/bus, que es mucho más informativo.
- /proc/fb , una lista de los framebuffers disponibles
- /proc/cmdline , que proporciona las opciones de arranque pasadas al kernel.
- /proc/cpuinfo contiene información sobre la CPU , como su fabricante (y familia, modelo y nombres de modelo que permiten a los usuarios identificarla), su velocidad ( velocidad de reloj ), el tamaño de la caché, el número de núcleos, los indicadores de la CPU . El formato y la información disponible dependen en gran medida de la arquitectura. En algunas arquitecturas, /proc/cpuinfo incluye un valor para " bogomips ", que a menudo se interpreta erróneamente como una medida de la velocidad de la CPU, como una prueba de rendimiento, pero que en realidad no mide ningún valor útil para los usuarios finales. Se produce como un efecto secundario de la calibración del temporizador del kernel y arroja valores muy variables según el tipo de CPU, incluso a velocidades de reloj iguales.
$ cat /proc/cpuinfo procesador: 0 ID_proveedor: AuthenticAMD familia_cpu: 16 modelo: 6 nombre_modelo: AMD Athlon II X2 270 Paso_procesador: 3 microcódigo: 0x10000c8 MHz_cpu: 2000.000 tamaño_caché: 1024 KB ... procesador: 1 ID_proveedor: AuthenticAMD familia_cpu: 16 modelo: 6 nombre_modelo: AMD Athlon II X2 270 Paso_procesador: 3 microcódigo: 0x10000c8 MHz_cpu: 800.000 tamaño_caché: 1024 KB ...En las CPU multinúcleo, /proc/cpuinfo contiene los campos para "hermanos" y "núcleos de CPU" que representan el siguiente cálculo aplicado: [ 7 ]
"hermanos" = (HT por paquete de CPU) * (número de núcleos por paquete de CPU) "núcleos de CPU" = (número de núcleos por paquete de CPU)
Un paquete de CPU se refiere a una CPU física que puede tener varios núcleos ( un núcleo simple para uno, dos núcleos dobles para dos, cuatro núcleos cuádruples para cuatro). Esto permite distinguir entre hyper-threading y doble núcleo, es decir, el número de hyper-threads por paquete de CPU se puede calcular mediante siblings / CPU cores . Si ambos valores para un paquete de CPU son iguales, entonces hyper-threading no es compatible. [ 8 ] Por ejemplo, un paquete de CPU con siblings=2 y "cpu cores"=2 es una CPU de doble núcleo pero no admite hyper-threading.
- /proc/crypto , una lista de módulos criptográficos disponibles
- /proc/devices , una lista de dispositivos de caracteres y de bloques ordenados por ID de dispositivo pero que también muestra la mayor parte del nombre de /dev.
- /proc/diskstats , que proporciona información (incluidos los números de dispositivo) para cada uno de los dispositivos de disco lógicos.
- /proc/filesystems , una lista de los sistemas de archivos compatibles con el kernel en el momento de la publicación.
- /proc/interrupts , /proc/iomem , /proc/ioports y el directorio /proc/irq , que proporcionan algunos detalles sobre los dispositivos (físicos o lógicos) que utilizan los diversos recursos del sistema.
- /proc/kmsg , que contiene los mensajes generados por el kernel [ 9 ]
- /proc/loadavg , que contiene estadísticas sobre la carga promedio actual en los últimos minutos.
- /proc/meminfo , que contiene un resumen de cómo el kernel gestiona su memoria.
- /proc/modules , uno de los archivos más importantes en /proc , contiene una lista de los módulos del kernel cargados actualmente. Proporciona alguna indicación (no siempre del todo correcta) de las dependencias.
- /proc/mounts , un enlace simbólico a self/mounts que contiene una lista de los dispositivos montados actualmente y sus puntos de montaje (y qué sistema de archivos está en uso y qué opciones de montaje están en uso).
- /proc/net/ , un directorio que contiene información útil sobre la pila de red, en particular /proc/net/nf_conntrack , que enumera las conexiones de red existentes (especialmente útil para el seguimiento del enrutamiento cuando se utiliza iptables FORWARD para redirigir las conexiones de red).
- /proc/partitions , una lista de los números de dispositivo, su tamaño y los nombres de /dev que el kernel ha identificado como particiones existentes.
- /proc/scsi , que proporciona información sobre cualquier dispositivo conectado a través de un controlador SCSI o RAID.
- un enlace simbólico al proceso actual (que se está recorriendo) en /proc/self (es decir , /proc/PID/ donde PID es el del proceso actual).
- /proc/slabinfo , que muestra estadísticas sobre las cachés de los objetos de uso frecuente en el kernel de Linux.
- /proc/swaps , una lista de las particiones de intercambio activas, sus diferentes tamaños y prioridades.
- Acceso a opciones del kernel configurables dinámicamente en /proc/sys . En /proc/sys aparecen directorios que representan las áreas del kernel, con archivos virtuales legibles y escribibles . Por ejemplo, un archivo virtual de referencia común es /proc/sys/net/ipv4/ip_forward , ya que es necesario para el enrutamiento de firewalls o túneles. El archivo contiene un '1' o un '0': si es 1, la pila IPv4 reenvía los paquetes que no están destinados al host local; si es 0, no lo hace.
- /proc/sysvipc , que contiene información sobre el uso compartido de memoria y la comunicación entre procesos (IPC).
- /proc/tty , que contiene información sobre terminales ; /proc/tty/driver contiene una lista de controladores TTY y su uso [ 10 ]
- /proc/uptime , el tiempo que el kernel ha estado en ejecución desde el arranque y el tiempo que ha permanecido en modo inactivo (ambos en segundos).
- /proc/version , que contiene la versión del kernel de Linux, el número de distribución, el número de versión de gcc (utilizado para compilar el kernel) y cualquier otra información pertinente relacionada con la versión del kernel que se está ejecutando actualmente.
- otros archivos dependiendo de varios componentes de hardware, configuraciones de módulos y cambios en el núcleo.
Las utilidades básicas que utilizan /proc en Linux vienen en el paquete procps ( procesos /proc ) y solo funcionan junto con un /proc montado .
Cygwin
Cygwin implementó un sistema de archivos procfs que es básicamente el mismo que el sistema procfs de Linux.
Referencias
- 1 2 Nemeth, Evi; Snyder, Garth; Hein, Trent R.; Whaley, Ben (14 de julio de 2010). Manual de administración de sistemas UNIX y Linux . Pearson Education. pág. 136. ISBN 978-0-13-211736-4.
- 1 2 Amit Singh (2003). "/proc en Mac OS X" . Mac OS X Internals: The Book . Archivado del original el 4 de mayo de 2012. Recuperado el 10 de julio de 2021 .
- ↑ "¿Por qué se ha descontinuado procfs en favor de procstat?" . freebsd.org . 22 de febrero de 2011.
- ↑ "linprocfs(5)" . Páginas del manual de FreeBSD . El proyecto FreeBSD. 13 de noviembre de 2019. Consultado el 12 de junio de 2021 .
- ↑ "Cambios detallados entre OpenBSD 5.6 y 5.7" . openbsd.org .
- ↑ "3.2.2. /proc/buddyinfo" . centos.org . Archivado del original el 2 de septiembre de 2013 . Recuperado el 23 de mayo de 2011 .
- ↑ Baron, Jason. "HT vs. doble núcleo" . Archivado del original el 13 de mayo de 2016. Recuperado el 28 de junio de 2011 .
- ↑ "Entendiendo Linux /proc/cpuinfo" . richweb.com . Archivado del original el 3 de abril de 2012. Consultado el 21 de abril de 2015 .
- ↑ Nguyen, Binh (30 de julio de 2004). "Jerarquía del sistema de archivos de Linux" . Binh Nguyen. pág. 63. Consultado el 18 de julio de 2016.
/proc/kmsg[:] Mensajes generados por el kernel. Estos también se envían a syslog.
- ↑ "El sistema de archivos /proc" . Documentación del kernel de Linux . Consultado el 9 de agosto de 2024 .
Fuentes
- Página del manual proc(2) de Unix 8.ª edición : descripción del procfs original.
- Página del manual de procfs del Plan 9 : El Plan 9 amplió enormemente el concepto de procfs, proporcionando una interfaz mucho más completa para controlar y manipular procesos.
- Páginas del manual de Linux Proc(5) Documentación del manual de Linux para procfs
- Documentación/filesystems/proc.txt Documentación del kernel de Linux para procfs
Enlaces externos
- Breve historia del blog de Eric Schrock (/proc)
- Acceso al kernel de Linux mediante Procfs. Un artículo de IBM developerWorks por M. Tim Jones.
- Proyecto de documentación de Linux sobre la jerarquía del sistema de archivos de Linux
- Descubre las posibilidades del directorio /proc por Federico Kereki
- Tecnología del sistema de archivos Unix
- Características del kernel de Linux
- Sistemas de archivos de propósito especial
- Interfaces del núcleo de Linux
- Sistemas de archivos pseudo compatibles con el kernel de Linux