Compilar Kernel al estilo Debian desde Ubuntu.

Saludos a todos!!! Vamos a arrancar el año con un experimento medio extraño.Alguna vez escuchaste que se puede compilar el kernel  a la manera de Debian??? Bueno, aca tenes toda la info!!!


ACLARACION: Es un documento un poco viejo pero se puede aplicar a cualquier kernel actual, donde dice el  nombre del kernel ingresan el que quieren y listo.

Un breve manual donde se enseña a compilar un kernel Linux a la manera Debian.

Conceptos básicos
1.¿Porqué compilar un kernel a la manera Debian?
2.Descargando y desempaquetando nuestro nuevo kernel
3.Configurando el kernel
4.Compilando
5.Instalando el kernel
6.¿Dónde consigo más información?
7.TIPS y consejos

1. Conceptos básicos

Si ya tienes experiencia en GNU/Linux y sistemas operativos puedes saltar esta sección y comenzar desde la sección 1.2.
Cuando comentamos acerca de Linux es muy común que nos estemos refiriendo mas que todo al Sistema Operativo con sus aplicaciones y no al núcleo del sistema como tal. La realidad es que el Sistema Operativo(SO para acortar) Linux es solamente el núcleo del sistema, que también es llamado kernel. El kernel es el componente más importante y es quien hace funcionar todo el sistema, sin el kernel no podría funcionar ninguna otra aplicación. Algunas de las funciones del kernel son:

Administrar la memoria del computador
Establecer la comunicación entre las aplicaciones y los dispositivos de hadware
Administrar los procesos
Otros (No me acuerdo de otro más :-P)
Es importante recordar que el kernel recibe grandes cantidades de actualizaciones en muy poco tiempo, esas actualizaciones contienen en la mayoría de los casos módulos nuevos, mejoras de seguridad, mejoras en la administración de recursos, etc. ¿Cómo saber que incorpora cada nuevo Kernel que se libera? Mirando un archivo llamado ChangLog que está tanto en la misma página de donde se descargar el kernel como dentro del kernel una vez descargado.


2. ¿Porqué compilar un kernel a la manera Debian?
Lo mas seguro es que usted se esté preguntado porqué compilar un kernel a la manera de Debian y no hacerlo a la manera clásica o la tradicional. El hecho de compilarlo a la manera debian nos proporciona ciertas ventajas que compilarlo a la tradicional. Cuando a la ‘debian way’ este se empaqueta automáticamente en un archivo que tiene extensión .deb, es decir, se crea un paquete. El simple hecho de que se genere un paquete con nuestro kernel compilado nos proporciona las siguientes ventajas:

Cuando tengamos que eliminar el kernel debido a que probablemente ya tengamos uno nuevo, lo único que tenemos que utilizar es la herramienta dpkg de la siguiente forma: dpkg -r TU_KERNEL. Donde tu kernel es el nombre que le diste al paquete(ya más adelante veremos como). Para eliminar el kernel también puedes utilizar herramientas como apt-get, aptitude, o mejor aún Synaptic para los novatos que están empezando o las personas que se sientan cómodas usándolo.
Al poder tener el kernel en un paquete se no hace muy fácil guardarlo en un Pendrive, CD, DVD, o mejor aún, si tenemos un servidor web podríamos subirlo para que otros se descarguen el paquete con el kernel y utilicen nuestro propio kernel. Comúnmente el objetivo de esto es poder instalar ese mismo kernel en varias máquinas.
Por ejemplo, si tienen 20 máquinas en su oficina y van a actualizar el kernel a todas, sería muy absurdo compilar el kernel en para cada una se las máquinas, pero sería inteligente y astuto utilizar herramientas de Debian para poder crear un kernel genérico, el cual nos proporcionará un paquete con el kernel, el cual vamos a poder distribuirlo en todas las máquinas mediante CDs, servidor Web, FTP, samba, pendrive, otros. Y así poder instalar rápidamente (en pocos minutos si no surge error) el kernel para las 20 máquinas.

3. Descargando y desempaquetando nuestro nuevo kernel

