Gentoo Logo

Guía Gentoo Linux de Sistemas de Archivos Iniciales en RAM

Contenido:

1.  Conceptos de los initramfs

Introducción

Para muchos usuarios un sistema initramfs no es asunto de preocupación. Sus sistemas usan esquemas sencillos de particiones de disco, sin manejadores o configuraciones exóticas (tales como sistemas de archivo encriptados), de manera que el núcleo Linux kernel bien puede entregar el control al binario init de su sistema. Sin embargo, para muchos sistemas, un initramfs es prácticamente obligatorio.

El concepto clave para entender lo que es un initramfs (o para qué sirve) sería comprender como funciona el proceso de arranque de Linux, aún aproximándolo a un alto nivel.

El proceso de arranque de Linux

Una vez que el núcleo Linux obtiene control sobre el sistema (lo cual ocurre luego de ser cargado por el gestor de arranque), prepara las estructuras de memoria y los manejadores de la mejor forma que puede. Luego entrega el control a otra aplicación (usualmente init), cuya tarea es continuar la adecuación del sistema y asegurarse que al concluir el proceso de arranque todos los servicios necesarios estan disponibles y que el usuario puede ingresar. La aplicación init hace esto iniciando, entre otros servicios, el demonio udev que a su vez también cargará y preparará el sistema en base a los dispositivos detectados. Al iniciar udev, todos los sistemas de archivos que quedan y deben ser montados, se montan, y los servicios faltantes se inician.

Para sistemas donde todos los archivos y herramientas necesarias residen en el mismo sistema de archivos, la aplicación init puede controlar perfectamente el resto del proceso de arranque. Sin embargo, cuando se han definido múltiples sistemas de archivos (o necesitamos configuraciones más exóticas), esto podría ser un poco más difícil:

  • Cuando la partición /usr está en un sistema de archivos separado, las herramientas y manejadores con archivos almacenados en /usr no pueden usarse a no ser que /usr esté disponible. Si esas herramientas se necesitan para que /usr sea disponible, entonces el sistema no podrá arrancar.
  • Si el sistema de archivos raíz está encriptado, entonces el núcleo Linux no podrá encontrar la aplicación init, lo cual resultará en un sistema que no iniciará.

La solución a este problema ha sido desde hace tiempo utilizar un initrd (dispositivo de raíz inicial).

El dispositivo de raíz inicial

Un initrd es una estructura de disco en memoria (ramdisk) que contiene las herramientas y guiones necesarios para montar los sistemas de archivos necesitados antes de pasar el control a la aplicación init en el sistema de archivos raíz. El núcleo Linux ejecuta el guión de configuración (usualmente, pero no obligatoriamente llamado linuxrc) en este disco raíz, que prepara al sistema, cambia al verdadero sistema de archivos raíz y luego llama a init.

Aunque el método initrd es todo lo que se requiere, tiene algunas desventajas:

  • Es un dispositivo de bloque de pleno derecho que requiere la carga de llevar un sistema de archivos completo con un estado fijo. Si elige un initrd muy pequeño, no podremos incluir todos los guiones necesarios y si lo hacemos muy grande estamos desperdiciando memoria.
  • Como es un dispositivo verdadero, también consume memoria caché en el núcleo Linux y es propenso a los métodos de manejo de memoria y archivos en uso (como paginación), empeorando la situación con respecto al consumo de memoria.

El initramfs se creó para resolver estos (para algunos) problemas.

El sistema de archivos inicial en ram

Un initramfs es un sistema de archivos inicial basado en tmpfs (un sistema de archivos en memoria liviano y flexible en cuanto a tamaño), que requiere dispositivos de bloque separados (de manera que no requiere caché y la carga mencionada antes desaparece). Tal como el initrd, contiene las herramientas y los guiones necesarios para montar los sistemas de archivos antes de llamar el binario init en el verdadero sistema de archivos raíz. Estas herramientas pueden ser capas de abstracción para desencriptación (para los sistemas de archivo encriptados), manejadores de volúmenes lógicos, raid en software, cargadores de sistemas de archivo basados en manejadores bluetooth, etc.

El contenido del initramfs se realiza creando un archivo. cpio es una antigua (pero de uso probado) solución de archivos (sus archivos son conocidos como archivos cpio). Son definitivamente comparados con tar. La elección de cpio en este caso es porque era más fácil de implementar (en términos de código) y soporta (aún en épocas antiguas) los archivos de dispositivos (lo cual tar no puede hacer).

Todos los archivos, herramientas, librerías configuraciones (si aplican), etc. se colocan en el archivo cpio. Este archivo se comprime con la herramienta gzip y se almacena junto al núcleo Linux. El gestor de arranque se lo ofrecerá al núcleo en el momento de arrancar de modo que el núcleo sabrá que se requiere un initramfs.

Una vez detectado, el núcleo Linux creará un sistema de archivos tmpfs, allí extraerá el contenido del archivo e iniciará el guión init en la raíz del sistema de archivos tmpfs. Este guión luego montará el verdadero sistema de archivos raíz (despúes de asegurar que lo puede montar, por ejemplo, cargando módulos adicionales, preparando una capa de abstracción para manejar encriptación, etc.) al igual que otros sistemas de archivos vitales (como /usr y /var).

