Guía Gentoo Linux de Sistemas de Archivos Iniciales en RAM
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
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logotipo y nombre de Gentoo.
|