¿Está todo el kernel cargado en la memoria durante el arranque?

14

Leí este popular documento de IBM (lo veo referido con bastante frecuencia en la web) explicando la función del disco RAM inicial.

Sin embargo, me topé con un muro al conceptualizar cómo funciona esto.

En el documento dice

El cargador de arranque, como GRUB, identifica el núcleo que se va a cargar y copia esta imagen del núcleo y cualquier initrd asociado en la memoria

Ya estoy confundido: ¿copia todo el núcleo en la memoria o solo parte de él? Si todo el núcleo está en memoria, ¿por qué necesitamos el disco RAM inicial?

Pensé que el propósito de initrd era poder tener una pequeña imagen de kernel generalizada e initrd instalará los módulos correctos antes de que se cargue la imagen del kernel. Pero si todo el núcleo ya está en la memoria, ¿por qué necesitamos initrd?

Eso también trae a colación otra cosa que me confunde: ¿dónde están ubicados los módulos que se cargan en el núcleo? ¿Están todos los módulos del núcleo almacenados dentro de initrd?

usuario1028270
fuente
Si. Todo el núcleo. Y sus primeros rootfs. Pero los núcleos de Linux no han usado initrd en muchos años.
mikeserv
Justo estaba leyendo eso. Ha sido reemplazado en gran medida por initramfs ¿verdad? ¿Y sigue siendo un proceso similar con initramfs correcto?
user1028270
1
Se ha reemplazado por completo para todos los núcleos desde la serie 2.6. Pero el proceso es algo similar, excepto que initramfs nunca se desmonta: siempre está ahí y siempre es raíz. Tienes que montar tu desarrollador raíz sobre él, en realidad. También existen los beneficios de no necesitar emular un bloque de desarrollo separado y similar.
mikeserv
Genial, voy a leer el artículo que vinculaste. Entonces, ¿los módulos del kernel se almacenan en initramfs rootfs?
user1028270
1
@edwardtorvalds: todo eso se maneja udevgeneralmente, y sí, automáticamente.
mikeserv

Respuestas:

17

Todo el kernel se carga en la memoria durante el arranque, generalmente junto con un initramfshoy en día. (Todavía es posible configurar un sistema para arrancar sin un, initramfspero eso es inusual en escritorios y servidores).

La initramfsfunción de este es proporcionar la funcionalidad necesaria para montar los sistemas de archivos "reales" y continuar arrancando el sistema. Eso implica módulos de kernel, y también varios binarios: necesita al menos udev, tal vez algo de trabajo en red y kmodqué módulos de carga.

Los módulos se pueden cargar en el kernel más tarde que simplemente arrancar, por lo que no hay una preparación especial del kernel por parte de initramfs. Se pueden almacenar en cualquier lugar: el initramfs, /lib/modulesen el sistema de archivos real en un árbol de desarrollo si está desarrollando un módulo ... El initramfssólo necesita contener los módulos que son necesarios para montar el sistema de ficheros raíz (que contiene el resto).

Stephen Kitt
fuente
Vale, eso tiene sentido para mí. Creo que estaba combinando la imagen del kernel y el sistema de archivos que usa, que obviamente están totalmente separados.
user1028270
5

Todo el kernel (pero no sus módulos) se cargará en la memoria. Si hay módulos que el núcleo necesitará antes de que haya algún sistema de archivos disponible (esto generalmente significa los controladores para los sistemas de archivos y sus dispositivos), esos módulos estarán en initramfs (en la memoria), y el núcleo los cargará desde allí. Otros módulos se pueden cargar más tarde desde el sistema de archivos.

Toby Speight
fuente
3

El núcleo en las configuraciones modernas de Linux está fuertemente basado en módulos, es decir, el núcleo adecuado (cargado en el arranque en RAM) incluye solo la funcionalidad mínima, todo el resto se compila como módulos (cargables en tiempo de ejecución). Para que esto funcione incluso cuando, por ejemplo, los dispositivos o sistemas de archivos necesarios para el arranque son módulos, initramfsse carga una con el núcleo (como su nombre lo indica, esta es un área de RAM con un sistema de archivos simple, montado en el arranque). Este sistema de archivos temporal está montado /y contiene programas de inicio y los módulos necesarios. Una vez que se inicia el inicio initramfs, Linux ejecuta a pivot_root(8), montando lo real /y lanzando el initramfscontenido.

El punto de esta complejidad es que, por ejemplo, una distribución puede compilar un kernel (kernel mínimo y un conjunto completo de módulos) y, al instalar el kernel, crear un initramfshardware personalizado y la configuración de la máquina de destino. Todo esto es necesario debido a la gran variedad de dispositivos y configuraciones de "computadoras personales".

vonbrand
fuente
Eso no hacerlo pivot_root.
mikeserv