initrd/initramfs es opcional y no un requisito. bzImage es la imagen pura del kernel y puede ser iniciada directamente por el gestor de arranque. Sin embargo, podría ser necesario ejecutar algunas tareas (cargar módulos del sistema de archivos, controladores para acceder al disco, montar el sistema de archivos raíz desde algún medio intercambiable sin nombre/ruta fijos, etc.) que normalmente requerirían acceso a un sistema de archivos y herramientas de espacio de usuario.
Eso es lo que initramfs es para:Es un archivo CPIO que se adjunta a la imagen del kernel (la imagen del kernel es el contenedor para initramfs y no al revés) ya sea en la imagen del kernel en sí o por el gestor de arranque en el momento del arranque.
Ese archivo CPIO contiene un rootfs inicial con los módulos necesarios para configurar todos los dispositivos para acceder al sistema de archivos raíz adecuado y algunos programas para identificar esos dispositivos, cargar los módulos, realizar otras tareas de inicio, volver a montar el sistema de archivos raíz adecuado en / e iniciar /sbin /iniciar
initrd es similar, con la principal diferencia de que es una imagen del sistema de archivos, que puede estar y generalmente está comprimida. El núcleo debe ser compatible con el sistema de archivos utilizado y montará esta imagen como / inicial.
Dado que CPIO es más simple en varios órdenes de magnitud, se prefiere initramfs a initrd, ya que esto ahorra el requisito de que se integren módulos de sistema de archivos y también facilita la creación de initramfs. En lugar de tener que crear una imagen ext2, montar un dispositivo de bucle y llenarla, todo se reduce a una simple creación de archivo, similar al uso de tar.
Sin embargo, si compila su kernel con todos los controladores y módulos necesarios integrados en la imagen del kernel, y su dispositivo de sistema de archivos raíz tiene un nombre fijo en el sistema, no necesita un initramfs ya que el kernel puede hacer las cosas por sí mismo.
Ejemplo de QEMU mínimo + Buildroot
Aquí hay un ejemplo concreto mínimo que muestra que initrd no es obligatorio:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0b4f156b1b536a89c90882ed8ce551abcd3780af#initrd
Con esa configuración, podemos ejecutar fácilmente dos comandos QEMU de tipo:
qemu-system-x86_64 -drive file=rootfs.ext2
y:
qemu-system-x86_64 -initrd rootfs.cpio
donde:
rootfs.ext2
yrootfs.cpio
son básicamente el mismo sistema de archivos raíz, pero en diferentes formatos- el primer comando tiene un disco duro y no
-initrd
- el segundo comando un
-initrd
pero sin disco duro
En ambos casos, Linux arranca bien, excepto que en el -initrd
sistema, las escrituras de archivos no son persistentes ya que todo está en la memoria.