Compilando el kernel Linux 2.6.x en 8 pasos
Copyright (C) 2004 Marco Antonio Islas Cruz
Permision is granted to copy, distribute and/or midify this document
under the therms os the GNU Free Documentations License, Version 1.1
or any later version published by the Free Software Foundation;
with no Invariant Sections, with no Front-Cover Texts, and with no
Back-Cover Texts. http://www.gnu.org/copyleft/fdl.html
Bien, en este pequeño manualito, veremos de una forma rapida y sencilla el proceso de compilacion del Kernel en Linux.
Por si no lo sabes, el kernel es el "corazon" de cualquier Sistema Operativo. asi, SunOS, *BSD, Linux, MS-DOS, Windows u otros sistemas tienen un kernel que administra los recursos del sistema.
Una de las razones por las que GNU/Linux es uno de los sistemas mas poderosos, es por constante actualizacion del kernel. "Actualizar el nucleo (el kernel) es simple asunto de juntar las fuentes y compilarlo uno mismo. Se debe compilar el nucleo por si mismo para activar o desactivar ciertas funciones, ademas de asegurarse de que el nucleo estara optimizado para correr en esa maquina. El proceso es casi indoloro"1.
La compilacion de la que se hace mencion en este documento fueron realizadas en Slackware GNU/Linux 10.0, Aunque en todas las distribuciones deberia ser practicamente igual puede haber ligeros cambios,
1-. Bien, lo primero que haremos sera descargarnos las fuentes del kernel, lo podemos hacer entrando en www.kernel.org, de donde podremos descargar el parche (Nota: Al referirse como parchar o parche, no se refiere a "Corregir errores" o "Tapar hoyos", sino al echo de actualizar sin tener que compilar TODO el nucleo), asi como el codigo fuente completo del nucleo linux. Al momento de escribir estas lineas, el kernel mas nuevo es el reciente Kernel 2.6.0.
2.- Una vez que ya tenemos las fuentes de nuestro kernel lo descompactamos en "/usr/src/", como el kernel esta empaquetado con dos diferentes metodos, mostraremos los dos:
linux-2.6.x.tar.bz2
# tar -xjvf linux-2.6.x.tar.bz2
# bzip2 -d linux-2.6.x.tar.bz2 | tar -xvf
linux-2.6.x.tar.gz
# tar -xzvf linux-2.6.x.tar.gz
# gzip -d linux-2.6.x.tar.gz | tar -xvf
3.- Esto nos generara una carpeta en donde se encuentran las fuentes del kernel algo asi como "/usr/src/linux-2.6.x/", podemos crear un enlace simbolico para nuestra carpeta, llamandolo "linux" (/usr/src/linux), esto porque muchos programas se referiran a las fuentes por /usr/src/linux/. De esta manera no tendremos que cambiar el nombre del directorio. Lo haremos de la siguiente manera:
#ln -s /usr/src/linux-2.6.x/ /usr/src/linux
4.- En este momento, tenemos lo necesario para empezar con la configuracion de nuestro kernel, asi que dentro de la carpeta que contiene las fuentes ejecutaremos el comando "make" con la variable "config","menuconfig" o "xconfig".
#make config
#make menuconfig
#make xconfig
Cualquiera de las tres opciones son para configurar el kernel, y van de mas complicado a mas sencillo. Con "make config" se nos haran preguntas sobre las opciones, todas y cada una de ellas acerca de la configuracion del modulo (Nada recomendable, es un proceso mas tardado de lo que imaginas) este proceso es en modo texto. "make menuconfig" tambien es un proceso en modo texto, con la diferencia de que aqui apreciaremos todo en un menu. Con "make xconfig" realizaremos la configuracion del kernel en modo grafico --Solo si contamos con X--, de todas esta es la opcion mas recomendada, pues es mas sencilla y organizada.
La configuracion del kernel no la explicare, pues es un proceso que cada quien lo tiene que realizar ajustanto el kernel a sus necesidades. La recomendacion que puedo hacer es meter en el kernel lo que es realmente necesario y que casi siempre se va a utilizar. El kernel se carga completo desde un principio, asi que si metemos en el kernel muchos modulos, se hara muy grande y nos consumira mas memoria y ciclos del CPU. Ahora, tampoco es bueno dejarlo todo como modulo, si dejamos como modulo por ejemplo la tarjeta de red en una computadora que esta siempre conectada, el proceso de carga y descarga del modulo cada vez que el dispositivo se utiliza ralentizaria nuestro kernel. Tambien hay que tomar en cuenta ke no debemos poner como modulos cosas que seran necesarias para booteo de nuestra maquina. Por ejemplo, si estamos utilizando el sistema de ficheros Ext3 (Ext2 + Journaling), en nuestro kernel lo marcamos como modulo, y nuestro kernel reside en una particion Ext3, nuestro kernel sera incapaz de bootear por si solo (a menos que utilices Initrd). Pues a la hora de intentar cargarse no podra cargar el modulo (pues no tiene soporte para Ext3), no podra leer el sistema de ficheros y por consiguiente, no podra Bootear.
En caso de que tu kernel no funcione a la primera (Es normal que a la primera no nos quede el kernel como lo queremos), debe haber sido porque en alguna de las opciones la marcaste con "m"(modulo) o como "n"(no incluir ni en el kernel ni como modulo). Recuerda siempre guardar el archivo de configuracion de tu kernel, pues en caso de tener que reconfigurarlo, no tendras que partir desde cero.
5.- Ok, ya que tenemos configurado nuestro kernel, se nos instara a que realizemos la compilacion del mismo, es un proceso sencillo, y nuestro ordenador hara todo :), para ello ejecutaremos "make dep" para generar las dependencias, "make clean" para limpiar de anteriores binarios, y "make bzImage" para generar la imagen comprimida del kernel. Para ahorrarnos tiempo, marquemoslo todo en la misma linea de comando:
#[make dep;]make clean; make bzImage
Nota: En los kernels 2.6.x no es necesario hacer el "make dep" esto solo es necesario para kernels inferiores o iguales a la verison 2.4.x
En esto de la compilacion nos tardara un rato, dependiendo de lo que le hayamos metido a nuestro kernel, asi como de la velocidad de nuestro micro. Referencia: Tengo un procesador P4-M a 1.8 Ghz, tardó aproximadamente 15-20 mins cambiando solo algunos parametros. En este momento podemos despegarnos de la computadora por un minuto, tal vez para preparar lo que haremos mientras compilamos los modulos ;-).
6.- Una vez compilado el kernel tendremos que compilar todo lo que hayamos marcado como modulos. Este proceso es quiza el mas tardado de todos, pues habra una buena cantidad de modulos que compilar (a menos que sepas bien lo que necesitas y le hayas kitado todos los innecesarios). Como ya habia dicho antes, es buen momento para retirarse a tomar cafe, a platicar con alguien ver una pelicula o hacer algo mas. Referencia: En mi maquina ha tardado algo asi de una hora compilando los modulos, quite drivers innecesarios, soporte para sistemas de ficheros que no utilizo, y algunos los mande al kernel.
Esto lo haremos con
#make modules
Una vez compilados los modulos, no se nos debe olividar instalarlos en la carpeta de modulos correspondiente a nuestro kernel, lo marcaremos con :
#make modules_install
7.- Realizando esto, ya tenemos todo lo que necesitamos en binarios, no mas compilaciones (si todo salio bien). La imagen comprimida de nuestro kernel se encuentra en la carpeta "/usr/src/linux-2.6.0/arch/i386/boot/" (si fue compilado para i386). Lo que haremos sera copiar el archivo bzImage a /boot/. Por seguridad cambiemos el nombre.
#cp bzImage /boot/2.6.x
8.- Ya en este lugar, lo que tendremos que hacer es una imagen de booteo (initrd).
* Por que necesito initrd? (tomado deREADME.initrd del disco 2 Slackware 10.0 "testing/packages/linux-2.6.7" )
o La razon mas usual para usar initrd es porque tu necesitas cargar los modulos de kernel antes de poder montar la particion de root. Usualmente estos modulos son requeridos para soportar el sistema de ficheros usados en la particion raiz (ext3, reiserfs, xfs), o tambien el controlador del disco duro (SCSI, RAID,etc). Escecialmente, hay diferentes opciones disponibles en los modernos kernels Linux que no es practico hacer kernels para cubrir las necesidades de todos. Es mucho mas flexible crear un solo kernel generico y una serie de modulos para este kernel.
* Como genero una imagen initrd??
o Entra en /boot
o
mkinitrd -c -k 2.6.7 -m jbd:ext3 -f ext3 -r /dev/hdb3
o Esto funcionara para crear una imagen initrd en /boot para el kernel 2.6.7 con sistema de ficheros ext3, es necesario que esta en /dev/hdb3. Nota que es necesario tener ambos modulos (jbd y ext3) para poder utilizarlo.
9.- Ya por ultimo tendremos que ajustar nuestro gestor de arranque para que bootee con el nuevo kenel, en LiLo seria algo asi:
image=/boot/vmlinuz
label="linux"
root=/dev/hda8
initrd=/boot/initrd.gz
*append="quiet devfs=mount acpi=off"
*vga=788
read-only
Nota: Los marcados con * son extra, he tomado esta configuracion de mi lilo.conf
No es para nada recomendable, es mas seria algo "estupido", borrar la imagen del kernel anterior en /boot/, o eliminarla de nuestro gestor de arranque, pues, si por alguna razon nuestro kernel no es capaz de bootear, lo necesitaremos para corregir los errores. A menos que estemos COMPLETAMENTE SEGUROS de que nuestro kernel si funciona bien