1) OBTENER LAS FUENTES DEL KERNEL
Las fuentes del kernel las podemos obtener de muchos sitios. El oficial, como todos sabeis es
www.kernel.org
Pero también están en los repositorios de Debian, y yo las he sacado de ahí, porque tiene algunas ventajas, como luego veremos.
En los repositorios de Debian os las vais a encontrar con el nombre kernel-source. Por lo tanto para obtener las fuentes del kernel que tenemos instalado y corriendo en nuestro sistema, sólo tendremos que hacer:
Código:
bash:# apt-get install kernel-source
Con esto se descargará el archivo kernel-source-nº_de_version.tar.bz2 en el directorio /usr/src
Nos movemos a ese directorio:
Código:
bash:# cd /usr/src
Si existe un enlace llamado linux a un kernel antiguo, lo borramos:
Código:
bash:/usr/src# rm linux
Ahora vamos a descomprimir el archivo de las fuentes:
Código:
bash:/usr/src# tar jxvf kernel-source-nº_de_version.tar.bz2
(Si en vez de una archivo tar.bz2 es un archivo tar.gz, lo descomprimiremos con tar zxvf)
Esto creará un directorio llamado kernel-source-nº_de_version
Creamos un enlace simbólico (llamado linux) a ese directorio:
Código:
bash:/usr/src# ln -s linux-source-nº_de_version linux
2) CONFIGURAR EL KERNEL
Hay varias formas de configurar el kernel. Probablemente la mayoría de la gente utiliza una de estas dos: make menuconfig o make xconfig. La diferencia es que con make menuconfig no hace falta tener las Xwindow corriendo, y con make xconfig sí.
NOTA: para utilizar make menuconfig necesitaremos las liberías ncurses-dev y para utilizar make xconfig necesitaremos las librerías qt-dev.
Una duda que siempre surge: para configurar el kernel, ¿puedo partir de una configuración conocida?. Pues la respuesta es que sí. Al instalar un kernel Debian, se crea, en el directorio /boot, un archivo llamado config-nº_de_version-arquitectura, y, ¿qué es ese archivo?, pues no es más que un archivo de texto con la configuración actual del kernel, por lo tanto, para partir de esa base y comenzar la configuración del nuevo kernel desde la actual, lo que tenemos que hacer es copiar dicho archivo al directorio /usr/src/linux, pero llamádolo .config, es decir:
Código:
bash:# cd /usr/src/linux
bash:/usr/src/linux# cp /boot/config-nº_de_version-arquitectura .config
Pues ahora ya podemos hacer (situados en el directorio /usr/src/linux) un make oldconfig menuconfig o un make oldconfig xconfig y modificar las opciones que queramos del kernel, es decir, configurarlo a nuestro gusto. Con mucho cuidado, eso sí, porque este es el paso crítico. Aquí es donde lo podemos arruinar todo si, por ejemplo, no incluimos algún módulo necesario para nuestro sistema.
3) CONSTRUIR EL PAQUETE DEL KERNEL
Para construir el paquete con el que instalaremos el nuevo kernel vamos a usar la orden make-kpkg. Esta orden lo que hace básicamente es sustituir a las clásicas make dep, make clean, make bzImage y make modules. Admite numerosas opciones y modificadores (ya sabeis: man make-kpkg), pero para lo que nos ocupa ahora sólo necesitaremos hacer lo siguiente:
Código:
bash:/usr/src/linux# make-kpkg clean
bash:/usr/src/linux# make-kpkg --append-to-version=.XXXX --initrd kernel_image
Lo único que teneis que modificar de la orden anterior es XXXX, que representa una secuencia alfanumérica que tendréis que decidir vosotros, y que se añadirá al número de versión del kernel para diferenciar el kernel que estais compilando de cualquier otro que ya esté instalado en vuestro sistema. Por lo tanto XXXX lo debereis sustituir por lo que querais, intentando no utilizar el guión de subrayado bajo (_) ni expresiones como "-386", "-606", "-K7", "-sparc", etc., porque expresiones similares son las usadas por los kernel precompilados de Debian y podrían inducir a error. Personalmente yo uso la fecha en la que compilo el kernel, de forma que si lo compilase hoy (21 de noviembre de 2004), mi orden querdaría así:
Código:
bash:/usr/src/linux# make-kpkg --append-to-version=.211104 --initrd kernel_image
Ahora hay que hablar un poco sobre la opción --initrd
Esta opción lo que hace es crear una imagen initrd en el directorio /boot.
Realmente no es imprescindible utilizarla siempre que a la hora de configurar el kernel hayamos incluido de forma estática (y no como módulos) los controladores para al menos nuestro bus, disco y sistema de archivos de nuestro directorio raiz. Pero (y esto es sólo una experiencia personal) siempre que he intentado compilar un kernel sin esa opción, me he encontrado con un sistema que no arrancaba, así que yo la uso siempre. ¿Qué problema tiene?, pues que para que la opción --initrd funcione correctamente, hay que aplicar a las fuentes del kernel el parche cramfs. Tranquilos, porque todos los kernel de Debian tienen ese parche ya aplicado. Pero es algo que tendréis que tener en cuenta si habeis obtenido las fuentes del kernel en algún otro sitio (por ejemplo en
www.kernel.org).
Bien, como he dicho antes, las órdenes que tenemos que ejecutar son:
Código:
bash:/usr/src/linux# make-kpkg clean
bash:/usr/src/linux# make-kpkg --append-to-version=.XXXX --initrd kernel_image
Tras ejecutar la segunda de ellas nos saldrá un mensaje de aviso diciéndonos que la opción --initrd puede no funcionar como nosotros esperamos, y preguntándonos si queremos abortar el proceso. Como ya sabemos que a nosotros nos va a funcionar correctamente, contestamos que no.
Y ahora a esperar, porque el proceso de compilación puede durar mucho.
4) INSTALAR EL KERNEL
Si todo lo anterior ha ido bien, en el directorio /usr/src se debe haber creado un archivo de nombre kernel-image-nº_version.XXXX_10.00.Custom_i386.deb
Este es el archivo que contiene nuestro kernel compilado listo para instalar, lo que haremos con:
Código:
bash:/usr/src# dpkg -i kernel-image-nº_version.XXXX_10.00.Custom_i386.deb
Esta orden es equivalente a las clásicas make modules_install y make install, además de colocar en su sitio la imagen initrd generada y actualizar el grub o el lilo.
Ahora, y por seguridad, borramos el enlace que habíamos creado:
Código:
bash:/usr/src# rm linux
Y ya está. Sólo nos queda arrancar con nuestro nuevo kernel.