Idioma
Categoría
Buscar

Cómo crear y configurar el initrd en Slackware Linux: Guía completa

Descubre qué es initrd, para qué sirve y cómo generarlo y utilizarlo. Aprende a configurar ELILO para un nuevo kernel y a utilizar scripts como mkinitrd, geninitrd y eliloconfig

Cómo crear y configurar el initrd en Slackware Linux: Guía completa
En Terminal Por Rudi Drusian Lange
Publicado el
Última actualización

Ambiente

Este artículo es específico para usuarios de Slackware Linux, y los comandos presentados fueron probados en la versión 15 del sistema. La parte conceptual es válida para todos los sistemas Linux, sin embargo, los mecanismos adoptados para manipular el initrd están desarrollados específicamente para esta distribución. El ELILO es adoptado como cargador de arranque por defecto.

Guía Rápida

Utiliza los scripts geninitrd y eliloconfig para generar e instalar, automáticamente y de forma sencilla, el nuevo initrd y el kernel en el arranque EFI. Para obtener información detallada sobre el proceso manual y automatizado, sigue leyendo el artículo.

Introducción

Este artículo seguirá el formato propuesto por Patrick Volkerding en su tutorial titulado "Slackware initrd mini HOWTO" y responderá a las preguntas planteadas por él:

  1. ¿Qué es el initrd?
  2. ¿Por qué necesito un initrd?
  3. ¿Cómo hago para generar el initrd?
  4. Ahora que he creado un initrd, ¿cómo puedo usarlo?

¿Qué es el initrd?

El initrd es un sistema de archivos temporal cargado en la memoria RAM durante el proceso de arranque de Linux. Contiene los módulos y scripts necesarios para montar el sistema de archivos raíz real antes de que el kernel pueda asumir el control completo del sistema.

¿Por qué necesito un initrd?

El initrd es necesario cuando el kernel no tiene controladores integrados para acceder al hardware necesario para montar el sistema de archivos raíz, por ejemplo, drivers para controladores de discos (SCSI, RAID) o sistemas de archivos específicos (ext4, reiserfs, xfs).

En los kernels modernos de Linux, existe una gran variedad de opciones y configuraciones disponibles. No es práctico distribuir varios kernels diferentes para satisfacer todas las necesidades específicas, es mucho más flexible proporcionar un kernel genérico acompañado de un conjunto de módulos que pueden cargarse según sea necesario.

Es aquí donde entra en acción el initrd. Se puede generar mediante la línea de comandos para cargar los módulos específicos necesarios para el hardware y el sistema de archivos utilizados en un sistema determinado.

Dicho esto, Slackware pone a disposición una versión del kernel llamada huge que contiene suficientes controladores integrados para que, en la mayoría de los casos, no sea necesario un initrd para arrancar el sistema.

Se recomienda encarecidamente utilizar un kernel genérico, ya que esto ahorrará algo de memoria, posiblemente evitará algunas advertencias durante el arranque y mantendrá una mejor compatibilidad con los módulos del kernel.

¿Cómo hago para generar el initrd?

Probablemente, la primera vez que necesites crear un initrd será después de actualizar el kernel. En Slackware 15, cada vez que el kernel se actualice, será necesario recrear el initrd manualmente.

Afortunadamente, esta no es una tarea difícil hoy en día. Existen algunos scripts disponibles para ayudar en este proceso. Primero, se presentará una versión más manual, lo que ayudará a esclarecer lo que se está haciendo y será útil para quienes utilizan más de un kernel y no quieren que sus archivos de configuración sean sobrescritos.

Para crear el initrd, será necesario conocer la versión del nuevo kernel después de la actualización. Para encontrar esta información, ejecuta el siguiente comando:

# bash

uname -r

5.15.161

El script mkinitrd_command_generator.sh se usará para extraer las opciones del sistema necesarias, que se usarán como parámetros en el comando mkinitrd. Este comando, a su vez, se utilizará para generar el nuevo initrd.

En el siguiente comando, reemplaza 5.15.161 por la versión de tu kernel:

# bash

/usr/share/mkinitrd/mkinitrd_command_generator.sh -k 5.15.161

#
# mkinitrd_command_generator.sh revision 1.45
#
# This script will now make a recommendation about the command to use
# in case you require an initrd image to boot a kernel that does not
# have support for your storage or root filesystem built in
# (such as the Slackware 'generic' kernels').
# A suitable 'mkinitrd' command will be:

mkinitrd -c -k 5.15.161 -f ext4 -r /dev/sdb2 -m xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-asus:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch:jbd2:mbcache:crc32c_intel:crc32c_generic:ext4 -u -o /boot/initrd.gz

Copia el comando generado al final de la ejecución del script y ejecútalo para generar el initrd:

# bash

mkinitrd -c -k 5.15.161 -f ext4 -r /dev/sdb2 -m xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-asus:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch:jbd2:mbcache:crc32c_intel:crc32c_generic:ext4 -u -o /boot/initrd.gz

