¿Qué sucede cuando ejecuto el comando cat /proc/cpuinfo?

¿Qué sucede cuando ejecuto el comando cat /proc/cpuinfo?

¿Qué pasa cuando escribo cat /proc/cpuinfo? ¿Es una canalización con nombre (u otra cosa) para el sistema operativo que lee la información de la CPU sobre la marcha y genera ese texto cada vez que lo llamo?

Respuesta1

Cada vez que lee un archivo en /proc, se invoca algún código en el kernel que calcula el texto para leer como contenido del archivo. El hecho de que el contenido se genere sobre la marcha explica por qué casi todos los archivos tienen su tiempo reportado como ahora y su tamaño reportado como 0; aquí debería leer 0 como "no sé". A diferencia de los sistemas de archivos habituales, el sistema de archivos en el que está montado /proc, que se llamaprocs, no carga datos desde un disco u otro medio de almacenamiento (como FAT, ext2, zfs,…) o a través de la red (como NFS, Samba,…) y no llama al código de usuario (a diferencia deFUSIBLE).

Procfs está presente en la mayoría de los unices que no son BSD. Comenzó su vida en los Bell Labs de AT&T enUNIX octava edicióncomo una forma de informar información sobre los procesos (y, psa menudo, es una bonita impresora para leer la información /proc). La mayoría de las implementaciones de procfs tienen un archivo o directorio llamado /proc/123para informar información sobre el proceso con PID 123. Linux extiende el sistema de archivos proc con muchas más entradas que informan el estado del sistema, incluido su ejemplo /proc/cpuinfo.

En el pasado, Linux /procadquiría varios archivos que proporcionaban información sobre los controladores, pero este uso ahora está obsoleto en favor de/sys, y /procahora evoluciona lentamente. Las entradas Me gusta /proc/busy /proc/fs/ext4permanecen donde están por compatibilidad con versiones anteriores, pero se crean interfaces similares más nuevas en /sys. En esta respuesta, me centraré en Linux.

Su primer y segundo punto de entrada para la documentación sobre /procLinux son:

  1. elproc(5)página de manual;
  2. El /procsistema de archivosen eldocumentación del núcleo.

Su tercer punto de entrada, cuando la documentación no lo cubre, esleyendo la fuente. Puedes descargar el código fuente en tu máquina, pero este es un programa enorme yLXR, la referencia cruzada de Linux, es de gran ayuda. (Hay muchas variantes de LXR; la que se está ejecutando lxr.linux.noes la mejor con diferencia, pero desafortunadamente el sitio a menudo no funciona). Se requiere un poco de conocimiento de C, pero no es necesario ser programador para rastrear un valor misterioso. .

El manejo principal de /proclas entradas está en elfs/procdirectorio. Cualquier controlador puede registrar entradas en /proc(aunque, como se indicó anteriormente, esto ahora está obsoleto en favor de /sys), por lo que si no encuentra lo que busca en fs/proc, busque en cualquier otro lugar. Los controladores llaman a las funciones declaradas eninclude/linux/proc_fs.h. Versiones del núcleohasta 3,9proporcionar las funciones create_proc_entryy algunos contenedores (especialmente create_proc_read_entry) y versiones del kernel3.10 y superiorproporcione en su lugar solo proc_createy proc_create_data(y algunos más).

Tomando /proc/cpuinfocomo ejemplo, una búsqueda de "cpuinfo"te lleva a la llamada a proc_create("cpuinfo, …")enfs/proc/cpuinfo.c. Puede ver que el código es prácticamente un código repetitivo: dado que la mayoría de los archivos /procsimplemente descargan algunos datos de texto, existen funciones auxiliares para hacerlo. Hay simplemente unseq_operationsestructura, y la verdadera carne está en elcpuinfo_opEstructura de datos, que depende de la arquitectura, generalmente definida en arch/<architecture>/kernel/setup.c(o a veces en un archivo diferente). Tomando x86 como ejemplo, llegamos aarch/x86/kernel/cpu/proc.c. Allí la función principal es show_cpuinfo, que imprime el contenido del archivo deseado; el resto de la infraestructura está ahí para alimentar los datos al proceso de lectura a la velocidad que éste lo solicite. Puede ver los datos que se ensamblan sobre la marcha a partir de datos en varias variables del núcleo, incluidos algunos números calculados sobre la marcha, comola frecuencia de la CPU.

