Initramfs/Guide

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Initramfs/Guide and the translation is 100% complete.

Other languages:
English • ‎español • ‎français • ‎italiano • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어


Muchos sistemas necesitan un sistema initramfs para arrancar correctamente. En esta guía se cubre el concepto de initramfs y de cómo crear y gestionar adecuadamente instancias initramfs.

Conceptos relacionados con initramfs

Introducción

Para la mayoría de los usuarios un sistema initramfs no es ninguna preocupación. Sus sistemas utilizan un esquema simple de particionamiento sin controladores o configuraciones exótica (como sistemas de ficheros cifrados) de modo que el núcleo Linux es perfectamente capaz de tomar el control del binario init en sus sistemas. Pero para otros usuarios es obligatorio el uso de un initramfs.

El concepto clave para comprender lo que es (o para qué se necesita) un initramfs es conocer cómo se realiza el proceso de arranque de Linux incluso desde un alto nivel.

El proceso de arranque de Linux

Una vez el núcleo Linux tiene control del sistema (lo cual sucede una vez lo ha cargado el gestor de arranque) prepara las estructuras de memoria y los controladores. Es entonces cuando le pasa el control a una aplicación (normalmente init) cuya tarea es preparar el sistema y asegurarse de que, al final de proceso de arranque, todos los servicios necesarios están corriendo y el usuario puede entrar en el sistema. La aplicación init lo hace lanzando, entre otros servicios, el demonio udev que más adelante cargará y preparará el sistema basado en los dipositivos detectados. Cuando se lanza udev los sistemas de archivos restantes que no se han montado, se montan y el resto de los servicios se arrancan.

Para los sistemas en los que todos los ficheros y herramientas necesarios residen en el mismo sistema de archivos, la aplicación init puede perfectamente controlar el proceso de inicio subsiguiente. Sin embargo cuando se definen múltiples sistemas de archivos (o se realizan instalaciones más exóticas), esto podría ser un poco más truculento:

  • Cuando la partición /usr está en un sistema de archivos separado, las herramientas y controladores que tienen ficheros almacenados en /usr no se pueden utilizar a menos que /usr esté disponible. Si estas herramientas son necesarias para hacer que /usr esté disponible entonces no podremos arrancar el sistema.
  • Si el sistema de archivos raíz está cifrado, entonces el núcleo Linux no podrá encontrar la aplicación init resultando un sistema que no arranca.

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

El disco raíz de inicio

El initrd es una estructura de disco en memoria (disco ram) que contiene las herramientas y guiones necesarios para montar los sistemas de archivos que se necesiten antes de pasar el control a la aplicación init en el sistema de archivos raíz. El núcleo Linux lanza el guión de configuración (normalmente se llama linuxrc, sin embargo este nombre no es obligatorio) en este sistema de disco raíz, el cual prepara el sistema, cambia al sistema de archivos real y a continuación llama a init.

Aunque el método initrd es todo lo que se necesita, tiene algunos inconvenientes:

  • Es un dispositivo de bloque de pleno derecho por lo que requiere la sobrecarga de un sistema de archivos completo, tiene un tamaño fijo. Si se elige un initrd demasiado pequeño puede que todos los guiones necesarios no entren. Si se crea demasiado grande, se estará desperdiciando memoria.
  • Debido a que es un dispositivo estático real, consume memoria caché dentro del núcleo Linux y por tanto es sensible a los métodos en uso de gestión de memoria y ficheros (como la paginación), esto hace que initrd consuma bastante memoria.

Para resolver estos (para algunos puede que no sean) problemas, se creó el initramfs.

El sistema de archivos ram de inicio

Un initramfs es un sistema de archivos ram de inicio basado en tmpfs (un sistema de ficheros de tamaño flexible y ligero que se carga en memoria) que no utiliza un dispositivo de bloque aparte (por lo que no se realiza ningún tipo de almacenamiento en caché y por tanto desaparece toda la carga mencionada anteriormente). Al igual que el initrd, contiene las herramientas y guiones necesarios para montar el sistema de archivos antes de que se lance el binario init en el sistema de archivos raíz real. Estas herramientas pueden ser capas de abstracción de descifrado (para sisema de archivos cifrados), gestores de volúmenes lógicos, software raid, cargadores de sistemas de ficheros basados en controladores bluetooth, etc.

El contenido del sistema de archivos initramfs se obtiene creadno un fichero cpio. cpio es una solución antigua (pero probada) para archivar ficheros (y a los ficheros resultantes se les llama ficheros cpio). cpio es definitivamente comparable al archivador tar. La elección aquí de cpio ha sido porque era más sencilla de implementar (desde el punto de vista del código) y soportado (anterior) por dispositivos de fichero que tar no soporta.

