Compilando el kernel y aplicando parches en sistemas Debian

viernes, mayo 01, 2015 0 Comments



1-Introducción:


Aunque la opción más cómoda es usar los kernel pre compilados que nos ofrece Debian, aveces esa opción no es válida, ya que podemos necesitar un kernel más moderno debido a que disponemos de un elemento de hardware muy reciente o simplemente tenemos un fallo importante y necesitamos aplicar un parche que aún está en desarrollo pero que nos puede resolver el problema en gran medida.

Otra razón de peso, es que no necesitamos la mayoría de módulos que trae el kernel genérico y lo queremos aligerar o bien solo estamos en hacerlo por fines meramente didácticos. Sea cual fuere el motivo, voy a explicar como hacer esta labor de la manera más sencilla.

2-Instalando lo esencial:


Antes de nada, necesitamos descargar los paquetes necesarios:


apt-get install libncurses5-dev fakeroot kernel-package

3-Descargando el kernel:


Acto seguido elegimos el kernel que nos interese, en este caso el último kernel estable disponible:


wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.0.1.tar.xz

El kernel se encuentra disponible en aquí, podéis descargarlo desde el navegador o como he echo yo, aprovechándome de las bondades de wget.

Una vez descargado, tenemos que descomprimirlo para poder compilarlo, lo podemos hacer usando el entorno gráfico como por ej- file-roller o bien con el siguiente comando:


tar -xvJf linux-4.0.1.tar.xz

Esto creará un directorio con las fuentes del kernel.

4-Aplicando parches:


Si no tienes ningún parche que aplicar puedes saltarte este paso.

Si no sabéis lo que es un parche, aquí tenéis un enlace donde lo explican.

Si tenemos que aplicar un parche, ahora es el momento de hacerlo ya que una vez compilado el kernel ya no hay nada que hacer, para ello utilizamos el comando patch:


patch -p1 < /ruta/del/parche

tened en cuenta que tendremos que encontrarnos dentro del directorio del kernel que hemos descomprimido para poder aplicar el parche correctamente, en este caso el parche se llama parche.patch:


cd linux-4.0.1
patch -p1 < parche.patch

Nós mostrará un mensaje con los fichero que ha parcheado, en este punto ya tenemos el kernel parcheado.

5-Configurando el kernel:


Aquí tenemos dos opciones, una muy sencilla y totalmente funcional y otra que requiere de conocimientos de hardware y algo de experiencia compilando núcleos, aunque como ventaja ofrece un núcleo ligero (ocupa menos espacio), menor tiempo de compilación.

5.1-Método sencillo:


Visualizamos el contenido del directorio /boot:


ls /boot

Vemos que hay un archivo cuyo nombre comienza por config:


config-3.16.0-4-amd64

ese archivo contiene la configuración del kernel pre compilado de debian. Lo que hay que hacer es copiarlo y re nombrarlo a .config dentro del directorio que hemos descomprimido. En este caso he descomprimido mi kernel en /usr/src/linux-4.0.1:


cp /boot/config-3.16.0-4-amd64 /usr/src/linux-4.0.1/.config

Con esto ya estaría listo.

5.2-Método "Complicado":


Dentro del directorio donde se encuentran las fuentes del kernel tecleamos:


make menuconfig

si es que queremos un entorno con ncurses.Si queremos configurar a golpe de ratón, lo mas adecuado sería:


make xconfig

si al ejecutar esta orden nos da un error, es que nos hace falta instalar las siguientes dependencias:


apt-get install libqt4-dev

Tenemos que ir navegando por el árbol de opciones y seleccionar nuestro hardware, tened en cuenta que algunas partes de nuestro hardware no deben ir compiladas como módulo si queremos que funcione.

Una vez configurado a nuestro antojo, guardamos los cambios y listo.

6-Creando los paquetes .deb del núcleo:


Para este paso utilizaremos el comando make-kpkg, usada para crear paquetes Debian relacionados con el núcleo. La utilidad debe ejecutarse desde el directorio superior de las fuentes del núcleo, el cual ya debe de haber sido configurado previamente (a menos que se use el objetivo configure). Normalmente, si kernel-package no encuentra un fichero .config en el directorio actual, trata por todos los medios de obtener uno apropiado (generalmente un fichero de configuración adaptado para núcleos Debian para esa arquitectura), y luego invoca a make oldconfig para permitir que el usuario responda cualquier pregunta nueva. Típicamente, el programa se ejecuta como superusuario o bajo fakeroot, sino hay que indicar a make-kpkg como convertirse en superusuario.

Lo primero es ejecutar el siguiente comando:


make-kpkg clean

esto limpiará los ficheros creados anteriormente y nos evitará problemas. Se debe ejecutar cada vez que compilemos un kernel nuevo.

Lo segundo es modificar el CONCURRENCY LEVEL.

Es un parámetro que solo es válido para la compilación del kernel, la variable representa el número de núcleos de nuestro procesador+1, por ej, para un procesador de 4 núcleos deberemos usar valor 5. Exportamos el nuevo valor de la variable:


export CONCURRENCY_LEVEL=5

logicamente el establecer de modo correcto el valor de esta variable, ayudará notablemente en los tiempos de compilación de nuestro kernel.

Llegó la hora de compilar, para ello ejecutamos el siguiente comando:


fakeroot make-kpkg --append-to-version "-personalizar" --revision "numero" --initrd kernel_image kernel_headers

Este comando nos creará los 2 paquetes deb, que luego instalaremos con el gestor de paquetes de debian.

Personalizar: Ponemos el nombre que queramos darle al kernel

Numero: Le podemos indicar que número de revisión es para no confundirnos con futuros cambios que hagamos en la configuración el kernel.

Este proceso tardará bastante tiempo dependiendo la potencia del procesador, cuando finalice la compilación, nos generará 2 paquetes nuevos ubicados en el directorio superior a donde se encuentran las fuentes del kernel. Para instalarlos podemos usar el comando dpkg, synaptic o cualquier otro gestor de paquetes.


dpkg -i linux-headers-4.0.1-beta_1_amd64.deb linux-image-4.0.1-beta_1_amd64.deb

Y con esto estaría todo listo. No hace falta que actualicemos grub, porque el paquete que hemos generado ya se encarga automáticamente.

0 comentarios: