El sistema Linux que viene en el CD/DVD de la distribución Slackware tiene la capacidad (como muchos otros Sistemas Operativos) de poder instalarse en computadoras de diferentes características, ya sea tanto en mi laptop como en la de escritorio de mi vecino, en computadoras Intel como en AMD, en tarjetas madre marca patito como ASUS, etc. Es decir se tienen que cubrir y dar soporte a la mayor cantidad del hardware posible para que el sistema sea instalado exitosamente prácticamente en cualquier computadora (PC) sin importar su marca o fabricante.
No estoy hablando de diferencias entre arquitecturas como x86, x86_64, ARM, etc., esa es otra historia; estoy hablando de las diferencias entre computadoras de la misma arquitectura, por ejemplo de x86 o 32 bits, por el simple hecho de que ser fabricadas por diferentes compañias.
Con la finalidad de reconocer la mayor cantidad de hardware posible, Slackware proporciona un kernel que contiene una gran cantidad de módulos (entiéndase drivers o controladores), el kernel se llama huge y si tiene soporte para múltiples núcleos o procesadores será hugesmp. Durante la instalación de Slackware con CD/DVD, al principio se pide elegir el kernel para bootear y por omisión muestra el hugesmp, muchos de nosotros lo usamos y simplemente presionamos ENTER. Al proceder con la instalación de esta manera este kernel también es instalado y configurado para ser usado por el sistema día a día.
Hasta aquí todo bien, pero ¿Qué pasa con todos esos módulos que se cargaron durante la instalación? Efectivamente, TODOS siguen siendo cargados cada vez que iniciamos el sistema, incluso aunque no los necesitemos.
Para esta situación hay una solución muy simple: usar un kernel genérico y cargar exactamente los módulos que necesitemos para nuestro hardware. Esto se reflejará reduciendo ligeramente el uso de memoria RAM y un inicio más limpio y rápido.
A continuación muestro como es que logré cambiar exitosamente mi kernel a uno genérico. Para hacerlo yo realicé los siguientes pasos.
Un poco de teoría
Primero sería bueno leer la parte acerca de initrd la Wiki de AlienBob para saber por lo menos de que se trata lo que estamos haciendo, si ya lo sabes entonces bien vendría recordar un poco. El enlace es el siguiente: AlienWiki, también el archivo README.initrd que viene en el CD/DVD de instalación de Slackware.
Lo que dice Patrick Volkerding es mas o menos lo siguiente:
1. ¿Qué es initrd?
Initrd viene de «initial ramdisk». Un disco RAM inicial es un pequeño sistema de archivos de Linux que es cargado en la memoria RAM y montado cuando el kernel arranca, antes de que el sistema de archivos principal sea montado.
2. ¿Por qué necesito un initrd?
La razón para usar un initrd es usualmente por que es necesario cargar módulos del kernel antes de montar la partición raíz (root). Usualmente esos módulos se requieren para soportar el sistema de archivos usado por la partición raíz (ext3, reiserfs, xfs), o el controlador al que el disco duro está ligado (SCSI, RAID, etc.). Esencialmete hay tantas opciones diferentes disponibles en los kernels modernos de Linux, que no resulta práctico intentar hacer muchos kernels para cubrir las necesidades de cada uno. Es mucho más flexible armar un kernel genérico y configurar módulos para él.
3. ¿Cómo creo el initrd?
La forma más fácil de hacer el initrd es usar el script mkinitrd incluido en el paquete del mismo nombre. A continuación vamos a seguir paso a paso el proceso de actualización al kernel genérico de Linux 3.2.29 usando los paquetes encontrados en el directorio slackware/a/ de Slackware.
Primero, hay que asegurarse de que el kernel, los módulos del kernel y el paquete mkinitrd están instalados (los números de la versión actual pueden ser diferentes, así que este solo es un ejemplo):
installpkg kernel-generic-3.2.29-i686-1.tgz
installpkg kernel-modules-3.2.29-i686-1.tgz
installpkg mkinitrd-1.1.0-i486-1.tgz
Luego cambiar al directorio /boot:
cd /boot
Ahora ejecutar el script mkinitrd. Como se está usando reiserfs en el sistemas de archivos raíz y como es un sistema IDE, el módulo reiserfs será el único que se necesita cargar:
mkinitrd -c -k 3.2.29 -m reiserfs
NOTA: Para facilitar el proceso se presenta un script más adelante así que evitar ir haciendo esto. Solo es teoría.
Esto debería hacer dos cosas. Primero, creará el directorio /boot/initrd-tree que va a contener el sistema de archivos de initrd. Luego creará un initrd (/boot/initrd.gz) desde este árbol de directorios. Si lo deseas, podrías hacer algunos cambios adicionales en /boot/initrd-tree/ y entonces ejecutar mkinitrd de nuevo, sin las opciones de reconstruir la imagen. Esto es opcional, aunque solo los usuarios avanzados necesitarán pensar en esto.
Aquí hay otro ejemplo: construir una imagen usando los módulos del kernel de Linux 3.2.29 para un sistema con una partición raíz ext3 en /dev/sdb3:
mkinitrd -c -k 3.2.29 -m ext3 -f ext3 -r /dev/sdb3
4. ¿Ahora que he construido un initrd, cómo lo uso?
Ahora que tienes un initrd (/boot/initrd.gz), tendrás que cargarlo junto con el kernel durante el boot. Si usas LILO como boot loader, necesitarás editar /etc/lilo.conf y agregar una línea para cargar el initrd. Aquí hay un ejemplo de lilo.conf mostrando cómo se hace esto:
# Linux bootable partition config begins
image = /boot/vmlinuz-generic-3.2.29
..initrd = /boot/initrd.gz
..root = /dev/sda6
..label = Lnx3229
..read-only
# Linux bootable partition config ends
El initrd es cargado en la linea «initrd = /boot/initrd.gz«. Solo agrega esta línea justo debajo de la línea para la imagen del kernel que uses. Guarda el archivo y ejecuta LILO de nuevo (# lilo en la línea de comandos). Necesitas ejecutar lilo cada vez que editas lilo.conf o reconstruyes el initrd.
Otros bootloaders como syslinux también soportan el uso de un initrd. Hay que revisar la documentación de esos programas para los detalles de como usar un initrd en ellos.
Creando el initrd
Simple ¿No? Pues no tanto, en mi caso terminé echando todo a la basura con el método que describe Patrick, por alguna extraña razón relacionada con el hecho de que no tengo mucha experiencia con esto. Mi sistema ya no booteaba y tuve que usar el DVD de Slackware para bootear con un kernel de los que vienen ahí y usar el sistema instalado en el disco duro en la partición raíz.
Mi solución final, después de arreglar mi sistema, fue usar el script que AlienBob tiene en su Wiki y que en Slackware 14 ya debe estar incluido (según él mismo desde la versión 12.2). Sino es así (que es muy improbable) hay que descargarlo aquí. Ejecutar el script es tan sencillo como:
# /usr/share/mkinitrd/mkinitrd_command_generator.sh /boot/vmlinuz-generic-smp-3.2.29-smp
Esto nos creará un comando que debemos ejecutar para que se configuren los módulos del kernel especificado, en mi caso me generó este comando:
# mkinitrd -c -k 3.2.29-smp -f ext4 -r /dev/sda3 -m usbhid:ehci-hcd:uhci-hcd:mbcache:jbd2:ext4 -u -o /boot/initrd.gz
Al ejecutar lo anterior se genera un pedazo de código que hay que colocar en LILO y ahí mismo vienen las instrucciones para hacerlo, primero editar lilo:
# nano /etc/lilo.conf
Y colocar el código de tal manera que quede parecido a esto:
# Linux bootable partition config begins
image = /boot/vmlinuz-generic-smp-3.2.29-smp
..initrd = /boot/initrd.gz
..root = /dev/sda3
..label = 3.2.29-smp
..read-only
# Linux bootable partition config ends
Bueno esto es como yo lo hice, cada sistema tiene una configuración diferente por ello el comando que se generará para tí será diferente, sin embargo el proceso es el mismo.
Saludos.