Tras un largo periodo de sequía y falta de novedades importantes, al fín pasó algo digno de contar en el discreto diario:
la primera
compilación correcta y funcional de un kernel (concretamente un
3.3.6)
que hago desde hace... ni me acuerdo.
¿Cuál era el problema? Desde que se impuso el
SATA como interfaz principal en los
dispositivos de almacenamiento masivo (discos duros/DVD/CD) no conseguía construir un kernel que me reconociera correctamente el disco duro que
contiene el sistema operativo en el arranque. Puedo recordar el proceso de arranque de linux en brevísimos pasos:
- Arranca el ordenador, se lee la BIOS y el primer sector (MBR) del dispositivo de arranque.
- En la actualidad, si usamos un Linux modernillo, se ejecuta GRuB (o LiLo para los más veteranos)
- Estos gestores de arranque cargan un kernel en memoria, lo ejecutan con ciertos parámetros y por tanto le ceden el control
- El kernel reconoce los dispositivos básicos -entre ellos donde está el sistema operativo-, lo monta, haciéndolo accesible y ejecuta el proceso de PID 0 o 1, llamado init
El problema estaba en que los kernels que construía no reconocían, o lo hacían mal, el disco duro SATA donde está el S.O., y se paraba con un bonito error, que viene a decir "no puedo montar el sistema de archivos
root, no leo nada, ni init ni ná... hasta aquí llegamos y no puedo pasar". Batacazo.
A cuenta de esto, hay dos grandes métodos de construir el kernel: con o sin
ramdisk. Recordemos que actualmente los kernels linux son modulares, es decir, se carga una pequeña parte de los
drivers (por seguir una nomenclatura guindosera) en el nucleo, y el resto se cargan dinámicamente (o sea, cuando sean necesarios, para no gastar RAM ni recursos en cosas innecesarias) desde pedazitos de código llamados
módulos.
Si tenemos un sistema de ramdisk para arrancar (el más habitual para los linux actuales, léase Ubuntu, Debian, CentOS....), el kernel arranca, genera un ramdisk (o sea un disco
virtual en memoria RAM) y descomprime allí un fichero con los módulos, que se suele llamar
initrd. Este tema ya lo traté
por aquí.
Pero no sé lo que pasa, que no me funcionaba correctamente, por lo que decidí probar con un kernel un poco más
monolítico, o sea, incorporar en el propio kernel el soporte de hardware para SATA, pasando del initrd y del ramdisk. Para ello la compilación se hace un poco más pesada, ya que hay que fijarse (yo uso el
make menuconfig para configurar la compilación) muy bien en lo que se marca para compilar en el kernel o en los módulos.
La gran pega de todo esto de compilar el kernel es que, si falla (y lo hizo muchas veces) el ordenador se queda colgado, hay que resetear, arrancar con un kernel funcional (por suerte el GrUB o LiLo nos permite tener varios kernels para arrancar), repasar la configuración y recompilar. Por suerte, el
Core2Quad se "come" la compilación con
bastante brío :-)
Entonces opté por otro experimento: una máquina virtual
VirtualBox que sería mucho más cómoda de re/arrancar, modificar, cambiar, etc, etc.
Tras varios intentos en el KernelKrucher, ¡éxito!. Tras recompilar jugando con varias opciones del SATA/SCSI/PATA/AHCI y no sé cuantas siglas más, tenemos un kernel operativo, tanto en la máquina virtual como en la real:
Y por cierto, todo funcionando, el audio, la VGA, la tarjeta DVB-T, la red, el VirtualBox. En módulos, claro :-)
Tenemos por aquí el fichero ".config" de configuración de la compilación, para salvaguardarlo y para lo que haga falta :-)
Aquí lo tenemos en formato
bonito para la web y en formato
original.
Disclaimer: Todo lo que cuento aquí tiene mucho de opinión y experiencia personal. Nada serio. 100% chapuza. 0% académico.