Todos los ficheros, herramientas, bibliotecas, ajustes de configuración (si son aplicables), etc se ponen dentro del archivo cpio. Este archivo entonces se comprime mediante la utilidad gzip y almacenado junto con el núcleo Linux. El cargador de arranque entonces se lo ofrecerá al núcleo Linux en el momento del inicio de modo que el núcleo sepa que se necesita un initramfs.

Una vez detectado, el núcleo Linux creará un sistema de ficheros tmpfs, extraerá el contenido del archivo en él y a continuación lanzará el guión init localizado en el raíz del sistema de ficheros tmpfs. Este guión entonces montará el sistema de ficheros raíz real (después de asegurarse de que lo puede montar, cargado, por ejemplo, módulos adicionales, preparando una capa de abstracción de cifrado, etc.) así como otros sistemas de ficheros vitales (como /usr y /var ).

Una vez se han montado el sistema de ficheros raíz y el resto de sistemas de fichero vitales, el guión de inicio init del sistema de ficheros initramfs cambiará el raíz al sistema de ficheros raíz real y finalmente llamará al binario /sbin/init en ese sistema para continuar el proceso de arranque.

Crear un initramfs

Introducción y configuración del cargador de arranque

A la hora de crear un sistema de ficheros initramfs, es importante saber qué controladores adicionales, guiones y herramientas se necesitarán para arrancar el sistema. Por ejemplo, si se utiliza LVM, entonces se necesitarán las herramientas de LVM dentro del initramfs. De igual modo, si se utiliza software RAID, se necesitarán las utilidades mdadm, etc.

Existen algunas herramientas que ayudan a los usuarios a crear un sistema de ficheros initramfs (archivos comprimidos cpio) para su sistema. Sin embargo, para aquéllos que quieran control total pueden igualmente crear un sistema de imágenes initramfs personalizado.

Una vez creado se necesitará ajustar la configuración del cargador de arranque para informar que se va a utilizar un initramfs. Por ejemplo, si el fichero initramfs se almacena como /boot/initramfs-3.2.2-gentoo-r5, entonces la configuración en /boot/grub/grub.conf podría parecerse a la siguiente:

ARCHIVO grub.confEntrada 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

Se puede utilizar la herramienta de construcción del núcleo de Gentoo genkernel para generar un initramfs, incluso si no se utilizó genkernel para configurar y construir el núcleo.

Se recomienda incluir en el núcleo (no como módulos) todos los controladores y código necesarios para montar los sistemas de ficheros / y /usr cuando se utilice genkernel para generar un initramfs. A continuación llamar a genkernel como sigue:

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

Dependiendo del sistema, se necesitarán una o más de las siguientes opciones:

Opción Descripción
--disklabel Añade soporte para ajustes LABEL= en /etc/fstab
--dmraid Añade soporte para RAID por hardware ficticio.
--firmware Añade código del firmware que se encuentra en el sistema.
--gpg Añade soporte para GnuPG.
--iscsi Añade soporte para iSCSI.
--luks Añade soporte para contenedores cifrados LUKS.
--lvm Añade soporte para LVM.
--mdadm Añade soporte para RAID por software.
--multipath Añade soporte para acceso de E/S múltiple hacia un SAN.
--zfs Añade soporte para ZFS.

Cuando se termine, el fichero initramfs se almacenará en /boot.

Usar dracut

La utilidad dracut se creó con el único propósito de gestionar ficheros initramfs. Diseñada con un enfoque altamente modular en lo que se refiere a qué soporte se incluye y cual no.

Es recomendabe definir (o no definir) los módulos necesaris. Después de configurar la variable DRACUT_MODULES en /etc/portage/make.conf, hacer emerge dracut para instalar la utilidad Dracut.

El siguiente paso es configurar dracut editando el fichero /etc/dracut.conf. En el fichero de configuración, el cual está muy bien comentado, se puede añadir el soporte para los módulos necesarios.

Una vez configurado, crear un initramfs llamando a dracut como sigue:

root #dracut

La imagen resultante soporta arranques de sistemas genéricos basados en la configuración almacenada en /etc/dracut.conf. También es posible generar un initramfs confeccionado específicamente para su sistema (para el cual dracut intentará detectar las herramientas y los controladores necesarios, etc. a partir del sistema actual). Si los módulos y controladores se construyen dentro del núcleo (no como módulos separados y referencias al firmware), entonces se puede añadir la opción --no-kernel:

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

Para más información, echar un vistazo a las páginas del manual de dracut y dracut.cmdline:

user $man dracut
user $man dracut.cmdline

Ver también

  • Initramfs en el wiki oficial de Gentoo.
  • Dracut en el wiki oficial de Gentoo.

Recursos externos