OK: /lib/modules/5.15.161/kernel/drivers/usb/host/xhci-hcd.ko agregado.
OK: /lib/modules/5.15.161/kernel/drivers/usb/host/xhci-pci-renesas.ko agregado.
OK: /lib/modules/5.15.161/kernel/drivers/usb/host/xhci-pci.ko agregado.
....
60343 bloques
/boot/initrd.gz creado.
Asegúrate de ejecutar lilo nuevamente si lo usas.

Tu nuevo initrd ha sido generado y está ubicado en /boot/initrd.gz.

Ahora que he creado un initrd, ¿cómo puedo usarlo?

Después de crear el initrd, necesitarás cargarlo junto con el kernel durante el arranque. Si estás usando el ELILO como cargador de arranque, copia el archivo generado a la carpeta del arranque EFI en /boot/efi/EFI/Slackware/.

Copia el nuevo kernel junto con el initrd al directorio del arranque EFI:

# bash

cp /boot/initrd.gz /boot/efi/EFI/Slackware/
cp /boot/vmlinuz-generic /boot/efi/EFI/Slackware/vmlinuz

Tu nuevo kernel e initrd ya están instalados y se cargarán correctamente en el próximo arranque.

A continuación, exploraremos más opciones y algo más de contexto, en caso de que desees entender mejor lo que estás haciendo. Sin embargo, las configuraciones necesarias para cargar el nuevo kernel e initrd con éxito ya se han completado en las instrucciones anteriores.

Un poco de contexto

Dentro del directorio de arranque EFI están los archivos responsables de la inicialización del sistema operativo. Vamos a listar algunos de ellos:

# bash

ls -lh /boot/efi/EFI/Slackware/

total 17M
-rwxr-xr-x 1 root root  160 Dec  7 11:35 elilo.conf
-rwxr-xr-x 1 root root 233K Jun 12  2018 elilo.efi
-rwxr-xr-x 1 root root 9.2M Dec  7 11:31 initrd.gz
-rwxr-xr-x 1 root root 7.5M Jun 16  2024 vmlinuz
  1. elilo.conf
    • Archivo de configuración del cargador de arranque.
  2. elilo.efi
    • Archivo de arranque leído por UEFI; es responsable de cargar el kernel y el initrd.
  3. initrd.gz
    • Módulos de hardware y del sistema de archivos necesarios para el funcionamiento adecuado antes de la inicialización del sistema.
  4. vmlinuz
    • Kernel de Linux.

La ubicación del initrd está definida en el archivo elilo.conf. Echemos un vistazo a él:

# bash

vi /boot/efi/EFI/Slackware/elilo.conf

El contenido del archivo debe ser algo como esto:

elilo.conf

chooser=simple
delay=1
timeout=1
#
image=vmlinuz
    label=Linux
    initrd=initrd.gz
    read-only
    append="root=/dev/sdb2 vga=normal ro"

En este archivo se hacen las personalizaciones del cargador de arranque, como la elección de múltiples kernels a seleccionar durante la inicialización, el tiempo de espera antes de la carga automática y otras opciones de configuración.

Más sobre cómo generar el initrd

Puedes definir opciones predeterminadas para el comando mkinitrd en el archivo de configuración /etc/mkinitrd.conf. Una versión de ejemplo de este archivo está disponible en /etc/mkinitrd.conf.sample y sirve como un buen punto de partida.

Usa man mkinitrd.conf para obtener más información sobre el archivo de configuración y man mkinitrd para detalles sobre el comando.

El script mkinitrd_command_generator.sh, cuando se usa con la opción -c, mostrará los parámetros basados en el sistema actual, que pueden ser usados en el archivo de configuración.

# bash

/usr/share/mkinitrd/mkinitrd_command_generator.sh -c

SOURCE_TREE="/boot/initrd-tree"
CLEAR_TREE="1"
OUTPUT_IMAGE="/boot/initrd.gz"
KERNEL_VERSION="5.15.161"
KEYMAP="us"
MODULE_LIST="xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-asus:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch:jbd2:mbcache:crc32c_intel:crc32c_generic:ext4"
LUKSDEV=""
ROOTDEV="/dev/sdb2"
ROOTFS="ext4"
RESUMEDEV=""
RAID=""
LVM=""
UDEV="1"
WAIT="1"

Vamos a crear el archivo de configuración mkinitrd.conf a partir del archivo de ejemplo mkinitrd.conf.sample y de los parámetros generados por el script:

vi /etc/mkinitrd.conf

/etc/mkinitrd.conf

