En informática (específicamente en lo que respecta a la informática Linux ), initrd
( ramdisk inicial ) es un esquema para cargar un sistema de archivos raíz temporal en la memoria , que puede utilizarse como parte del proceso de inicio de Linux . initrd
y initramfs
haga referencia a dos métodos diferentes para lograrlo. Ambos se utilizan comúnmente para hacer preparativos antes de que se pueda montar el sistema de archivos raíz real .
Razón fundamental
Muchas distribuciones de Linux envían una única imagen genérica del kernel de Linux , una que los desarrolladores de la distribución crean específicamente para arrancar en una amplia variedad de hardware. Los controladores de dispositivo para esta imagen genérica del núcleo se incluyen como módulos cargables del núcleo porque la compilación estática de muchos controladores en un núcleo hace que la imagen del núcleo sea mucho más grande, quizás demasiado grande para arrancar en computadoras con memoria limitada. Esto luego plantea el problema de detectar y cargar los módulos necesarios para montar el sistema de archivos raíz en el momento del arranque, o para el caso, deducir dónde o cuál es 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 de software , LVM , NFS (en estaciones de trabajo sin disco) o en una partición cifrada. Todos estos requieren preparaciones especiales para montar. [2]
Otra complicación es la compatibilidad del kernel con la hibernación , que suspende la computadora en el disco volcando una imagen de todo el contenido de la memoria en una partición de intercambio o un archivo normal y luego se apaga. En el próximo arranque, esta imagen debe estar accesible antes de que pueda volver a cargarse en la memoria.
Para evitar tener que codificar el manejo para tantos casos especiales en el kernel, se usa 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 ayudantes 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 raíz real. [2]
Implementación
Una imagen de este sistema de archivos raíz inicial (junto con la imagen del kernel) debe almacenarse en algún lugar accesible para el cargador de arranque de Linux o el firmware de arranque de la computadora. Este 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 , generalmente usando sistemas de archivos ext2 o FAT ) o un servidor TFTP (en sistemas que pueden arrancar desde Ethernet ).
El cargador de arranque cargará el kernel y la imagen inicial del sistema de archivos raíz en la memoria y luego iniciará el kernel, pasando la dirección de memoria de la imagen. Al final de su secuencia de arranque, el kernel intenta determinar el formato de la imagen a partir de sus primeros bloques de datos, lo que puede llevar al esquema initrd o initramfs.
En el esquema initrd , la imagen puede ser una imagen del sistema de archivos (opcionalmente comprimida), que está disponible en un dispositivo de bloque 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 (incluido 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 se ejecuta / linuxrc como su primer proceso; [4] cuando sale, el kernel asume que el sistema de archivos raíz real ha sido montado y se ejecuta / sbin / init para comenzar el proceso de inicio normal desde el 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). 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 un sistema de archivos intermedio o controladores de bloque para ser compilados en el kernel. [5] Algunos sistemas usan 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 salga. [5] Para algunas aplicaciones, initramfs puede usar la utilidad casper para crear un entorno de escritura usando unionfs para superponer una capa de persistencia sobre una imagen de sistema de archivos raíz de solo lectura. Por ejemplo, los datos superpuestos se pueden almacenar en una unidad flash USB , mientras que una imagen comprimida de solo lectura de SquashFS almacenada en un CD activo actúa como un sistema de archivos raíz. [7] [8]
Dependiendo de qué algoritmos se compilaron estáticamente en él, el kernel puede descomprimir imágenes initrd / initramfs comprimidas con gzip , bzip2 , LZMA , XZ , LZO y LZ4 . [9]
Preparaciones de montaje
Algunas distribuciones de Linux como Debian generarán una imagen initrd personalizada que contiene solo lo necesario para arrancar una computadora en particular, como ATA , SCSI y módulos del kernel del sistema de archivos . Por lo general, estos incluyen la ubicación y el tipo de sistema de archivos raíz.
Otras distribuciones de Linux (como Fedora y Ubuntu ) generan una imagen initrd más genérica. Estos comienzan solo con el nombre del dispositivo del sistema de archivos raíz (o su UUID ) y deben descubrir todo lo demás en el momento del arranque. En este caso, el software debe realizar una compleja cascada de tareas para montar el sistema de archivos raíz:
- Se deben cargar todos los controladores de hardware de los que depende el proceso de arranque. Un arreglo común es empaquetar módulos del kernel para dispositivos de almacenamiento comunes en el initrd y luego invocar a un agente hotplug para incorporar módulos que coincidan con el hardware detectado de la computadora.
- En los sistemas que muestran una bota pantalla de bienvenida , el hardware de vídeo debe ser inicializado y un ayudante del espacio de usuario comenzó a pintar animaciones en la pantalla al mismo paso con el proceso de arranque.
- Si el sistema de archivos raíz está en NFS, debe abrir la interfaz de red principal , invocar un cliente DHCP , con el que puede obtener una concesión DHCP, extraer el nombre del recurso compartido NFS y la dirección del servidor NFS de la concesión. y monte el recurso compartido NFS.
- Si el sistema de archivos raíz parece estar en un dispositivo RAID de 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 bloque disponibles y poner los necesarios en línea.
- 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 está en un dispositivo de bloque cifrado, el software necesita invocar un script auxiliar para pedirle al usuario que escriba una frase de contraseña y / o inserte un token de hardware (como una tarjeta inteligente o un dispositivo de seguridad USB ), y luego cree un destino de descifrado con el mapeador de dispositivos .
Algunas distribuciones utilizan un agente de conexión en caliente controlado por eventos , como udev , que invoca programas auxiliares cuando se conectan los dispositivos de hardware, las particiones de disco y los volúmenes de almacenamiento que coinciden con ciertas reglas. Esto permite que el descubrimiento se ejecute en paralelo y se distribuya progresivamente en cascada en anidamientos arbitrarios de LVM, RAID o cifrado para llegar al sistema de archivos raíz.
Cuando el sistema de archivos raíz finalmente se vuelve 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 como de solo lectura y cualquier proceso que deba continuar ejecutándose (como el asistente de pantalla de presentación y su comando FIFO ) se incorporan 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 herramientas en el sistema de archivos raíz inicial fueran inaccesibles para cualquier tarea de limpieza final:
- En un initrd, la nueva raíz se monta en un punto de montaje temporal y se gira a su lugar con pivot_root (8) (que se introdujo 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 más tarde para liberar la memoria que tiene initrd.
- En un initramfs, el sistema de archivos raíz inicial no se puede rotar. [10] En cambio, simplemente se vacía y el sistema de archivos raíz final se monta en la parte superior.
La mayoría de los sistemas de archivos raíz iniciales implementan / linuxrc o / init como un script de shell y, por lo tanto, incluye un shell mínimo (generalmente / bin / ash ) junto con algunas utilidades esenciales de espacio de usuario (generalmente el kit de herramientas BusyBox ). Para más ahorrar espacio, la concha, los servicios públicos y sus bibliotecas de soporte están típicamente compiladas con optimizaciones espacio habilitado (como con gcc '-Os' flag 's) y vinculados contra klibc , una versión mínima de la biblioteca C escrita específicamente para este propósito . [11]
Otros usos
Los instaladores para distribuciones de Linux generalmente se ejecutan completamente desde un initramfs, ya que deben poder alojar la interfaz del instalador y las herramientas de soporte antes de que se haya configurado el almacenamiento persistente.
Tiny Core Linux [12] y Puppy Linux [13] [ verificación fallida ] 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 se publica oficialmente; [15] es bastante similar al formato ZIP excepto que admite enlaces duros, utiliza compresión fragmento por fragmento y puede admitir fragmentos deduplicados. En este caso, todo el WIM se carga inicialmente en la RAM, seguido de la inicialización del kernel. A continuación, el WIM cargado está disponible como SystemRoot con una letra de unidad asignada. El instalador de Windows usa esto para que arranque desde BOOT.WIM, y luego usa INSTALL.WIM como la colección de archivos de Windows que se instalarán.
Además, el entorno de preinstalación de Windows (Windows PE) utiliza el mismo, siendo una base para versiones de arranque independientes de algunos antivirus y software de copia de seguridad / recuperación ante desastres.
También es posible instalar Windows para que siempre se inicie desde un archivo WIM o VHD ubicado en una unidad física. Sin embargo, esto rara vez se usa ya que el cargador de arranque de Windows es capaz de cargar los archivos .sys para los módulos del kernel en el momento del arranque, que es la tarea que requiere initrd en Linux.
Ver también
- Proceso de inicio de Linux
- Lista de distribuciones de Linux que se ejecutan desde RAM
- El arranque EFISTUB permite que el firmware EFI cargue un kernel de Linux (Arch Linux Wiki)
Referencias
- ^ Almesberger, Werner (2000), "Arranque de Linux: la historia y el futuro" , Actas del Simposio de Ottawa Linux , archivado desde el original el 24 de julio de 2008
- ^ a b Landley, Rob (15 de marzo de 2005), Introducing initramfs, un nuevo modelo para discos RAM iniciales
- ^ a b Almesberger, Werner; Lermen, Hans (2000). "Utilizando el disco RAM inicial (initrd)" . Archivado desde el original el 2 de abril de 2015 . Consultado el 14 de marzo de 2015 .
- ^ "linux / do_mounts_initrd.c en 4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7 · torvalds / linux · GitHub" . GitHub .
- ^ a b Landley, Rob (17 de octubre de 2005). "documentos ramfs, rootfs e initramfs, tome 2" . Árbol de fuentes del kernel de Linux.
- ^ Petersen, Richard Leland (2010). Fedora 13: administración, redes, seguridad . Alameda, California: Surfing Turtle Press. pag. 76. ISBN 978-1-936280-02-5.
Dracut usa los parámetros del kernel enumerados en la línea de comandos del kernel de GRUB para configurar el sistema de archivos RAM de initramfs sobre la marcha, proporcionando más flexibilidad y reduciendo 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 .
- ^ Poderes de Shawn. "Casper, el fantasma amistoso (y persistente)" . Diario de Linux. 2012.
- ^ Kyungsik Lee (30 de mayo de 2013). "Compresión LZ4 y mejora del tiempo de arranque" (PDF) . events.linuxfoundation.org . pag. 18 . Consultado el 29 de mayo de 2015 .
- ^ Fish, Richard (6 de julio de 2005). "pivot_root de initramfs provoca una referencia circular en el árbol de montaje" . Rastreador de errores del kernel de Linux . Consultado el 28 de febrero de 2009 .
- ^ Garzik, Jeff (2 de noviembre de 2002). "combinació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.
- ^ "Descargue el formato de archivo de imágenes de Windows (WIM) desde el centro de descarga oficial de Microsoft" . Microsoft.com . Microsoft.
enlaces externos
- Comparación detallada de kits de herramientas que generan initrd
- Documentación del kernel sobre el soporte del espacio de usuario inicial
- "Motivación para cambiar de initrd a initramfs" . Archivado desde el original el 4 de enero de 2013. URL alternativa