En los sistemas Linux , initrd( ramdisk inicial ) es un esquema para cargar un sistema de archivos raíz temporal en la memoria , que se utilizará como parte del proceso de inicio de Linux . initrdy initramfs(del sistema de archivos RAM inicial ) se refieren a dos métodos diferentes para lograr esto. Ambos se utilizan comúnmente para realizar preparativos antes de que se pueda montar el sistema de archivos raíz real .
Razón fundamental
Muchas distribuciones de Linux incluyen una única imagen genérica del kernel , creada por sus desarrolladores específicamente para arrancar en una amplia variedad de hardware. Los controladores de dispositivo para esta imagen genérica se incluyen como módulos del kernel cargables, ya que compilar estáticamente muchos controladores en un solo kernel aumenta considerablemente el tamaño de la imagen, pudiendo resultar demasiado grande para arrancar en equipos con memoria limitada o, en algunos casos, provocar fallos durante el arranque u otros problemas debido a la búsqueda de hardware inexistente o conflictivo. Este enfoque de compilación estática del kernel también deja módulos en la memoria del kernel que ya no se utilizan o necesitan, lo que a su vez plantea el problema de detectar y cargar los módulos necesarios para montar el sistema de archivos raíz durante el arranque o, incluso, determinar dónde se encuentra el sistema de archivos raíz. [ 1 ]
Para complicar aún más las cosas, el sistema de archivos raíz puede estar en un volumen RAID por software, LVM , NFS (en estaciones de trabajo sin disco) o en una partición cifrada. Todos estos requieren preparativos especiales para su montaje. [ 2 ]
Otra complicación es la compatibilidad del kernel con la hibernación , que suspende el sistema guardando en disco una imagen de todo el contenido de la memoria en una partición de intercambio o un archivo regular, para luego apagarlo. En el siguiente arranque, esta imagen debe hacerse accesible antes de poder cargarse de nuevo en la memoria.
Para evitar tener que codificar manualmente el manejo de tantos casos especiales en el kernel, se utiliza una etapa de arranque inicial con un sistema de archivos raíz temporal —ahora denominado espacio de usuario temprano— . Este sistema de archivos raíz puede contener auxiliares de espacio de usuario que realizan la detección de hardware, la carga de módulos y el descubrimiento de dispositivos necesarios para montar el sistema de archivos real. [ 2 ]
Implementación