Para instalar un nuevo Kernel es necesario descargar el código fuente del mismo en la página oficial que es donde se encuentran todos los kernel de Linux, desde la primera versión hasta la última. Cuando hacemos la descarga de un kernel siempre no lo encontraremos empaquetado y comprimido en alguno de estos formatos: .tar.bz2 o .tar.gz . Es indiferente cual se descarguen, de todas formas voy a explicar como se hace para descomprimir y desempaquetar para los dos tipos de formato. Lo común es que descomprimas el kernel en /usr/src pero si deseas hacerlo en otra parte posees la libertad ;-). Por ejemplo actualmente yo me bajé la versión 2.6.15 y la descomprimí en /usr/src , que es el directorio donde normalmente se trabaja para todo lo que tiene que ver con kernls y módulos.

Para los que descargaron el .tar.gz :
tar xvzf linux-2.6.15.tar.gz

Para los que descargaron el .tar.bz2:
tar xvjf linux-2.6.15.tar.bz2

Notar la ``j’’ para el de extensión .tar.bz2

Luego de eso necesitamos ingresar al directorio donde se descomprimió y desempaqueto el kernel para poder configurarlo y compilarlo, para ingresar al directorio:
cd linux-2.6.15

4. Configurando el kernel

Una vez dentro del directorio donde hemos descomprimido y desempaquetado el kernel, necesitamos limpiar el kernel de todo archivo de configuración que tenga el mismo. NOTA: Normalmente podemos obviar este paso para la primera vez que nos descarguemos el kernel, ya que este viene completamente listo para compilar. Pero una vez que terminas la compilación del mismo y por cualquier razón quieres volver a compilar dicho kernel, no es necesario que tengas que descomprir y desempaquetarlo de nuevo, puedes reutilizar ese código para volver a compilar y es allí cuando tienes que eliminar(limpiar) todos los archivos que se generaron con la compilación anterior.
Para “limpiar” los fuentes del kernel:
make mrproper
Ahora tenemos que configurarlo. Cuando hablamos de configurar nos referimos a decidir que módulos queremos posea el kernel una vez compilado, que módulos no. Como siempre pasa en los referente al Software Libre, siempre hay varias maneras de hacer las cosas, lo que quiero decir es que tenemos muchas maneras de configurar el kernel. Aquí les presento 3 formas:
1era forma: make config


2da forma: make menuconfig NOTA: Necesitas tener instalado las las librerías ncurses, en debian: aptitude install ncurses-base
3ra forma: make xconfig NOTA: Las librerías QT las puedes instalar con apt de esta manera. aptitude install libqt3-dev

Para la configuración utilizaré la segunda forma, que es como lo he hecho siempre, por supuesto estás en la libertad de utilizar la que quieras, sin embargo te recomiendo la segunda forma, debido a que no necesitas estar en entornos de escritorio ni tener levantado el servidor X, además que es muy interactiva y simple.
Para empezar la configuración:
make menuconfig
Es importante recordar que cuando se dediquen a configurar el kernel sean muy cuidadosos seleccionando cuales módulos tendrá y cuales no. Por ejemplo si tenemos dispositivos como FlashDrive o también llamados Pendrive es indispensable que activemos el soporte SCSI en el kernel(específicamente soporte para discos SCSI) debido a que estos dispositivos son emulados como discos SCSI tanto Linux como en otros sistemas operativos. También debemos tener en cuenta que si tenemos discos duros SCSI y no le activamos el soporte en el kernel, estaría demás decir que evidentemente no funcionarán. Si desactivas el soporte para CDROM, evidentemente la unidad de CDROM no funcionará una vez que instalemos y usemos el kernel. De igual manera pasa si desactivamos el soporte USB en el kernel, no funcionaría todo los que conectemos por el puerto USB.

5. Compilando

Una vez que terminamos de configurar el kernel tenemos que compilarlo, como lo vamos a hacer de la forma Debian es necesario que tengamos instalado un paquete llamado “kernel-package” el cual nos va a suministrar las herramientas necesarias para poder compilar y generar el paquete con nuestro debido kernel, para instalar la herramienta: aptitude install kernel-package. Bien para empezar la compilación debemos estar en el directorio donde se encuentra el código fuente del kernel y luego ejecutar lo siguiente:
make-kpkg clean
make-kpkg –initrd kernel_image kernel_headers

