En realidad es bastante simple, al menos si no necesita los detalles de implementación.
En primer lugar, en Linux todos los sistemas de archivos (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) se implementan en el núcleo. Algunos pueden descargar el trabajo al código del país de usuario a través de FUSE, y algunos vienen solo en forma de un módulo del núcleo ( ZFS nativo es un ejemplo notable de este último debido a restricciones de licencia), pero de cualquier manera sigue siendo un componente del núcleo. Este es un básico importante.
Cuando un programa quiere leer desde un archivo, que emitirá diversas llamadas a las bibliotecas del sistema que finalmente terminan en el núcleo en forma de open()
, read()
, close()
secuencia (posiblemente con seek()
tirado en una buena medida). El núcleo toma la ruta y el nombre de archivo proporcionados, y a través del sistema de archivos y la capa de E / S del dispositivo los traduce a solicitudes de lectura física (y en muchos casos también solicitudes de escritura, piense, por ejemplo, en actualizaciones de tiempo) a algún almacenamiento subyacente.
Sin embargo, no tiene que traducir esas solicitudes específicamente al almacenamiento físico y persistente . El contrato del núcleo es que la emisión de ese conjunto particular de llamadas al sistema proporcionará el contenido del archivo en cuestión . Donde exactamente en nuestro ámbito físico existe el "archivo" es secundario a esto.
Por /proc
lo general, se monta lo que se conoce como procfs
. Ese es un tipo de sistema de archivos especial, pero como es un sistema de archivos, realmente no es diferente de, por ejemplo, un ext3
sistema de archivos montado en algún lugar. Entonces, la solicitud se pasa al código del controlador del sistema de archivos procfs, que conoce todos estos archivos y directorios y devuelve información particular de las estructuras de datos del núcleo .
La "capa de almacenamiento" en este caso son las estructuras de datos del núcleo y procfs
proporciona una interfaz limpia y conveniente para acceder a ellas. Tenga en cuenta que montar procesos en /proc
es simplemente una convención; podrías montarlo fácilmente en otro lugar. De hecho, eso a veces se hace, por ejemplo en chroot jails cuando el proceso que se ejecuta allí necesita acceso a / proc por alguna razón.
Funciona de la misma manera si escribe un valor en algún archivo; a nivel del kernel, que se traduce en una serie de open()
, seek()
, write()
, close()
las llamadas que a su vez van pasando al controlador del sistema de archivos; de nuevo, en este caso particular, el código procfs.
La razón particular por la que ve file
regresar empty
es que muchos de los archivos expuestos por procfs están expuestos con un tamaño de 0 bytes. El tamaño de 0 bytes probablemente sea una optimización en el lado del kernel (muchos de los archivos en / proc son dinámicos y pueden variar fácilmente en longitud, posiblemente incluso de una lectura a la siguiente, y calcular la longitud de cada archivo en cada lectura de directorio sería potencialmente ser muy caro). Al seguir los comentarios a esta respuesta, que puede verificar en su propio sistema ejecutando strace o una herramienta similar, file
primero realiza una stat()
llamada para detectar cualquier archivo especial y luego aprovecha la oportunidad para, si el tamaño del archivo se informa como 0 , aborta e informa que el archivo está vacío.
Este comportamiento está realmente documentado y puede anularse especificando -s
o --special-files
en la file
invocación, aunque como se indica en la página del manual que puede tener efectos secundarios. La cita a continuación es de la página del manual del archivo BSD 5.11, fechada el 17 de octubre de 2011.
Normalmente, el archivo solo intenta leer y determinar el tipo de archivos de argumentos cuyos informes stat (2) son archivos normales. Esto evita problemas, porque leer archivos especiales puede tener consecuencias peculiares. Al especificar la -s
opción, el archivo también lee archivos de argumentos que son archivos especiales de bloques o caracteres. Esto es útil para determinar los tipos de datos del sistema de archivos en particiones de disco sin formato, que son archivos especiales de bloques. Esta opción también hace que el archivo ignore el tamaño del archivo según lo informado por stat (2) ya que en algunos sistemas informa un tamaño cero para particiones de disco sin formato.
strace file /proc/version
oltrace -S /proc/version
, la optimización es bastante pequeña. Primero realiza unastat()
llamada y descubre que el tamaño es 0, omitiendo asíopen()
, pero antes de eso está cargando varios archivos mágicos.file
. De esta manera, el archivo precarga los archivos mágicos, luego procesa la línea de comando parámetro por parámetro; en lugar de mover el archivo mágico al "hacer esto justo antes de tratar de determinar qué tipo de archivo es este ", parte del código, lo que aumentaría la complejidad. Llamarstat()
y actuar sobre su valor de retorno es esencialmente inofensivo; agregando complejidad para realizar un seguimiento de los riesgos de estado interno adicionales que introducen errores.file
"archivo está vacío" es porque llamastat
a detectar archivos especiales (tuberías con nombre, dispositivos, ...), y aprovecha esta oportunidad para detener el procesamiento de archivos vacíos.file -s /proc/version
informa "texto ASCII".-s
se supone para dispositivos especiales block / char. Finalmente miré lafile
fuente, y al final de fsmagic.c vi esta explicación por qué regresa enASCII text
lugar deempty
:If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
En este directorio, puede controlar cómo el kernel ve los dispositivos, ajustar la configuración del kernel, agregar dispositivos al kernel y eliminarlos nuevamente. En este directorio puede ver directamente el uso de memoria y las estadísticas de E / S.
Puede ver qué discos están montados y qué sistemas de archivos se utilizan. En resumen, cada aspecto de su sistema Linux puede examinarse desde este directorio, si sabe qué buscar.
El
/proc
directorio no es un directorio normal. Si tuviera que arrancar desde un CD de arranque y mirara ese directorio en su disco duro, lo vería vacío. Cuando lo miras bajo tu sistema de funcionamiento normal, puede ser bastante grande. Sin embargo, no parece estar utilizando ningún espacio en el disco duro. Esto se debe a que es un sistema de archivos virtual.Dado que el
/proc
sistema de archivos es un sistema de archivos virtual y reside en la memoria,/proc
se crea un nuevo sistema de archivos cada vez que se reinicia su máquina Linux.En otras palabras, es solo un medio para echar un vistazo y hurgar en las entrañas del sistema Linux a través de una interfaz de tipo de archivo y directorio. Cuando mira un archivo en el
/proc
directorio, está mirando directamente un rango de memoria en el kernel de Linux y viendo lo que puede ver.Las capas en el sistema de archivos.
Ejemplos:
/proc
, hay un directorio para cada proceso en ejecución, nombrado con su ID de proceso. Estos directorios contienen archivos que tienen información útil sobre los procesos, como:exe
: que es un enlace simbólico al archivo en el disco desde el que se inició el proceso.cwd
: que es un enlace simbólico al directorio de trabajo del proceso.wchan
: que, cuando se lee, devuelve el canal de espera en el que se encuentra el proceso.maps
: que, cuando se lee, devuelve los mapas de memoria del proceso./proc/uptime
devuelve el tiempo de actividad como dos valores decimales en segundos, separados por un espacio:/proc/interrupts
: Para información relacionada con interrupciones./proc/modules
: Para una lista de módulos.Para obtener información más detallada, consulte man proc o kernel.org .
fuente
mount -t procfs procfs /mnt/proc
, verá el kernel / proc actualmente en ejecución.Estás en lo correcto, no son archivos reales.
En términos más simples, es una forma de hablar con el kernel utilizando los métodos normales de lectura y escritura de archivos, en lugar de llamar al kernel directamente. Está en línea con la filosofía de "todo es un archivo" de Unix.
Los archivos
/proc
no existen físicamente en ninguna parte, pero el núcleo reacciona a los archivos que lee y escribe allí, y en lugar de escribir en el almacenamiento, informa información o hace algo.Del mismo modo, los archivos
/dev
no son realmente archivos en el sentido tradicional (aunque en algunos sistemas los archivos en/dev
realidad pueden existir en el disco, no tendrán mucho más que el dispositivo al que se refieren): le permiten hablar a un dispositivo que usa la API normal de E / S de archivos Unix, o cualquier cosa que lo use, como shellsfuente
Dentro del
/proc
directorio, hay dos tipos de contenido, el primer directorio numerado y el segundo es el archivo de información del sistema./proc
es un sistema de archivos virtual Por ejemplo, si lo hacels -l /proc/stat
, notará que tiene un tamaño de 0 bytes, pero si hace “cat / proc / stat”, verá algo de contenido dentro del archivo.Haga un
ls -l /proc
, y verá muchos directorios con solo números. Estos números representan los ID de proceso (PID). Los archivos dentro de este directorio numerado corresponden al proceso con ese PID particular.Algunos archivos que están disponibles en
/proc
, contienen información del sistema como cpuinfo, meminfo y loadavg.Algunos comandos de Linux leen la información de estos
/proc
archivos y la muestran. Por ejemplo, el comando gratuito lee la información de la memoria del/proc/meminfo
archivo, la formatea y la muestra.Para obtener más información sobre los
/proc
archivos individuales , haga "man 5 FILENAME".fuente
Ejemplo ejecutable mínimo
La mejor manera de entender estas cosas en mi opinión es jugar con ellas, así que aquí hay un módulo de kernel que crea una entrada procfs:
myprocfs.c
y luego interactuamos con él como:
y eso produce la salida:
A partir de este ejemplo, vemos claramente que los
proc
archivos nos permiten implementar "llamadas al sistema relacionadas con archivos" arbitrarias comoopen
,read
yllseek
.Esas llamadas al sistema se pueden usar para una comunicación arbitraria con el núcleo.
Por lo tanto, esos archivos no necesitan tener nada que ver con los archivos reales en los sistemas de archivos, y ese es el caso para casi todos.
En nuestro pequeño ejemplo, por ejemplo, simplemente hacemos un archivo inútil para el que
read
siempre regresaabcd\n
.Aquí está mi configuración de QEMU + Buildroot totalmente automatizada para construir y jugar de manera fácil y segura con este módulo de kernel:
Algunas otras interfaces similares incluyen:
debugfs ofrece básicamente la misma interfaz pero indica una API menos estable, aquí hay un ejemplo .
Los dispositivos de caracteres también son muy similares, pero los archivos se crean con
mknod
, por ejemplo: https://unix.stackexchange.com/questions/37829/how-do-character-device-or-character-special-files-work/371758# 371758sysfs es otra opción más restringida, vea esta respuesta para obtener más detalles: https://unix.stackexchange.com/questions/4884/what-is-the-difference-between-procfs-and-sysfs/382315#382315
fuente