KERNEL_VERSION="$(uname -r)"
KEYMAP="br-abnt2"
MODULE_LIST="xhci-pci:ohci-pci:ehci-pci:xhci-hcd:uhci-hcd:ehci-hcd:hid:usbhid:i2c-hid:hid_generic:hid-asus:hid-cherry:hid-logitech:hid-logitech-dj:hid-logitech-hidpp:hid-lenovo:hid-microsoft:hid_multitouch:jbd2:mbcache:crc32c_intel:crc32c_generic:ext4"
ROOTDEV="/dev/sdb2"
ROOTFS="ext4"

Explicando

Se han omitido del archivo de configuración los parámetros que ya son asumidos por defecto, como SOURCE_TREE, OUTPUT_IMAGE, UDEV y WAIT. La opción CLEAR_TREE también se omitió, ya que no se recomienda cuando se desea mantener soporte para múltiples kernels. Otras opciones, como LUKSDEV, RESUMEDEV, RAID y LVM, no aplican en este ejemplo.

 

  1. KERNEL_VERSION
    • Al usar $(uname -r), la versión del kernel actual será utilizada automáticamente, sin necesidad de escribirla en cada comando.
  2. KEYMAP
    • Define el mapa de teclado personalizado que se cargará durante la inicialización.
  3. MODULE_LIST
    • Especifica la lista de módulos que deben incluirse en el initrd.
  4. ROOTDEV
    • Define el dispositivo donde se encuentra el sistema de archivos raíz.
  5. ROOTFS
    • Especifica el tipo de sistema de archivos utilizado para la raíz del sistema.

Las configuraciones de los parámetros MODULE_LIST, ROOTDEV y ROOTFS se tomaron de la salida generada por el comando mkinitrd_command_generator.sh -c.

Con estas pocas líneas en el archivo de configuración, ya es posible replicar el comando completo generado por el script utilizando solo mkinitrd -F. La opción -F indica al comando que utilice el contenido del archivo de configuración como parámetros.

Con estas configuraciones, a menos que haya un cambio de hardware que impacte los módulos que deben cargarse, será posible actualizar el initrd después de una actualización del kernel utilizando los siguientes comandos:

# bash

mkinitrd -F
cp /boot/initrd.gz /boot/efi/EFI/Slackware/
cp /boot/vmlinuz-generic /boot/efi/EFI/Slackware/vmlinuz

Usando los scripts automatizados de Slackware

El proceso es mucho más fácil al usar las opciones predeterminadas disponibles en Slackware para crear el initrd y copiar el nuevo kernel a la carpeta de arranque EFI.

Entonces, ¿por qué tanta información si todo esto se podría resolver rápidamente?

Muchas personas optan por Slackware porque ofrece control total sobre cada etapa de la configuración, lo que es especialmente útil cuando necesitas realizar personalizaciones fuera del alcance de los scripts automatizados.

Si este no es tu caso, tu vida será más sencilla. Después de actualizar el kernel, solo necesitas ejecutar:

# bash

geninitrd

geninitrd

La imagen anterior se mostrará y, al finalizar, cuando el prompt de comandos sea liberado, el nuevo initrd.gz estará disponible en /boot.

Para copiar el initrd y el kernel recién actualizado a la carpeta de arranque EFI, ejecuta el comando eliloconfig y sigue las instrucciones hasta completar el script:

# bash

eliloconfig

Selecciona install

eliloconfig-01 

Selecciona install nuevamente. Usa skip solo si estás usando hardware de Apple ↓
 

eliloconfig-02 

Elimina la entrada de arranque anterior. Selecciona Yes

eliloconfig-03 

Proceso completado con éxito. OK

eliloconfig-04 

Con ambos scripts, geninitrd y eliloconfig, tu sistema estará listo para usar el nuevo kernel y el nuevo initrd, ambos generados e instalados en el sector de arranque.

Conclusión

En este artículo, aprendimos cómo crear y utilizar el initrd en Slackware, desde la generación manual hasta el uso de scripts automatizados para facilitar el proceso. Con las configuraciones y procedimientos detallados, es posible garantizar que el nuevo kernel e initrd sean correctamente configurados y cargados durante la inicialización. Aunque Slackware ofrece métodos automáticos, la flexibilidad del sistema permite personalizaciones, garantizando control total al usuario para ajustes específicos según sus necesidades.

Referencias

Algunas de las fuentes utilizadas en la elaboración de este artículo:

Este no es mi idioma original y no lo hablo muy bien. Utilicé mis pocos conocimientos y herramientas de traducción para redactar el texto de este artículo. Disculpe los posibles errores ortográficos o gramaticales, se agradecen sugerencias de correcciones y se pueden enviar al correo electrónico de contacto que se encuentra en el pie de página del sitio. Mi intención es compartir algunos conocimientos y espero que esta traducción sea lo suficientemente buena.


Algunos de los contenidos de este sitio web, incluidos textos, imágenes, gráficos y otros materiales, pueden ser generados o mejorados mediante herramientas de inteligencia artificial (IA). Para obtener más detalles sobre nuestro uso de IA, consulte nuestro Término de uso.