martes, 13 de septiembre de 2011

RHEL/CentOS: Examining and building the initial ramdisk



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-dev
Ustedes 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