Ramdisk inicial - Initial ramdisk

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 . initrdy initramfshaga referencia a dos métodos diferentes para lograrlo. 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 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.

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.

Otra complicación es el soporte del kernel para 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.

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. 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 ejecuta / linuxrc como su primer proceso; cuando sale, el kernel asume que el sistema de archivos raíz real ha sido montado y ejecuta / sbin / init para comenzar el proceso normal de arranque en el espacio de usuario.

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. Algunos sistemas usan el paquete dracut para crear una imagen initramfs. En el esquema initramfs, el kernel ejecuta / init como su primer proceso que no se espera que salga. 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.

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 .

Preparativos 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, incorporan 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. 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 los dispositivos de hardware, las particiones de disco y los volúmenes de almacenamiento que coinciden con ciertas reglas se conectan. 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 inicio 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 del 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 almacenada por initrd.
  • En un initramfs, el sistema de archivos raíz inicial no se puede rotar. 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, incluyen 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 .

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 y Puppy Linux pueden ejecutarse completamente desde initrd.

Similitudes en otros sistemas operativos

Desde Windows Vista, Windows puede arrancar desde un archivo de imagen de disco WIM , para el cual se publica el formato de archivo; 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

Referencias

enlaces externos