mkinitcpio, un programa para generar initramfs en Arch Linux y distribuciones relacionadas
dracut, otro programa para generar initramfs en algunas distribuciones de LinuxSe debe almacenar una imagen de este sistema de archivos raíz inicial (junto con la imagen del kernel) en algún lugar accesible para el gestor de arranque de Linux o el firmware de arranque del ordenador. Esto puede ser el propio sistema de archivos raíz, una imagen de arranque en un disco óptico , una pequeña partición en un disco local (una partición de arranque , que normalmente utiliza sistemas de archivos ext2 o FAT ) o un servidor TFTP (en sistemas que pueden arrancar desde Ethernet ).
El gestor de arranque carga el núcleo y la imagen inicial del sistema de archivos raíz en la memoria y, a continuación, inicia el núcleo, pasándole la dirección de memoria de la imagen. Al final de la secuencia de arranque, el núcleo intenta determinar el formato de la imagen a partir de sus primeros bloques de datos, lo que puede dar lugar al esquema initrd o initramfs.
En el esquema initrd , la imagen puede ser una imagen del sistema de archivos (opcionalmente comprimida), que se pone a disposición en un dispositivo de bloques especial ( /dev/ram ) que luego se monta como el sistema de archivos raíz inicial. [ 3 ] El controlador para ese sistema de archivos debe compilarse estáticamente en el kernel. Muchas distribuciones originalmente usaban imágenes comprimidas del sistema de archivos ext2 , mientras que otras (incluida Debian 3.1) usaban cramfs para arrancar en sistemas con memoria limitada, ya que la imagen cramfs se puede montar en el lugar sin requerir espacio adicional para la descompresión. Una vez que el sistema de archivos raíz inicial está activo, el kernel ejecuta /linuxrc como su primer proceso; [ 4 ] cuando sale, el kernel asume que el sistema de archivos raíz real se ha montado y ejecuta /sbin/init para comenzar el proceso normal de arranque del espacio de usuario. [ 3 ]
En el esquema initramfs (disponible desde el kernel de Linux 2.6.13), la imagen puede ser un archivo cpio (opcionalmente comprimido) o una concatenación de dichos archivos. El kernel descomprime el archivo en una instancia especial de un tmpfs que se convierte en el sistema de archivos raíz inicial. Este esquema tiene la ventaja de no requerir que se compile un sistema de archivos intermedio o controladores de bloques en el kernel. [ 5 ] Algunos sistemas utilizan el paquete dracut para crear una imagen initramfs. [ 6 ] En el esquema initramfs, el kernel ejecuta /init como su primer proceso que no se espera que finalice. [ 5 ] Para algunas aplicaciones, initramfs puede utilizar la utilidad casper para crear un entorno de escritura utilizando unionfs para superponer una capa de persistencia sobre una imagen de sistema de archivos raíz de solo lectura. Por ejemplo, los datos de superposición se pueden almacenar en una unidad flash USB , mientras que una imagen SquashFS comprimida de solo lectura almacenada en un CD de arranque actúa como un sistema de archivos raíz. [ 7 ] [ 8 ]
Dependiendo de qué algoritmos se hayan compilado estáticamente en él, el kernel puede desempaquetar imágenes initrd/initramfs comprimidas con gzip , bzip2 , LZMA , XZ , LZO , LZ4 , [ 9 ] y zstd .
Preparativos de montaje
Algunas distribuciones de Linux, como Debian, generan una imagen initrd personalizada que contiene solo lo necesario para arrancar un ordenador específico, como los módulos del kernel ATA , SCSI y del sistema de archivos . Estos módulos suelen incluir la ubicación y el tipo del sistema de archivos raíz.
Otras distribuciones de Linux (como Fedora y Ubuntu ) generan una imagen initrd más genérica. Estas comienzan solo con el nombre del dispositivo del sistema de archivos raíz (o su UUID ) y deben descubrir todo lo demás durante el arranque. En este caso, el software debe realizar una compleja cascada de tareas para montar el sistema de archivos raíz:
- Es necesario cargar todos los controladores de hardware de los que dependa el proceso de arranque. Una práctica común consiste en empaquetar los módulos del kernel para los dispositivos de almacenamiento habituales en el initrd y, a continuación, invocar un agente hotplug para descargar los módulos que coincidan con el hardware detectado en el ordenador.
- En los sistemas que muestran una pantalla de inicio , es necesario inicializar el hardware de vídeo y poner en marcha un programa auxiliar en el espacio de usuario para que muestre animaciones en la pantalla al mismo tiempo que el proceso de arranque.
- Si el sistema de archivos raíz está en NFS, entonces debe activar la interfaz de red principal , invocar un cliente DHCP , con el que pueda obtener una concesión DHCP, extraer el nombre del recurso compartido NFS y la dirección del servidor NFS de la concesión, y montar el recurso compartido NFS.
- Si el sistema de archivos raíz parece estar en un dispositivo RAID por software, no hay forma de saber qué dispositivos abarca el volumen RAID; se deben invocar las utilidades MD estándar para escanear todos los dispositivos de bloques disponibles y poner en línea los necesarios.
- Si el sistema de archivos raíz parece estar en un volumen lógico , se deben invocar las utilidades LVM para buscar y activar el grupo de volúmenes que lo contiene.
- Si el sistema de archivos raíz se encuentra en un dispositivo de bloques cifrado, el software necesita invocar un script auxiliar para solicitar al usuario que escriba una contraseña o inserte un token de hardware (como una tarjeta inteligente o un dongle de seguridad USB ) y, a continuación, crear un objetivo de descifrado con el mapeador de dispositivos .
Algunas distribuciones utilizan un agente de conexión en caliente basado en eventos, como udev , que invoca programas auxiliares cuando los dispositivos de hardware, las particiones de disco y los volúmenes de almacenamiento que cumplen ciertas reglas se conectan. Esto permite que el descubrimiento se ejecute en paralelo y se propague progresivamente a través de anidamientos arbitrarios de LVM, RAID o cifrado para acceder al sistema de archivos raíz.
Cuando el sistema de archivos raíz finalmente se hace visible, se realizan todas las tareas de mantenimiento que no se pueden ejecutar en un sistema de archivos raíz montado, el sistema de archivos raíz se monta en modo de solo lectura y cualquier proceso que deba continuar ejecutándose (como el asistente de la pantalla de inicio y su comando FIFO ) se traslada al sistema de archivos raíz recién montado.
El sistema de archivos raíz final no se puede simplemente montar sobre / , ya que eso haría que los scripts y las herramientas del sistema de archivos raíz inicial fueran inaccesibles para cualquier tarea de limpieza final:
- En un initrd, el nuevo directorio raíz se monta en un punto de montaje temporal y se rota hasta su posición con pivot_root(8) (función introducida específicamente para este propósito). Esto deja el sistema de archivos raíz inicial en un punto de montaje (como /initrd ) donde los scripts de arranque normales pueden desmontarlo posteriormente para liberar la memoria ocupada por el initrd.
- En un initramfs, el sistema de archivos raíz inicial no se puede rotar. [ 10 ] En su lugar, simplemente se vacía y el sistema de archivos raíz final se monta encima.
La mayoría de los sistemas de archivos raíz iniciales implementan /linuxrc o /init como un script de shell y, por lo tanto, incluyen un shell mínimo (normalmente /bin/ash ) junto con algunas utilidades esenciales del espacio de usuario (normalmente el kit de herramientas BusyBox ). Para ahorrar aún más espacio, el shell, las utilidades y sus bibliotecas de soporte se compilan normalmente con optimizaciones de espacio habilitadas (como con la bandera "-Os" de gcc ) y se enlazan con klibc , una versión mínima de la biblioteca C escrita específicamente para este propósito. [ 11 ]
Otros usos
Los instaladores de distribuciones de Linux suelen ejecutarse completamente desde un initramfs, ya que deben poder alojar la interfaz del instalador y las herramientas de soporte antes de que se haya configurado cualquier almacenamiento persistente.
Tiny Core Linux [ 12 ] y Puppy Linux [ 13 ] pueden ejecutarse completamente desde initrd.
Similitudes en otros sistemas operativos
Desde Windows Vista, [ 14 ] Windows puede arrancar desde un archivo de imagen de disco WIM , cuyo formato de archivo está publicado; [ 15 ] es similar al formato ZIP excepto que admite enlaces duros, fragmentos deduplicados y utiliza compresión fragmento a fragmento. En este caso, todo el WIM se carga inicialmente en la RAM, seguido de la inicialización del kernel. Luego, el WIM cargado está disponible como SystemRoot con una letra de unidad asignada. El instalador de Windows usa esto para arrancar desde BOOT.WIM, y luego usa INSTALL.WIM como la colección de archivos de Windows que se instalarán.
Asimismo, el Entorno de preinstalación de Windows (Windows PE) utiliza el mismo protocolo, sirviendo de base para versiones de arranque independiente de algunos programas antivirus y de copia de seguridad/recuperación ante desastres.
También es posible instalar Windows de forma que siempre arranque desde un archivo WIM o VHD ubicado en una unidad física. Sin embargo, esto rara vez se utiliza, ya que el gestor de arranque de Windows es capaz de cargar los archivos .sys para los módulos del kernel de arranque por sí mismo, tarea que requiere initrd en Linux.
Véase también
- dracut
- Proceso de arranque de dispositivos Android
- Proceso de arranque de Linux
- Lista de distribuciones de Linux que se ejecutan desde la RAM.
- Módulo de arranque EFI (Wiki de Arch Linux)
Referencias
- ↑ Almesberger, Werner (2000), "Arrancando Linux: historia y futuro" , Actas del Simposio Linux de Ottawa , archivado del original el 24 de julio de 2008.
- 1 2 Landley, Rob (15 de marzo de 2005), Presentación de initramfs, un nuevo modelo para discos RAM iniciales
- 1 2 Almesberger, Werner; Lermen, Hans (2000). "Uso del disco RAM inicial (initrd)" . Archivado del original el 2 de abril de 2015. Recuperado el 14 de marzo de 2015 .
- ↑ "linux/do_mounts_initrd.c en 4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7 · torvalds/linux · GitHub" . GitHub .
- 1 2 Landley, Rob (17 de octubre de 2005). "Documentación de ramfs, rootfs e initramfs, toma 2" . Árbol de código fuente del kernel de Linux.
- ↑ Petersen, Richard Leland (2010). Fedora 13: Administración, redes, seguridad . Alameda, California: Surfing Turtle Press. pág. 76. ISBN 978-1-936280-02-5Dracut
utiliza los parámetros del kernel que aparecen en la línea de comandos del kernel GRUB para configurar el sistema de archivos RAM initramfs sobre la marcha, lo que proporciona mayor flexibilidad y reduce aún más el código del sistema de archivos RAM.
- ↑ "Ubuntu Manpage: casper - un gancho para initramfs-tools para arrancar sistemas en vivo" . manpages.ubuntu.com . Archivado del original el 4 de agosto de 2017. Consultado el 7 de agosto de 2017 .
- ↑ Shawn Powers. "Casper, el fantasma amigable (y persistente)" . Linux Journal. 2012.
- ↑ Kyungsik Lee (30 de mayo de 2013). "Compresión LZ4 y mejora del tiempo de arranque" (PDF) . events.linuxfoundation.org . pág. 18. Consultado el 29 de mayo de 2015 .
- ↑ Fish, Richard (6 de julio de 2005). "pivot_root de initramfs causa una referencia circular en el árbol de montaje" . Linux Kernel Bug Tracker . Consultado el 28 de febrero de 2009 .
- ↑ Garzik, Jeff (2 de noviembre de 2002). "Fusión de initramfs, parte 1 de N" . Lista de correo del kernel de Linux .
- ↑ "Tiny Core Linux - Conceptos" . ibiblio.org .
- ↑ Barry Kauler. "Anuncio de lanzamiento de Puppy Linux" . ibiblio.org .
- ↑ "Formato de archivo de imágenes de Windows (WIM)" . microsoft.com . Microsoft.
- ↑ "Descargar el formato de archivo de imagen de Windows (WIM) desde el Centro de descargas oficial de Microsoft" . Microsoft.com . Microsoft.
Enlaces externos
- Herramientas initramfs de Debian
- Comparación detallada de los conjuntos de herramientas para la generación de initrd.
- Documentación del kernel sobre la compatibilidad temprana con el espacio de usuario
- "Motivation for switch from initrd to initramfs".
{{cite web}}: CS1 maint: deprecated archival service (link)Alt URL
- Booting
- Linux kernel