"Todo es un archivo" es una idea según la cual Unix y sus derivados manejan la entrada/salida hacia y desde recursos tales como documentos, discos duros, módems, teclados, impresoras e incluso algunas comunicaciones entre procesos y redes como simples flujos de bytes expuestos a través del espacio de nombres del sistema de archivos . [1] Las excepciones incluyen semáforos , procesos y subprocesos .
La ventaja de este enfoque es que el mismo conjunto de herramientas, utilidades y API se puede utilizar en una amplia gama de recursos y varios tipos de archivos . Cuando se abre un archivo, se crea un descriptor de archivo , utilizando la ruta del archivo como sistema de direccionamiento. El descriptor de archivo es entonces una interfaz de E/S de flujo de bytes en la que se realizan operaciones de archivo. También se crean descriptores de archivo para objetos como tuberías anónimas y sockets de red ; por lo tanto, una descripción más precisa de esta característica es Todo es un descriptor de archivo . [2] [3]
Además, existe una variedad de sistemas de archivos pseudo y virtuales que exponen datos internos del núcleo, como información sobre procesos, al espacio del usuario en una estructura jerárquica similar a un archivo. [4] Estos se montan en la jerarquía de archivos únicos .
Un ejemplo de este sistema de archivos puramente virtual es /proc , que expone muchas propiedades del sistema como archivos. Todos estos archivos, en el sentido más amplio de la palabra, tienen atributos de archivo estándar de Unix, como un propietario y permisos de acceso , y pueden consultarse con las mismas herramientas y filtros clásicos de Unix . Sin embargo, esto no se considera universalmente un enfoque rápido o portátil. Algunos sistemas operativos no montan /proc de forma predeterminada debido a problemas de seguridad o velocidad, y en su lugar dependen de llamadas del sistema . [5] Sin embargo, las utilidades de shell de Linux lo utilizan mucho, [6] [7] como la implementación de ps de procps y BusyBox , que se instala ampliamente en sistemas integrados . [8] El programa Android Toolbox también depende de él. [9]
Otro ejemplo es sysfs , que normalmente se monta en /sys , que expone las estructuras de datos del núcleo . [10] sysfs proporciona una funcionalidad similar al mecanismo sysctl que se encuentra en los sistemas operativos BSD , con la diferencia de que sysfs se implementa como un sistema de archivos virtual en lugar de ser un mecanismo de núcleo especialmente diseñado. [11]
La filosofía detrás de sysfs es representar cada valor con un archivo dedicado. Además, cada archivo tiene un tamaño máximo de PAGE_SIZE
bytes.
Para un módulo del kernel hay tres posibilidades de utilizar un archivo debajo de /sys:
La API estándar de sysfs utiliza una terminología dedicada: un archivo se denomina atributo, la función que se ejecuta al leer un atributo se llama show
y la que se utiliza para escribir un atributo se llama store
. [12]
Sysfs se derivó de procfs entre las versiones del núcleo Linux 2.5-2.6, inicialmente como un sistema de archivos dedicado a depurar un nuevo modelo de controlador . Tanto sysfs como procfs están basados en memoria. Sysfs contiene directorios para dispositivos de bloque , tipos de bus físico , clases de dispositivos (como los utilizados para gráficos , redes , entrada o impresión ), objetos y atributos específicos del firmware , módulos del núcleo y el subsistema de energía. [13]
Por ejemplo, escribir mem
en /sys/power/state activará un procedimiento de suspensión a RAM . [14]
Otro ejemplo de archivos con comportamientos específicos son los archivos de dispositivo /dev/null y /dev/zero . Las escrituras en ellos se descartarán. [15] Esto se puede utilizar, por ejemplo, para redirigir flujos estándar innecesarios .