No importa lo que hagas, tienes initramfs
. No se puede prescindir de él: es el único sistema de archivos que se le impone. 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 sencillo 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 núcleo 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, y luego/sbin/init
ejecutaráalguna variantede 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 núcleo no solo es extremadamente pequeño, sino que también contiene 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 se 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 usar para especificar una fuente para el archivo initramfs, que se incorporará automáticamente al binario resultante. Esta opción puede apuntar a un archivo cpio gzipped existente, un directorio que contiene archivos para archivar o una especificación de archivo de texto 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 no se requiere acceso a la raíz 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 directorio linux-2.6. *. Consulte Documentación / early-userspace / README para más detalles.)
El kernel no depende de herramientas externas de cpio. 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 llama a scripts / gen_initramfs_list.sh), y procede a empaquetar ese directorio utilizando el archivo de configuración (al alimentarlo a usr / gen_init_cpio, que se crea a partir de usr / gen_init_cpio.c). El código de creación de cpio en tiempo de compilación del núcleo es completamente autónomo, y el extractor de tiempo de arranque del núcleo también es (obviamente) autónomo.