Una gran parte /proces la información por proceso en /proc/<PID>. Estas entradas están registradas enfs/proc/base.c, en eltgid_base_stuffformación; Algunas funciones registradas aquí están definidas en otros archivos. Veamos algunos ejemplos de cómo se generan estas entradas:

Otra área importante /proces /proc/sys, que es una interfaz directa consysctl. La lectura de una entrada en esta jerarquía devuelve el valor del valor sysctl correspondiente y la escritura establece el valor sysctl. Los puntos de entrada para sysctl están enfs/proc/proc_sysctl.c. Sysctls tiene su propio sistema de registro conregister_sysctly amigos.

Respuesta2

Cuando intentas comprender qué tipo de magia está sucediendo detrás de escena, tu mejor amigo es strace. Aprender a utilizar esta herramienta es una de las mejores cosas que puede hacer para apreciar mejor la magia loca que ocurre detrás de escena.

$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536)                      = 0
close(3)                                = 0
...

En el resultado anterior puede ver que /proc/cpuinfoes solo un archivo normal, o al menos parece serlo. Así que profundicemos más.

inmersión más profunda

#1- con ls..

Si miramos el archivo en sí, parecerá "sólo un archivo".

$ ls -l /proc/cpuinfo 
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo

Pero mire más de cerca. Recibimos el primer indicio de que es especial; tenga en cuenta que el tamaño del archivo es 0 bytes.

#2- con estadística..

Si ahora miramos el archivo usando statpodemos obtener la siguiente pista de que hay algo especial en /proc/cpuinfo.

ejecutar #1
$ stat /proc/cpuinfo 
  File: ‘/proc/cpuinfo’
  Size: 0           Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3dInode: 4026532023  Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
 Birth: -
ejecutar # 2
$ stat /proc/cpuinfo 
  File: ‘/proc/cpuinfo’
  Size: 0           Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3dInode: 4026532023  Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
 Birth: -

¿Observa los tiempos de acceso, modificación y cambio? Siguen cambiando para cada acceso. Es muy inusual que los 3 cambien así. A menos que se editen, los atributos de marca de tiempo de un archivo generalmente permanecen iguales.

#3- con archivo..

Otra pista más de que este archivo no es un archivo normal:

$ file /proc/cpuinfo 
/proc/cpuinfo: empty

Si fuera alguna manifestación de una canalización con nombre, se mostraría similar a uno de estos archivos:

$ ls -l /dev/initctl /dev/zero 
prw-------. 1 root root    0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero

$ file /dev/initctl /dev/zero 
/dev/initctl: fifo (named pipe)
/dev/zero:    character special

Si tocamos un emptyfile, /proc/cpuinfoparece más un archivo que una tubería:

$ touch emptyfile
$ ls -l emptyfile 
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile 
emptyfile: empty
#4- con montura..

Entonces, en este punto debemos dar un paso atrás y alejarnos un poco. Estamos viendo un archivo en particular, pero quizás deberíamos mirar el sistema de archivos en el que reside este archivo. Y para ello podemos usar el mountcomando.

$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

Bien, entonces el tipo de sistema de archivos es de tipo proc. También /proces un tipo de sistema de archivos diferente, esa es nuestra pista de que los archivos a continuación /procson especiales. No son sólo archivos comunes y corrientes. Entonces, descubramos más información sobre lo que hace que el procsistema de archivos sea especial.

Echando un vistazo a mountla página de manual de:

El sistema de archivos proc no está asociado con un dispositivo especial y, al montarlo, se puede utilizar una palabra clave arbitraria, como proc, en lugar de una especificación de dispositivo. (La elección habitual de ninguno es menos afortunada: el mensaje de error "ninguno ocupado" de desmontaje puede resultar confuso).

Y si echamos un vistazo a procla página de manual de:

El sistema de archivos proc es un pseudosistema de archivos que se utiliza como interfaz para las estructuras de datos del kernel. Normalmente se monta en /proc. La mayor parte es de sólo lectura, pero algunos archivos permiten cambiar las variables del kernel.

