¿El kernel de Linux necesita un sistema de archivos para ejecutarse?

19

Mi opinión es que sí, porque toda exposición útil al mundo exterior (modo de procesador no privilegiado) requeriría primero un proceso que se ejecute en el mundo exterior. Eso requeriría un sistema de archivos, incluso un sistema de archivos temporal en RAM.

Otro ingeniero no está de acuerdo conmigo, pero parece que no puedo probar esto más allá de todos los casos (desconocidos para mí).

¿La respuesta a esta pregunta depende de la definición de 'correr'?

Peter L.
fuente
44
Creo que un núcleo en ejecución no "requiere"useful exposure to the outside world
jsotola
19
Trae a la mente el viejo firewall de Linux detenido (circa 2002)
Jeff Schaller
1
Si agrega un nuevo código al núcleo, puede hacer cualquier cosa. Si no puede, se inicializará bien hasta el punto en que intente ejecutarse init(el primer proceso de espacio de usuario), y eso fallará.
user253751
1
Definir "correr" ...
Thorbjørn Ravn Andersen
Leer el sistema operativo: tres piezas fáciles
Basile Starynkevitch

Respuestas:

27

Esa es una pregunta bastante extraña porque no ejecuta el núcleo como ejecuta un programa. El kernel es una plataforma para ejecutar programas. Por supuesto, hay un código de configuración y apagado, pero no es posible ejecutar el núcleo por sí solo. Siempre debe haber un proceso "init" principal. Y el núcleo entrará en pánico si no está allí. Si init intenta salir del kernel, también entrará en pánico.

En estos días, el proceso de inicio es algo así como systemd. Si no se especifica lo contrario, el núcleo intentará ejecutar un programa desde una lista de ubicaciones que comiencen con /sbin/init. Vea el parámetro de inicio aquí http://man7.org/linux/man-pages/man7/bootparam.7.html en una emergencia con la que puede arrancar Linux init=/bin/bash. Pero observe cómo siempre especifica un archivo en el sistema de archivos para ejecutar.

Por lo tanto, el núcleo entrará en pánico si se inicia y no tiene un sistema de archivos porque sin uno no hay forma de cargar init.

Puede surgir cierta confusión debido a una situación de huevo y gallina donde el núcleo debe cargar los controladores para acceder a su sistema de archivos. Para evitar esto, se carga un ramdisk inicial desde una imagen en el disco que contiene controladores vitales y scripts de configuración. Estos se ejecutan antes de cargar el sistema de archivos. Pero no se equivoque, el ramdisk inicial es en sí mismo un sistema de archivos. Con un disco RAM inicial /initse llama (que se almacena en el disco RAM inicial). En muchas distribuciones, en última instancia, esto es lo que llama /sbin/init. Nuevamente sin un sistema de archivos, esto es imposible.

Philip Couling
fuente
¿No hay una condición en la que el núcleo deje de intentar inicializar el hardware y cargar un sistema de archivos conocido (no initrd pasado al núcleo a través de parámetros de inicio), y luego cae en un shell muy limitado (sin init = / bin / bash)? Además, dado que aparece / bin / bash, ¿el kernel siempre tendrá ese sistema de archivos mínimo disponible, incluso si se creó con otras opciones .config que podrían eliminar esto?
Peter L.
1
@PeterL. ese límite de shell es un shell de initrd / initramfs / lo que sea que ese núcleo arrancó, IIRC.
Muru
3
Tenga en cuenta que puede compilar initramfs (un archivo CPIO que se extrae en un sistema de archivos ramfs o tmpfs) en el núcleo. Si eso cuenta o no como el núcleo "que necesita un sistema de archivos" depende de usted, ya que significa que puede arrancar el núcleo y nada más que el núcleo y tener un sistema funcional (aunque un poco limitado). También tenga en cuenta que, incluso si parchea el núcleo para que ya no requiera un inicio, seguirá creando sistemas de archivos virtuales internos que nunca están expuestos.
bosque
@forest El sistema no tiene que ser "limitado": puede empaquetar systemd y gnome en su initrd (junto con cosas que son realmente útiles ;-)). Una limitación de initramfs era (todavía?) Que no estaba apoyando a los atributos extendidos - Me hice el trabajo alrededor de ella en Android mediante la inclusión de una imagen ext4 en el archivo cpio initrd que se montó a continuación, como un dispositivo de bucle de la init.$DEV.rcsecuencia de comandos.
Tío Billy
1
@IsmaelMiguel, no, un initramfs como tal es un archivo cpio. Squashfs es una buena opción para los sistemas de archivos incrustados, y uno podría hacer un initrd (frente a un initramfs) que lo use (los términos a menudo se usan de manera intercambiable pero no son exactamente lo mismo), pero no es el formato que Linux descomprime en su initramfs (De hecho, una imagen de squashfs no necesita ser desempaquetada antes de que pueda usarse; está indexada correctamente).
Charles Duffy
16

