Como muchos de ustedes seguramente sabrán, al bootear un equipo, es necesario tener cargados ciertos módulos como el de la controladora de disco (ATA/SATA/SCSI), filesystems, manejo de memoria, entre otros, para de esta forma poder realizar la secuencia normal de booteo e inicio del sistema.
Pero, aquí entramos en el clásico problema "The Chicken/Egg problem". ¿Como el OS monta la rootfs, si aún no tiene cargado los módulos?. Es que para ello existe, mis queridos amigos el initial RAM disk, o mejor conocido como initrd. Un filesystem temporal, utilizado por el kernel, que al momento del booteo es cargado en /dev/ram0. El kernel utilizará en un principio dicho RAM disk, como rootfs, hasta que el kernel monte el rootfs real, y lo posicione como tal mediante la syscall pivot_root.
Esto se realiza, escribiendo el número del real rootfs en el archivo /proc/sys/kernel/real-root-dev. Un ejemplo de ello podría ser:
# echo 0x301 >/proc/sys/kernel/real-root-devUstedes sabrán que dentro del kernel, los módulos pueden ser compilados, built-in, osea construidos dentro de este o en forma de modulo, siendo cargados a medida que se necesitan.
Construir un kernel, con todos los drivers necesarios buil-in, daría lugar a un kernel pesado, y mas lento. Es por ello que estos drivers esenciales, que deben cargarse en algún momento del booteo del equipo, deben ser incluido en el initial RAM disk.
En el archivo de configuración de nuestro cargador de inicio (GRUB en la mayoría de los casos), encontramos estas líneas:
title CentOS (2.6.18-194.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.18-194.el5.img
Nos detenemos en la línea initrd, esta línea le dice al gestor de arranque, de donde debe obtener dicho RAM disk. Este es un archivo comprimido generalmente con cpio y a la vez compreso con gzip, que contiene además de los módulos algunas otras cosas, como scripts, algunas configuraciones, como la de LVM, en caso de ser usado, entre otros.
El el primer caso, podemos comprobar que el RAM disk se encuentra compreso con gzip:
# file /boot/initrd-2.6.18-194.el5.img
/boot/initrd-2.6.18-194.el5.img: gzip compressed data, from Unix, last modified: Mon Jan 3 08:12:32 2011, max compression
Y a su vez, comprobar que el mismo también se encuentra comprimido con cpio:
# zcat /boot/initrd-2.6.18-194.el5.img | file -
/dev/stdin: ASCII cpio archive (SVR4 with no CRC)
Si queremos examinar el contenido del mismo, para buscar si esta incluido dicho módulo, obviamente que podemos hacerlo:
# zcat /boot/initrd-2.6.18-194.el5.img | cpio -itv
drwx------ 2 root root 0 Jan 3 2011 proc
-rwx------ 1 root root 2784 Jan 3 2011 init
drwx------ 2 root root 0 Jan 3 2011 sys
drwx------ 3 root root 0 Jan 3 2011 etc
drwx------ 2 root root 0 Jan 3 2011 etc/lvm
-rw------- 1 root root 1287 Jan 3 2011 etc/lvm/lvm.conf
drwx------ 2 root root 0 Jan 3 2011 sysroot
drwx------ 3 root root 0 Jan 3 2011 lib
-rw------- 1 root root 51760 Jan 3 2011 lib/dm-region_hash.ko
-rw------- 1 root root 134232 Jan 3 2011 lib/dm-mod.ko
-rw------- 1 root root 117024 Jan 3 2011 lib/dm-raid45.ko
En caso de necesitar dar soporte a algún módulo en especial, cosa común cuando hacemos cambios en el hardware, por ejemplo la controladora de discos, o algún cambio importante en el filesystem, debemos reconstruir el initial RAM disk, para ello podemos hacerlo de distintas maneras:
La primera de ella es utilizando el modificador mkinitrd con el modificador --with
#: mkinitrd --with=qla2300 /boot/initrd-$(uname -r)-qla2300.img $(uname -r)Y podemos verificar esto, fijándonos si construyo el nuevo initrd en el directorio /boot
# ls -l /boot/initrd-2.6.18-*
-rw------- 1 root root 3439778 Mar 15 15:53 /boot/initrd-2.6.18-194.32.1.el5.img
-rw------- 1 root root 3432496 Jan 3 2011 /boot/initrd-2.6.18-194.el5.img
-rw------- 1 root root 3487257 Apr 12 08:03 /boot/initrd-2.6.18-238.5.1.el5.img
-rw------- 1 root root 3498999 Sep 13 19:22 /boot/initrd-2.6.18-238.5.1.el5-qla2300.img
La segunda de ellas es localizando un script en el directorio /etc/sysconfig/mkinitrd/
#: echo "MODULES="$MODULES qla2300" > /etc/sysconfig/mkinitrd/qla2300
#: chmod +x /etc/sysconfig/mkinitrd/qla2300
#: mkinitrd /boot/initrd-$(uname -r)-qla2300.img $(uname -r)
Y la tercera de ellas es añadiendo dicho módulo, como alias en el archivo /etc/modprobe.conf, para ello:
#: echo "alias scsi_hostadapter qla2300" >> /etc/modprobe.conf
#: mkinitrd /boot/initrd-$(uname -r)-qla2300.img $(uname -r)
No hay comentarios:
Publicar un comentario