Initrd
# Initrd

El disco RAM inicial o initrd (de initial ramdisk), por sus siglas en inglés es un sistema de ficheros temporal usado por el núcleo Linux durante el inicio del sistema.

Es usado típicamente para hacer los arreglos necesarios antes de que el sistema de ficheros raíz pueda ser montado.

## Explicación

El sistema operativo GNU/Linux, al igual que otros sistemas Unix, consiste en un núcleo, Linux, que es cargado inicialmente en memoria, y que permanece de manera residente durante el funcionamiento del sistema, así como aplicaciones — software que se ejecuta en el espacio de usuario, bajo el control del núcleo.

Para minimizar la cantidad de código que se carga en memoria, y para una modularidad máxima, el núcleo Linux omite mucho código necesario para cargar el sistema operativo. Parte de este código se encuentra en módulos del núcleo, mientras que el resto son aplicaciones en el espacio de usuario.

Para realizar un sistema de arranque que pueda servir para hardware variado, o que pueda ser cargado a partir de distintos medios incluyendo medios virtuales y transitorios como los provistos por una conexión de red, suele ser necesario para el núcleo acceder al espacio de usuario y quizás a módulos del núcleo de manera que pueda obtener los datos y rutinas necesarias para acceder al almacén de datos principal. No tiene por qué ocurrir con todas las posibles configuraciones, aunque suele darse el caso.

El sistema de arranque initrd ha sido la principal solución a este problema desde hace mucho tiempo Archivado el 13 de enero de 2008 en Wayback Machine., aunque el recientemente desarrollado initramfs introducido en el núcleo Linux 2.6 contiene importantes mejoras.

En el sistema initrd, los ficheros que necesitan ser accedidos por el núcleo durante el arranque se almacenan en un disco RAM, cuyos contenidos se encuentran en un sistema de ficheros sobre un archivo montado como un dispositivo de bucle, o más históricamente, en un pequeño dispositivo montable como un disquette, y ocupa generalmente entre 1,4 MB y 4 MB. El sistema de ficheros está comprimido con gzip. La localización de la imagen de este disco RAM se da al núcleo en la carga por el cargador de arranque (generalmente o LILO o GRUB).

El sistema initrd emplea ciertos "trucos" y tiene algunos inconvenientes, desde el punto de vista de un administrador. Crear o editar una imagen de un sistema de ficheros de un disco RAM requiere privilegios de administrador para montar la imagen del sistema de ficheros para realizar cambios, y/o para inicializar la estructura del sistema de ficheros (dar formato) en el dispositivo virtual. Además, el sistema de ficheros utilizado en la imagen del disco RAM debe ser uno que no vaya a utilizarse en el núcleo, y el código para acceder al sistema de ficheros debe estar programado en el núcleo, lo que implica que no puede ser descargado más adelante de la misma manera que se puede hacer cuando el código es cargado a partir de módulos del núcleo.

Los discos RAM son de tamaño fijo, por lo que suelen utilizar más espacio del necesario, y también limitan la cantidad de espacio de trabajo disponible una vez que el sistema está arrancado. De hecho el enfoque de initrd no permite descargar nada de la memoria utilizada por éste sin reiniciar.

Sin embargo, pese a estos problemas, dado que desde hace años el sistema se ha venido utilizando casi de forma universal, aún tiene un amplio uso.

## Initramfs en comparación con initrd

En comparación, initramfs es un sistema más conveniente y simple para gestionar por los administradores que los sistemas previos basados en discos RAM, ya que el código externo alojado en el disco RAM inicial puede ser editado fácilmente sin privilegios de administrador, y ya que hay una menor indirección: no hay necesidad de hacer un disco virtual, formatearlo y proveer al núcleo con capacidad para manejar sistemas de archivos más allá de los requisitos mínimos para leer un archivo cpio comprimido.