La respuesta dependerá de si quiere decir, literalmente, sin un sistema de archivos o si la pregunta está destinada a ser interpretada de manera un poco diferente de cómo se formula realmente. Las respuestas para pequeñas variaciones en cómo se interpreta la pregunta son:

  • Ejecutar Linux sin ningún dispositivo de bloque es completamente factible y útil para algunos casos de uso especializados.
  • Ejecutar Linux sin ningún sistema de archivos requerirá reescribir algunas partes del código del núcleo y es poco probable que sea un esfuerzo útil.
  • Ejecutar Linux sin usar ningún descriptor de archivo requerirá mucho esfuerzo. Estoy bastante seguro de que no valdrá la pena el esfuerzo.

Las razones por las que tendría que reescribir partes del código del núcleo para hacer que un sistema funcione sin un sistema de archivos son:

  • Cada hilo tiene un directorio raíz y un directorio de trabajo actual que debe apuntar a algún sistema de archivos.
  • Los programas se inician mediante la execvellamada al sistema que necesita un ejecutable desde un sistema de archivos.
  • El kernel crea un sistema de archivos basado en memoria durante el proceso de arranque.

Después de que un programa se haya comenzado a usar execve, es posible que desasigne el ejecutable desde el que se inició, aunque para hacerlo sin que se bloquee de inmediato, primero debe crear una asignación de memoria ejecutable que no esté respaldada por un archivo, y tiene que inicializar eso con algún código útil antes de saltar a él y desasignar el ejecutable.

Por lo tanto, un programa en modo de usuario en ejecución puede existir en un estado en el que no tiene asignaciones de memoria respaldadas por archivos y puede cerrar todos los descriptores de archivos respaldados por archivos. No puede dejar de tener un directorio raíz y un directorio de trabajo actual, pero puede abstenerse de ellos.

Entonces, aunque en este estado podría implementar el código del núcleo para extraer el sistema de archivos del programa y hacer que siga ejecutándose, no parece que sea útil. Y entrar en ese estado final sin pasar por un estado intermedio de uso de un sistema de archivos va a ser aún más trabajo sin beneficio útil.

Una configuración útil para algunos casos de uso especializados.

Evitar el uso de dispositivos de bloque puede ser útil. Durante el arranque, el kernel crea un sistema de archivos de memoria, y también puede llenar ese sistema de archivos con contenido de un cpioarchivo antes de ejecutarlo init. De esa manera, puede ejecutar un sistema completamente desde un sistema de archivos basado en memoria sin ningún dispositivo de bloque que lo respalde.

Esto puede ser útil para sistemas en los que no desea conservar ningún estado y desea que el sistema comience desde cero cuando se reinicia.

Por supuesto, el kernel y el archivo cpio tienen que existir de alguna manera en la memoria antes de que el kernel tenga el control. Cómo llegaron allí es un trabajo para el gestor de arranque. El cargador de arranque podría haber cargado los de un dispositivo de bloque a pesar de que el sistema de ejecución final no utiliza dispositivos de bloque. Pero también es posible que el gestor de arranque adquiera el núcleo y el archivo cpio sin utilizar un dispositivo de bloque, por ejemplo, iniciando a través de la red.

