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?
udev
generalmente, y sí, automáticamente.Respuestas:
Todo el kernel se carga en la memoria durante el arranque, generalmente junto con un
initramfs
hoy en día. (Todavía es posible configurar un sistema para arrancar sin un,initramfs
pero eso es inusual en escritorios y servidores).La
initramfs
funció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 menosudev
, tal vez algo de trabajo en red ykmod
qué 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: elinitramfs
,/lib/modules
en el sistema de archivos real en un árbol de desarrollo si está desarrollando un módulo ... Elinitramfs
sólo necesita contener los módulos que son necesarios para montar el sistema de ficheros raíz (que contiene el resto).fuente
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.
fuente
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,
initramfs
se 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 inicioinitramfs
, Linux ejecuta apivot_root(8)
, montando lo real/
y lanzando elinitramfs
contenido.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
initramfs
hardware 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".fuente
pivot_root
.