Una vez que el sistema de archivos raíz y otros sistemas de archivos vitales están montados, el guión init del initramfs cambiará la raíz al verdadero sistema de archivos raíz y finalmente llamar a /sbin/init en ese sistema para continuar con el proceso de arranque.

2.  Crear un initramfs

Introducción y configuración del gestor de arranque

Para crear un initramfs, es importante saber qué manejadores, guiones y herramientas adicionales se requieren para arrancar el sistema. Por ejemplo, si usa LVM, entonces deberá soportar las herramientas LVM en el initramfs. De igual manera, si usa RAID en software, hará falta mdadm, etc.

Algunas herramientas ayudan a crear initramfs (archivos cpio comprimidos) para el sistema. Para los que quieren un control total, se puede crear fácilmente initramfs propios también.

Una vez creados, debemos ajustar la configuración del gestor de arranque para que sepa que se usará un initramfs. Por ejemplo, si el archivo del initramfs file está almacenado como /boot/initramfs-3.2.2-gentoo-r5, entonces la configuración en /boot/grub/grub.conf sería:

Listado de Código 2.1: Ejemplo en grub.conf para arrancar con un initramfs

title Gentoo Linux 3.2.2-r5
root (hd0,0)
kernel /boot/kernel-3.2.2-gentoo-r5
initrd /boot/initramfs-3.2.2-gentoo-r5

Usar genkernel

genkernel, la herramienta de Gentoo para construir núcleos, puede ser utilizada para generar un initramfs, aunque no haya usado genkernel para configurar o construir el núcleo.

Para usar genkernel para generar un initramfs, se recomienda incluir todos los manejadores y código necesario para montar los sistemas de archivos / y /usr al construir el núcleo (no como módulos). Luego, llamar a genkernel de la siguiente manera:

Listado de Código 2.2: Ejecutar genkernel para crear un initramfs

# genkernel --install --no-ramdisk-modules initramfs

Dependiendo del sistema, tal vez quiera agregar una o más de las siguientes opciones:

Opción Descripción
--disklabel Agrega soporte para configurar con LABEL= en el /etc/fstab
--dmraid Agrega soporte para RAID falso en hardware
--firmware Agregar código firmware para el sistema
--gpg Agregar soporte para GnuPG
--iscsi Agregar soporte para iSCSI
--luks Agregar soporte para contenedores de encriptación luks
--lvm Agregar soporte para LVM
--mdadm Agregar soporte para RAID en software
--multipath Agregar soporte para acceso E/S múltiple a un SAN
--zfs Agregar soporte para ZFS

Al terminar, el initramfs resultante estará almacenado en /boot.

Usando dracut

Aviso: En el momento de escribir esta guía, dracut todavía no está marcado como estable, de manera que tal vez tenga que desenmascarlo antes de continuar.

La herramienta dracut se creó con el único propósito de manejar archivos initramfs. Utiliza un enfoque altamente modular acerca de la inclusión o no del soporte deseado.

Al instalar dracut, asegúrese de incluir soporte para los DRACUT_MODULES adecuados. Esta es una variable de entorno configurable en /etc/portage/make.conf para incluir soporte para configuraciones específicas:

Listado de Código 2.3: Prepación para instalar dracut

DRACUT_MODULES="dmraid lvm syslog -biosdevname -btrfs -caps -crypt -crypt-gpg
-dmsquash-live -gensplash -iscsi -livenet -mdraid -multipath -nbd -nfs -plymouth
-ssh-client"

Es aconsejable activar (o desactivar) los módulos que necesite (y no necesite). Luego, haga emerge dracut para instalar la herramienta en el sistema.

El siguiente paso es configurar dracut modificando /etc/dracut.conf. En el archivo de configuración, por cierto bien comentado, podemos agregar soporte para módulos específicos en caso de necesidad.

Una vez preparada la configuración, podemos crear un initramfs ejecutando dracut así:

Listado de Código 2.4: Ejecutar dracut para generar un initramfs

# dracut

La imagen resultante soporta arranque de sistemas genéricos basados en la configuración en /etc/dracut.conf. También podemos optar por generar un initramfs específicamente configurado para el sistema (en el cual dracut intenta detectar las herramientas, manejadores, etc. del sistema actual). Si conoce el soporte necesario (código y manejadores) que forma parte del núcleo (no como módulos), entonces puede agregar la opción --no-kernel:

Listado de Código 2.5: Permitir que dracut genere un initramfs específico

# dracut --host-only --no-kernel

Para más información, revise las páginas man dracut y dracut.cmdline.

3.  Recursos adicionales

Específicos de Gentoo

  • Initramfs (en inglés) en Gentoo-wiki.com
  • Initramfs (en inglés) en el wiki oficial de Gentoo
  • Dracut (en inglés) en el wiki oficial de Gentoo

Recursos generales



Imprimir

Página actualizada 24 de julio, 2012

Sumario: Cada vez más sistemas requieren de un sistema de archivos iniciales en RAM o initramfs para iniciar correctamente. En esta guía, tratamos de entender los conceptos de los initramfs al igual que como crearlos correctamente y manejar sus instancias.

Sven Vermeulen
Autor

John Christian Stoddart
Traductor

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.