kasperd
fuente
1
La pregunta es si un kernel de Linux en cualquier configuración construida (sin reescribir nada) puede 'ejecutarse' sin ningún sistema de archivos. No tiene que hacer nada útil o preservar un estado. De todas las respuestas, entiendo que se proporciona y se asume algún tipo de sistema de archivos dentro del núcleo, al menos hasta el apagado. Incluso '/' es un sistema de archivos. Entonces, creo que para simplificar la respuesta es 'sí'.
Peter L.
2
@PeterL. Sí, si no reescribe nada, Linux requerirá un sistema de archivos. Cuando las personas hablan sobre usos prácticos para Linux sin un sistema de archivos, generalmente se refieren a aquellos respaldados por un dispositivo de bloque y puede ejecutar Linux sin un sistema de archivos respaldado por un dispositivo de bloque. Aún tendrías algún tipo de sistema de archivos.
Kasperd
3

En Linux, casi todos los dispositivos son un archivo , por lo que debe tener un sistema de archivos para ejecutarlo.

K7AAY
fuente
8
Pero, por supuesto, los controladores de dispositivo existen dentro del núcleo independientemente de si un archivo de dispositivo los señala o no.
Philip Couling
66
No todos los dispositivos son un archivo. Las interfaces de red ( eth0, wlan0etc.) no lo son, por ejemplo.
Ruslan
1
Este es un error común. Si bien, en teoría, todo es un archivo en sistemas UNIX y similares a UNIX, solo es completamente cierto para sistemas altamente especializados como Plan 9 (aunque es mucho más cierto que para Windows). Para Linux, bastantes cosas no son archivos. Esto se está volviendo cada vez más cierto a medida que muchos controladores han comenzado a usar netlink en lugar de ioctls en dispositivos de caracteres (que son archivos).
bosque
@forest Plan 9 no es un sistema "altamente especializado": se suponía que era un sistema de propósito general como Unix o Windows (por qué falló en reemplazar Unix y siguió siendo un sistema de investigación es una historia completamente diferente). De todos modos, al igual que Linux, plan9 está exponiendo interfaces virtualizadas a su hardware (y no tiene ioctls, no veo cómo usar netlink vs ioctls factor en todo esto), incluso si se esfuerza por ser más consistente (por ejemplo, .las interfaces de red son accesibles a través del sistema de archivos). Con la introducción de espacios de nombres, Linux ya se parece más a plan9 que a unix clásico.
Tío Billy
1
Muy buen argumento: o hay devfs, que es un sistema de archivos por definición, o no hay devfs, en cuyo caso necesita un sistema de archivos para alojar nodos de dispositivo ...
pmf
-1

Un kernel ES un programa, como cualquier otro. De forma predeterminada, el kernel de Linux intenta acceder al sistema de archivos, sin embargo, este comportamiento puede eliminarse trivialmente mediante la modificación del kernel (en realidad, solo una adición de una función "arch_call_rest_init ()"). Para realizar un "trabajo útil", entonces esperamos que el desarrollador pueda incluir hilos de kernel (kthreads), perhapos en un controlador personalizado, para realizar la inicialización deseada y la carga de trabajo del tipo de aplicación. El kernel de Linux ya contiene muchos kthreads, pero principalmente para realizar un trabajo auxiliar al kernel o los controladores. Las API disponibles en el contexto del núcleo son bastante diferentes de las disponibles en el espacio de usuario de Linux. Una gran fracción de la funcionalidad de llamada del sistema se volvería inútil en un escenario sin sistema de archivos.

Sí, Linux espera acceso a los sistemas de archivos de forma predeterminada. No, un kernel modificado ciertamente podría hacerse para realizar un trabajo útil sin ningún sistema de archivos. El uso práctico de Linux sin sistema de archivos es IMO bastante limitado, pero no nulo. FWIW, en el pasado muchos núcleos en tiempo real se integraron en el mismo espacio de nombres y binario que las aplicaciones RT.

stevea
fuente