A manera de información para los que han compilado un kernel anteriormente de Linux mas no a la manera Debian les informo que este comando equivale en la manera clásica a teclear make dep, make clean, make bzImage y make modules
La opción “–initrd” crea una imagen initrd en el paquete que se guardará en /boot cuando instalemos el kernel(recordar que estamos compilandolo nada mas).
El resultado del comando anterior va a ser crear dos paquetes con extensión .deb en el directorio superior de donde está el código fuente del kernel. Un paquete va a ser el kernel completo y el otro va a ser los kernel-headers.
La opción de “kernel_headers” que colocamos para la compilación es opcional, yo personalmente la coloco debido a que muchos programas y módulos necesitan tener los kernel headers para ser instalados, por ejemplo: el driver de nvidia, VMware, ndiswrapper, madwifi, otros. Si no necesitas los kernel headers borra la palabra “kernel_headers” del comando anterior.
NOTA: El tiempo que dura compilar el kernel es dependiente de la configuración que hayas hecho en el mismo y de la velocidad y tipo de procesador que tengas. Si agregaste muchos módulos el kernel tardará más, pero si son pocos la compilación será rápida. Hay que tener paciencia, es muy común que se tarde bastante.

6. Instalando el kernel

Una vez que termina la compilación y notamos la existencia de lso dos paquetes en el directorio superior es hora de instalar el kernel. La instalación es súper sencilla, debemos ejecutar lo siguiente (recuerda que tienes que estar en el directorio superior):
dpkg -i TU_KERNEL.deb
dpkg -i TU_KERNEL-HEADERS.deb
Por ejemplo, en mi caso fue así:
dpkg -i kernel-image-2.6.15_10.00.Custom_i386.deb

dpkg -i kernel-headers-2.6.15_10.00.Custom_i386.deb

7. ¿Dónde consigo más información?

Si quieres saber que otros parámetros le puedes pasar al make-kpkg para compilar el kernel puedes leerte el manual que está completamente en español y fácil de entender. Para leer el manual:
man make-kpkg

8. TIPS y consejos


Todos los kernels que han existido en Linux se encuentran en: http://kernel.org/pub/linux/kernel
Consultar el manual de make-kpkg que tiene documentación sencilla y en español. man make-kpkg
Si ya tenemos un kernel anterior configurado y no queremos repetir el paso de la configuración debido a que perdemos mucho tiempo o nos da flojera podemos hacemos lo siguiente: En /boot debe estar nuestra configuración anterior, normalmente el archivo que contiene tu configuración anterior se llama config-VERSION_KERNEL. Por ejemplo el mio se llama config-2.6.14 . Ese archivo lo tenemos que copiar en directorio donde están las fuentes del kernel con el nombre “.config”(recuerden el “.” que es súper importante, sin el no nos va a funcionar. En mi caso lo copié de esta manera:
cp /boot/config-2.6.14 /usr/src/linux-2.6.15/.config

Una vez que hacemos eso ya esta configurado el kernel, podemos verificar entrando a la configuración del mismo usando cualquiera de las 3 maneras nombradas en el capítulo 4 y notaremos que tiene una configuración diferente a la que viene por defecto.

Es importante recordar que si vamos a configurar el kernel con “make config” tenemos que conocer algo de hadware, cuando digo conocer me refiero a que tenemos que saber algunos dispositivos de hadware que posee nuestro ordenador. Por eso si eres medio novato te recomiendo que te vallas por el “make menuconfig”
Si vas a compilar varios kernel puedes colocarle su nombre a cada compilación para poder identificar el paquete .deb en el directorio superior. Para hacer esto necesitas agregar una opción
-append-to-version=NOMBRE y como ya saben donde dice nombre es donde colocan el nombre que caracterice a cada kernel.

Si quieren incorporar módulos que no vinieron con el kernel pueden utilizar module-assistant, que posee bastante documentación. Además que es muy útil por que nos evitar reiniciar la computadora una vez que incorporemos módulos al kernel.

Escrito el January 11, 2011