Desde que el sistema original basado en discos RAM se popularizó, un nuevo sistema de ficheros basado en memoria RAM más flexible, conocido como tmpfs o shmfs, se ha convertido en un componente estándar del núcleo. Este sistema es mucho más flexible y eficiente que el disco RAM de tamaño fijo original en muchos aspectos: no requiere formateo, y utiliza tanta memoria como se necesite para contener los datos.

También se usaba otro sistema similar, ramfs, que da al sistema initramfs su nombre. Actualmente los usuarios pueden elegir qué sistema de ficheros dinámico en RAM utilizar.

Además del código para tmpfs, que se utiliza en el núcleo para casi todas las configuraciones de Linux, el único requisito para hacer un disco virtual desde el que arrancar era añadir la posibilidad de descomprimir un paquete de archivos (los desarrolladores del núcleo escogieron utilizar el formato de archivo cpio). Los archivos descomprimidos se almacenan en un sistema de ficheros parecido a tmpfs. Este sistema se conoce como initramfs.

## Usos

Así como para cargar el código necesario para preparar el arranque del sistema, un disco RAM (ya sea initrd o initramfs) puede ser útil como disco de rescate, para utilizar en actualizaciones de seguridad, copias de seguridad de archivos, realizar análisis forenses, depurar problemas de hardware, u obviar un disco duro, por ejemplo para arrancar imágenes del sistema operativo por red o desde un medio lento como un CD-ROM.

Muchas distribuciones Linux llevan una única imagen genérica del núcleo destinada a arrancar en la mayor variedad posible de hardware. Los controladores incluidos con esta imagen genérica del núcleo deben ser modulares, ya que no es posible compilar todo de forma estática en el núcleo sin hacerlo demasiado grande para arrancar en ordenadores con poca memoria o desde medios de baja capacidad como disquetes.

Esto a su vez conlleva el problema de detectar y cargar los módulos necesarios para montar el sistema de ficheros raíz en el arranque (o deducir qué sistema de ficheros es o dónde se encuentra).

Para complicar aún más las cosas, el sistema de ficheros raíz puede estar en un volumen RAID por software, LVM, un sistema de ficheros por red de algún tipo (NFS es común en ordenadores sin discos) o en una partición cifrada. Todos ellos requieren preparaciones especiales para montar.

## Implementación

La imagen del núcleo y la del initrd, deben ser guardadas en algún lugar accesible por el firmware de arranque del ordenador o el software de arranque, como por ejemplo Grub. En PC, esto es generalmente:

* El sistema de ficheros raíz en sí.
* Una pequeña partición formateada como FAT o ext2 en el disco local (una partición de arranque).
* Un servidor TFTP (en sistemas que puedan arrancar desde Ethernet).

El cargador de arranque cargará en memoria el núcleo y la imagen initrd, y luego ejecutará el núcleo, pasando la dirección de memoria del initrd. Al final de su secuencia de arranque, el núcleo intenta determinar el formato de la imagen de sus primeros bloques de datos:

* Esquema ramfs: Si la imagen es una imagen de un sistema de ficheros (opcionalmente comprimida con gzip), entonces se hará disponible como un dispositivo de bloque especial (/dev/ram), que se montará como el sistema de ficheros raíz inicial. El controlador para ese sistema de ficheros debe ser compilado estáticamente en el núcleo. Muchas distribuciones usaban originalmente sistemas de ficheros ext2 comprimidos como imágenes initrd. Otras (incluyendo Debian 3.1), usaban cramfs para arrancar en sistemas con memoria limitada, ya que la imagen cramfs puede ser montada sin requerir espacio adicional para descompresión.

    Una vez que este sistema de ficheros raíz está iniciado, el núcleo ejecuta "/linuxrc" como su primer proceso. Cuando termina, el núcleo asume que el sistema de ficheros real ha sido montado en el mismo lugar y ejecuta "/sbin/init" para comenzar el proceso de arranque normal en "espacio del usuario".
