Descubrí que si elijo jffs
o sd
como sistema de archivos (y no initramfs
), el tamaño del kernel será muy pequeño (1.4 MB en comparación con initramfs
3.4 MB). Significa que initramfs
ocupa un espacio considerablemente grande. Entonces, si puedo, lo eliminaría por completo y, por lo tanto, tendré un núcleo muy pequeño, que es lo que quiero.
La pregunta básica que surge en mi mente es: ¿Por qué necesito initramfs
? ¿No puede arrancar un kernel de Linux sin tener un sistema de archivos inicial?
Mi aplicación final solo hará cálculo y comunicación, sin almacenamiento en absoluto. Por lo tanto, un sistema operativo sin un sistema de archivos tiene sentido, al menos para mi aplicación.
/root
eso. Lo único que hace de manera diferente esswitch_root
pero incluso eso, siempre que se tomen las precauciones adecuadas con ciertos módulos de kernel cargados, se puede hacer en cualquier momento. Initramfs no es más que una imagen de disco: rebosante o no, está ahí. Y nunca estás sin él, es tu raíz después de todo. Simplemente no debería ser un misterio, es lo que pienso, y no me gusta toda la confusión innecesaria que lo rodea.Respuestas:
El aumento de tamaño de tener un initramfs no se debe al controlador ramfs (es solo unos pocos KB, y de todos modos es necesario para otras cosas), sino al propio initramfs. Initramfs contiene programas que son necesarios para ensamblar y montar el sistema de archivos raíz real.
Initramfs hace que sea mucho más fácil, y en algunos casos posible (por ejemplo, encriptado
/
), iniciar el sistema. Se recomienda encarecidamente mantenerlo en hardware estilo PC con muchos periféricos conectables en caliente. Por otro lado, tiene mucho sentido arrancar un dispositivo incrustado sin ningún initramfs, con un núcleo que solo admita la configuración de hardware particular para la que está construido.El núcleo, por supuesto, debe iniciarse en un sistema de archivos: tiene que haber alguna forma de cargar cualquier aplicación que desee ejecutar. Si no va a ejecutar nada, es mejor que mantenga la máquina apagada.
Si no quieres usar un initramfs, solo dile a tu gestor de arranque que no pase uno. Tampoco incluya uno en la salida de la construcción del núcleo, por supuesto, cómo sucede esto si depende de la arquitectura y del cargador de arranque: por ejemplo,
vmlinux
ybzImage
no incluya initramfs (son el núcleo sin procesar y comprimido respectivamente ), perouImage
(para U-Boot) empaqueta tanto el núcleo como el initramfs si hay uno.(Técnicamente, como señala mikeserv , siempre hay un initramfs, pero de manera predeterminada, es un archivo vacío de 134 bytes. Lo que está viendo y desea deshacerse de él es un initramfs "verdadero", no vacío creado por su proceso de compilación y herramientas que luego se utilizan para montar el sistema de archivos raíz).
Eso sí, un initramfs puede ser una forma razonable de hacer un sistema de aplicación única sin datos persistentes: coloque toda su aplicación en initramfs, inicie eso y guárdelo. Esto facilita la organización de su almacenamiento persistente o imagen de arranque (todo lo que necesita es el kernel y initramfs, que se pueden agrupar). Sin embargo, este enfoque tiene desventajas: todos los datos en initramfs se almacenarán en la RAM de forma permanente, y no puede modificar fácilmente los archivos en la imagen de arranque, debe reconstruir el archivo.
fuente
De LFS :
...
...
Otra fuente www.kernel.org
Además de esto, hay muchos sistemas Linux a los que les gustan los enrutadores que no usan initramfs.
fuente
Necesita un initramfs para configuraciones más complejas, como arranque de red, o lvm o raid, ya que requieren algunas utilidades de modo de usuario para configurar el acceso a la raíz fs. Para una partición simple y convencional en un disco, siempre que tenga los controladores de disco integrados en el kernel y especifique el argumento raíz por la ruta del dispositivo en lugar de UUID, puede hacerlo sin un initramfs. Por supuesto, la ruta del dispositivo está sujeta a cambios, dependiendo de los dispositivos plug and play (es decir, usb) que haya conectado, o incluso de las variaciones de temporización aleatorias, razón por la cual casi todos usan uuids y un initramfs para mayor confiabilidad.
fuente
Esta es una pregunta antigua, pero aún no parece tener una respuesta aceptada, así que la arrojaré (no soy un experto aquí, estoy tratando de resolverlo por mí mismo).
Desde https://www.kernel.org/doc/Documentation/early-userspace/README (hasta el final, que dice que no se ha actualizado desde 2004).
Por lo que vale, creo que los dispositivos / distribuciones como Raspberry Pi, etc. no usan initramfs; en algunos casos el núcleo está en la partición raíz (montado por el gestor de arranque que tiene los módulos fs necesarios). En otros casos donde el núcleo está, por ejemplo, en una
/boot
partición, se puede acceder a initramfs en la misma partición directamente antes de montar el rootfs como otros Ha establecido.En algunos casos, initramfs puede integrarse en el mismo archivo que el kernel, pero este no es siempre el caso. (a) parece indicar con bastante claridad que, en algunos casos, initramfs no es necesario.
fuente
Encuentro la siguiente explicación más clara,
fuente
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 deramfs
(otmpfs
, 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á entmpfs
lugar deramfs
por defecto. Para forzarramfs
, 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 extraerootfs
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:
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:
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.
fuente
do_mounts.c
- específicamenteprepare_namespace
, en la quesaved_root_name
viene poblada con elroot=
argumento de línea de comando.