Un poco más abajo en esa misma página de manual:

/proc/cpuinfo

Esta es una colección de elementos que dependen de la arquitectura del sistema y de la CPU; para cada arquitectura compatible hay una lista diferente. Dos entradas comunes son procesador, que proporciona el número de CPU y bogomips; una constante del sistema que se calcula durante la inicialización del kernel. Las máquinas SMP tienen información para cada CPU. El comando lscpu(1) recopila su información de este archivo.

En la parte inferior de la página de manual hay una referencia a un documento del núcleo que puede encontrar aquí, titulado:EL SISTEMA DE ARCHIVOS /proc. Citando de ese documento:

El sistema de archivos proc actúa como una interfaz para las estructuras de datos internas del kernel. Se puede utilizar para obtener información sobre el sistema y cambiar ciertos parámetros del kernel en tiempo de ejecución (sysctl).

Conclusiones

Entonces, ¿qué aprendimos aquí? Bueno, dado que /procse lo conoce como un pseudosistema de archivos y también una "interfaz para estructuras de datos internas", probablemente sea seguro asumir que los elementos que contiene sonnoarchivos reales, sino más bien manifestaciones hechas para parecer archivos, pero que en realidad no lo son.

Terminaré con esta cita que aparentemente solía estar en una versión anterior de man 5 procalrededor de 2004 pero que por alguna razón ya no está incluida.NOTA:No estoy seguro de por qué se eliminó, ya que describe muy bien qué /proces:

El directorio /proc en los sistemas GNU/Linux proporciona una interfaz similar a un sistema de archivos para el kernel. Esto permite que las aplicaciones y los usuarios obtengan información y establezcan valores en el kernel utilizando la operación de E/S normal del sistema de archivos.

El sistema de archivos proc a veces se denomina pseudosistema de archivos de información de proceso. No contiene archivos "reales" sino información del sistema en tiempo de ejecución (por ejemplo, memoria del sistema, dispositivos montados, configuración del hardware, etc.). Por este motivo puede considerarse como un centro de control e información del núcleo. De hecho, muchas utilidades del sistema son simplemente llamadas a archivos en este directorio. Por ejemplo, el comando lsmod, que enumera los módulos cargados por el kernel, es básicamente el mismo que 'cat /proc/modules' mientras que lspci, que enumera los dispositivos conectados al bus PCI del sistema, es el mismo que 'cat / proceso/pci'. Al alterar los archivos ubicados en este directorio, puede cambiar los parámetros del kernel mientras el sistema se está ejecutando.

Fuente: El pseudo sistema de archivos proc

Referencias

Respuesta3

La respuesta dada por @slm es muy completa, pero creo que una explicación más sencilla podría surgir de un cambio de perspectiva.

En el uso diario podemos pensar en los archivos como cosas físicas, es decir. fragmentos de datos almacenados en algún dispositivo. Esto hace que archivos como /proc/cpuinfo sean muy misteriosos y confusos. Sin embargo, todo tiene mucho sentido si pensamos en los archivos como uninterfaz; una forma de enviar datos dentro y fuera de algún programa.

Los programas que envían y reciben datos de esta manera son sistemas de archivos o controladores (dependiendo de cómo defina estos términos, puede ser una definición demasiado amplia o demasiado estrecha). El punto importante es quealgunoMuchos de estos programas utilizan un dispositivo de hardware para almacenar y recuperar los datos enviados a través de esta interfaz; pero no todos.

Algunos ejemplos de sistemas de archivos quenoutilizar un dispositivo de almacenamiento (al menos directamente) son:

  • Sistemas de archivos que utilizan datos buscados o calculados. Proc es un ejemplo, ya que obtiene datos de varios módulos del kernel. Un ejemplo extremo es πfs (github.com/philipl/pifs)
  • Todos los sistemas de archivos FUSE, que manejan los datos con un programa de espacio de usuario normal.
  • Sistemas de archivos que transforman los datos de otro sistema de archivos sobre la marcha, por ejemplo mediante cifrado, compresión o incluso transcodificación de audio (khenriks.github.io/mp3fs/).

El sistema operativo Plan9 (http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs) es un ejemplo extremo del uso de archivos como interfaz de programación general.

información relacionada