* Esquema initramfs: Si la imagen es un archivo cpio comprimido con gzip, será desempaquetada por el núcleo en un paso intermedio a un tmpfs, que después se convierte en el sistema de ficheros raíz inicial. A este esquema se le llamó initramfs y está disponible desde Linux 2.6.13 en adelante. Tiene la ventaja de no requerir que un sistema de ficheros intermedios sea compilado en el núcleo. 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 sólo lectura.

    Con initramfs, el núcleo ejecuta "/init" como su primer proceso. "/init" no se espera que termine.

Dependiendo de los algoritmos que se hayan compilado estáticamente en él, el núcleo puede descomprimir imágenes initrd/initramfs comprimidas con gzip, bzip2, LZMA, XZ, LZO, LZ4 y zstd.

Algunas distribuciones de GNU/Linux, generan un initrd personalizado que consiste sólo en las partes necesarias para arrancar esa computadora en particular, como módulos del núcleo para ATA, SCSI y sistemas de archivos. Estos típicamente incluyen la ubicación y el tipo del sistema de ficheros raíz.

Otras, como Fedora y Ubuntu, crean un initrd mas genérico. Estas comienzan sólo con el nombre del dispositivo del sistema de ficheros raíz (o su UUID) y deben descubrir todo lo demás en el momento del arranque. En este caso, una compleja sucesión de tareas debe realizarse para lograr montar el sistema de ficheros raíz:

* Cualquier controlador del que dependa el proceso de arranque debe ser cargado. Una solución común es empaquetar los módulos del núcleo para los dispositivos de almacenamiento comunes en el initrd y luego invocar el agente de hotplug para cargar los módulos adecuados para el hardware del ordenador detectado.
* Si el sistema de ficheros raíz está en NFS:
   * Iniciar la interfaz de red primaria.
   * Invocar un cliente DHCP, con el que pueda obtener una dirección.
   * Extraer la dirección del servidor NFS de la respuesta DHCP.
   * Montar el directorio compartido.
* Si el sistema de ficheros raíz está en un dispositivo RAID por software, "/linuxrc" no tiene forma de saber en qué dispositivo del volumen RAID está, y debe invocar las utilidades estándar MD para buscar todos los dispositivos de bloque disponibles e iniciar el correcto.
* Si el sistema de ficheros raíz está en un volumen lógico, "/linuxrc" debe invocar las utilidades LVM para buscar y activar el grupo de volúmenes que lo contiene.
* Si el sistema de ficheros raíz esta en un dispositivo de bloques cifrado, "/linuxrc" debe:
   * Invocar el script ayudante para consultar al usuario sobre la clave y/o insertar el hardware requerido, como una Smart Card o un dongle USB.
   * Crear un destino de descifrado con el mapeador de dispositivos.
* Ejecutar cualquier tarea de mantenimiento que no pueda ser hecha de forma segura en un sistema de ficheros ya montado como raíz.
* Montar el sistema de ficheros en modo sólo lectura.

El sistema de ficheros raíz final no puede montarse sobre "/", ya que eso dejaría los scripts y las herramientas en el sistema de archivo raíz inicial inaccesible para cualquier tarea de limpieza final. En su lugar es montado en un punto de montaje temporal y cambiado a su lugar con pivot_root(2) (que fue introducido específicamente para este propósito). Esto deja el sistema raíz inicial en un punto de montaje (como "/initrd") donde los scripts de inicio normal pueden posteriormente desmontarlo para liberar memoria ocupada por el initrd.

La mayoría de los sistemas de ficheros raíz implementan "/linuxrc" o "/init" como un script de shell y por lo tanto incluyen un shell mínimo (usualmente /bin/bash) junto con otras utilidades esenciales (usualmente Busybox). Para ahorrar un poco más de espacio, la shell, las utilidades y sus bibliotecas necesarias usualmente son compiladas con optimizaciones de espacio habilitadas (como por ejemplo la opción de gcc -Os) y enlazadas contra versiones reducidas de la biblioteca de C como dietlibc o klibc.

Algunas distribuciones (notablemente SUSE y Ubuntu) además usan el initrd para mostrar una imagen gráfica durante el proceso de arranque.

