Los documentos del núcleo explican cómo empaquetar una imagen en el núcleo mismo. Desde kernel.org :
¿Qué es rootfs?
Rootfs
es una instancia especial de ramfs
(o tmpfs
, si está habilitada), que siempre está
presente en los sistemas 2.6. No puede desmontarrootfs
aproximadamente por la misma razón por la que no puede eliminar el proceso de inicio; en lugar de tener un código especial para verificar y manejar una lista vacía, es más pequeño y simple para el núcleo asegurarse de que ciertas listas no puedan quedar vacías.
La mayoría de los sistemas simplemente montan otro sistema de archivos rootfs
y lo ignoran. La cantidad de espacio que ocupa una instancia vacía de ramfs es pequeña.
Si CONFIG_TMPFS está habilitado, rootfs
se usará en tmpfs
lugar de ramfs
por defecto. Para forzar ramfs
, agregue "rootfstype=ramfs"
a la línea de comando del núcleo.
¿Qué es initramfs?
Todos los núcleos 2.6 de Linux contienen un"cpio"
archivo de formato comprimido, que se extrae rootfs
cuando se inicia el núcleo. Después de extraer, el kernel verifica sirootfs
contiene un archivoy"init"
, de ser así, lo ejecuta como PID 1. Si se encuentra, esteinit
proceso es responsable de llevar el sistema al resto, incluyendo la ubicación y el montaje del dispositivo raíz real ( Si alguna). Sirootfs
no contiene uninit
programa después de que elcpio
archivoincrustadose extrae, el núcleo pasará al código anterior para ubicar y montar una partición raíz, luego ejecute alguna variante/sbin/init
de eso.
Todo esto difiere del antiguo initrd de varias maneras:
El viejo initrd siempre fue un archivo separado, mientras que el archivo initramfs está vinculado a la imagen del kernel de Linux. (El directorio linux - * / usr está dedicado a generar este archivo durante la compilación).
El antiguo archivo initrd era una imagen del sistema de archivos comprimido (en algún formato de archivo, como ext2, que necesitaba un controlador integrado en el núcleo), mientras que el nuevo archivo initramfs es un archivo comprimido de cpio (como tar, más simple, vea cpio (1) y Documentation / early-userspace / buffer-format.txt). El código de extracción cpio del kernel no solo es extremadamente pequeño, también es __init texto y datos que pueden descartarse durante el proceso de arranque.
El programa ejecutado por el antiguo initrd (que se llamaba / initrd, no / init) realizó una configuración y luego regresó al kernel, mientras que no se espera que el programa init de initramfs regrese al kernel. (Si / init necesita transferir el control, puede sobremontarse / con un nuevo dispositivo raíz y ejecutar otro programa de inicio. Consulte la utilidad switch_root, a continuación).
Al cambiar otro dispositivo raíz, initrd pivot_root y luego desmontaría el ramdisk. Pero initramfs es rootfs: no puede pivot_root rootfs, ni desmontarlo. En su lugar, elimine todo de rootfs para liberar el espacio (find -xdev / -exec rm '{}' ';'), superponga rootfs con la nueva raíz (cd / newmount; mount --move. /; Chroot.), adjunte stdin / stdout / stderr a la nueva / dev / console y ejecute el nuevo init.
Dado que este es un proceso notablemente perspicaz (e implica eliminar comandos antes de que pueda ejecutarlos), el paquete klibc introdujo un programa auxiliar (utils / run_init.c) para hacer todo esto por usted. La mayoría de los otros paquetes (como busybox) han llamado a este comando "switch_root".
Poblar initramfs:
El proceso de compilación del kernel 2.6 siempre crea un archivo initramfs en formato cpio comprimido y lo vincula al binario del kernel resultante. Por defecto, este archivo está vacío (consume 134 bytes en x86).
La opción de configuración CONFIG_INITRAMFS_SOURCE (en Configuración general en menuconfig,
y viviendo en usr/Kconfig
) se puede utilizar para especificar una fuente para el
initramfs
archivo, que se incorporará automáticamente al binario resultante. Esta opción puede apuntar a un * existente gzipped cpio
archivo *, un directorio que contiene los archivos a ser archivada, o un texto de especificación de archivo como el siguiente ejemplo:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Ejecute " usr/gen_init_cpio
" (después de la compilación del núcleo) para obtener un mensaje de uso que documente el formato de archivo anterior.
Una ventaja del archivo de configuración es que root
no se requiere acceso para establecer permisos o crear nodos de dispositivo en el nuevo archivo.
(Tenga en cuenta que esas dos entradas de "archivo" de ejemplo esperan encontrar archivos llamados " init.sh
" y " busybox
" en un directorio llamado " initramfs
", en el linux
directorio -2.6. *. Consulte Documentación / early-userspace / README para obtener más detalles).
El núcleo no depende de cpio
herramientas externas . Si especifica un directorio en lugar de un archivo de configuración, la infraestructura de compilación del núcleo crea un archivo de configuración a partir de ese directorio ( usr/Makefile
llamadas scripts/gen_initramfs_list.sh
) y procede a empaquetar ese directorio utilizando el archivo de configuración (al alimentarlo usr/gen_init_cpio
, que se crea a partir de usr/gen_init_cpio.c
). El código de creación del tiempo de compilación del núcleo cpio
es completamente autónomo, y el extractor del tiempo de arranque del núcleo también es (obviamente) autónomo.