El ramdisk inicial (initrd) es típicamente una versión simplificada del sistema de archivos raíz que contiene solo lo que se necesita para montar el sistema de archivos raíz real y evitar el arranque.
El initrd existe porque en los sistemas modernos, el gestor de arranque no puede ser lo suficientemente inteligente como para encontrar el sistema de archivos raíz de manera confiable. Hay demasiadas posibilidades para un programa tan pequeño como el gestor de arranque para cubrir. Considere la raíz NFS, las tarjetas RAID no estándar, etc. El gestor de arranque tiene que hacer su trabajo utilizando solo el BIOS más cualquier código que pueda introducirse en el sector de arranque.
El initrd se almacena en algún lugar que el gestor de arranque puede encontrar, y es lo suficientemente pequeño como para que el espacio extra que ocupa no moleste a nadie. (En pequeños sistemas integrados, generalmente no hay una raíz "real", solo el initrd).
El initrd es precioso: su contenido debe conservarse en todas las condiciones, porque si el initrd se rompe, el sistema no puede arrancar. Una elección de diseño que hicieron sus diseñadores para garantizar esto es hacer que el cargador de arranque cargue el initrd de solo lectura. También hay otros principios que funcionan para esto, como en el caso de los sistemas pequeños donde no hay una raíz "real", todavía se monta por separado /tmp
, /var/cache
y para almacenar cosas. El cambio de initrd se realiza solo en raras ocasiones y luego debe hacerse con mucho cuidado.
Volviendo al caso normal donde no es un verdadero sistema de ficheros raíz, que inicialmente se montará sólo lectura porque era initrd. Luego se mantiene como de solo lectura el mayor tiempo posible por las mismas razones. Cualquier escritura en la raíz real que deba realizarse se pospone hasta que el sistema se inicie, por preferencia, o al menos hasta el final del proceso de arranque, cuando esa preferencia no se puede satisfacer.
Lo más importante que sucede durante esta fase de solo lectura es que el sistema de archivos raíz se verifica para ver si se desmontó limpiamente. Eso es algo que el gestor de arranque ciertamente podría hacer en lugar de dejarlo al initrd, pero ¿qué sucede si el sistema de archivos raíz no se desmontó limpiamente? Luego tiene que llamar fsck
para verificar y posiblemente arreglarlo. Entonces, ¿dónde sería initrd
conseguir fsck
, si era responsable de este paso en lugar de esperar hasta que el traspaso a la raíz "real"? Se podría decir que tiene que copiar fsck
a la initrd
hora de construir, pero ahora es más grande. Y además de eso, ¿ cuál fsck
copiarás? Los sistemas Linux utilizan regularmente una docena de sistemas de archivos diferentes. ¿Copias solo el necesario para la raíz real en el momento en queinitrd
¿es creado? ¿Se aumenta el tamaño initrd
copiando todos los fsck.foo
programas disponibles en él, en caso de que el sistema de archivos raíz se migre más tarde a otro tipo de sistema de archivos y alguien se olvide de reconstruir el initrd?
Los arquitectos del sistema de arranque de Linux eligieron sabiamente no cargar al initrd con estos problemas. Delegaron la verificación del sistema de archivos raíz real al sistema de archivos raíz real, ya que está en una mejor posición para hacerlo que el initrd.
Una vez que el proceso de arranque ha avanzado lo suficiente como para que sea seguro hacerlo, el initrd se intercambia desde debajo de la raíz real con pivot_root(8)
, y el sistema de archivos se vuelve a montar en modo lectura-escritura.