Compila tu propio kernel

Logo Kernel Linux

Logo Kernel Linux

En los tiempos antiguos, cuando todavía existían disquetes de 3”1/2 y los CD-ROM eran lo máximo en capacidad, instalar un sistema Linux era una odisea. Además de conseguir una distribución para intentar instalarla, debido a la juventud del sistema la estabilidad y soporte de hardware era limitada. Además, había temas de autodetección y carga dinámica de módulos que no terminaban de funcionar ‘de serie’, por lo que muchas veces tocaba instalar el sistema con el soporte mínimo y que funcionaba y después, recompilar el kernel con todos los drivers y módulos concretos para nuestro hardware particular. Como siempre todo tiene su parte positiva, uno aprendía (a la fuerza) un montón sobre su propio hardware y las opciones que había y además al compilar el kernel se optimizaba adaptándose como un guante a nuestro sistema. La parte mala es que había y hay tantas opciones y configuraciones que no era nada sencillo ‘acertar’ con muchas de las opciones.

¿Por qué compilar un kernel?

El kernel es el núcleo, el corazón del sistema operativo. Es el que tiene verdadero acceso al hardware y es el encargado de gestionar esos accesos entre el resto de programas, estableciendo prioridades, asignando recursos… Al estar en contacto directo con el hardware necesita conocer cómo hablar con cada dispositivo que conectamos, esto es lo que hacen los drivers, poner en contacto el mundo físico del hardware con el mundo virtual del software.

Actualmente no suele ser necesario compilar el kernel, ya que casi todo está pre-compilado como módulos y la autodetección funciona prácticamente siempre. Además los equipos actuales suelen ser suficientemente potentes y no creo ni que se note el tema de la supuesta mejora de rendimiento. La única razón que puede llevar a que necesites compilar a mano un kernel es probar alguna característica que no esté todavía en el kernel ‘de fábrica’ que uses en tu distribución. En mi caso, estoy instalando Ubuntu 14.04 en un ordenador Asus-1201HA. Este ordenador es muy pequeño y tiene una autonomía muy elevada, siendo muy silencioso y pesando poco. Lo malo es que tiene un microprocesador muy limitado y con una gráfica integrada muy mal soportada en Linux. En concreto el procesador es un Intel Atom Z520 a 1.33 Ghrz. con la tarjeta GMA500. Mi intención al compilar el kernel es instalar la última versión estable disponible (3.16.3), ya que parece que están haciendo avances en el soporte de drivers de Intel GMA y por otro ver si al recompilar mejora por poco que sea el rendimiento.

Preparando el entorno para compilar

El kernel de Linux, obviamente es independiente de la distribución y puedes descargarlo de http://kernel.org en un tarball (un paquete .tar.xz). Se descomprime y tiene todas las utilidades necesarias para configurarlo y compilarlo al estilo clásico de los programas UNIX (configure && make && make install). Yo lo voy a compilar a la Debian way, es decir, a la manera Debian. La diferencia es que de esta forma voy a obtener un paquete estándar para instalar como cualquier otro y por tanto estará gestionado por el sistema de paquetes de la distribución y proporcionará las dependencias necesarias para otros paquetes. Para elementos vitales del sistema, es mucho mejor instalar programas de esta forma, ya que así mantenemos el control aunque hayamos decidido cambiar programas estándar por otros personalizados por nosotros.

Preparando el entorno

El kernel, en definitiva, no es más que un programa, muy importante, pero igual que el resto, así que para compilarlo vamos a necesitar las mismas utilidades que si queremos desarrollar otros programas. En este caso, el kernel está escrito en C, por lo que necesitamos librerías y compilador para C, además necesitaremos las utilidades propias para crear los paquetes .deb. Afortunadamente en Debian y Ubuntu, es muy sencillo instalarlo todo con cuatro paquetes:

sudo apt-get install kernel-package fakeroot build-essential
sudo apt-get install ncurses-dev
sudo apt-get install qt4-dev-tools

Sí, he dicho cuatro paquetes y he puesto cinco :-D, los dos últimos depende de qué interface se quiera usar para configurar las opciones. Yo instalaría siempre ncurses ya que funciona en una consola de texto y no ocupa mucho y qt4 sólo si hay entorno gráfico ya que ocupa un montón.

Descarga y configuración del kernel

Lo siguiente es obtener el tarball con los fuentes y descomprimirlos en nuestro ordenador. En mi caso, voy a instalar los fuentes en /usr/src, que es donde están los instalados por los paquetes de la distribución. Al ser un directorio del sistema tendremos que hacerlo con permisos de root. Se podrían fabricar los paquetes con un usuario sin privilegios y usar root sólo para instalar los paquetes, cada cual que elija cómo quiere hacerlo.

sudo -s
cd /usr/src
wget -c https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.3.tar.xz
tar xf linux-3.16.3.tar.xz
cd linux-3.16.3

Ahora tocaría configurar el kernel antes de compilarlo. Hay tres utilidades que incluyen los fuentes para configurar las opciones del kernel antes de compilar:

  • make config
  • make menuconfig
  • make xconfig

La primera es una interface de texto que nos va preguntando por cada una de las opciones posibles. Podéis ejecutarlo por curiosidad, pero no es para nada recomendable si queréis mantener cierta salud mental 😉 Las otras dos opciones son equivalentes, muestran la configuración a base de menús gráficos (más o menos). La opción ‘make menuconfig’ usa ncurses, que es una librería para hacer una interface gráfica pero en modo texto. Seguramente al instalar paquetes os habrá aparecido a veces una ventana azul en modo texto para pedir información, eso es ‘ncurses’. La última opción ‘xconfig’ es para usarla sólo en entorno gráfico y depende de la librería qt para mostrar unos menús más amigables. Usad cualquiera de estas dos. El objetivo de estas utilidades es generar un fichero .config con todas las opciones de compilación. En nuestro caso, vamos a reutilizar los ajustes con los que compilaron el kernel actual de nuestra distribución, así partimos de una base más o menos fiable:

cp /boot/config-`uname -r` .config
make xconfig
Configurando el Kernel

Configurando el Kernel

Lo más inteligente es NO TOCAR NADA. Hay una gran cantidad de opciones y muchas de ellas críticas, por lo que modificar cuaquiera sin saber qué se está haciendo hará que vuestro kernel no funcione o lo haga mal. La mayoría de los drivers están puestos como módulos, como mucho podríais habilitarlos para que se incluyan en el kernel (aumenta su tamaño) que quizá mejore algo. Otra cosa que podéis ajustar son las características de vuestro procesador, si lo conocéis bien, para optimizar la compilación. De todas formas la opción más segura es no modificar nada 😀

Compilación y empaquetado con un comando

Una vez cotilleado y curioseado sin tocar mucho, pasamos a la compilación en sí, que puede durar un buen rato…

fakeroot make-kpkg --initrd --append-to-version=-vanilla kernel_image kernel_headers

La opción ‘append-to-version’ es para añadir un sufijo al nombre de la versión, podéis poner cualquier cosa. Durante la compilación saldrán un montón de mensajes muy raros por la consola según va compilando las diferentes partes del kernel. Paciencia y atento al final de la compilación ya que si hay algún error será ahí donde se vea… Bueno, lo de paciencia, si se os ocurre como a mí, lanzar la compilación en un ordenador tan potente como el Atom mío, va a tardar 12h, así que mejor compilarlo en otro ordenador más potente 😀

Instalación y reinicio

Al terminar se habrán generado dos paquetes en el directorio superior (/usr/src/) , uno con el kernel y sus módulos y otro con las cabeceras. Ya solo queda instalarlos igual que cualquier otro paquete:

cd ..
dpkg -i linux-image-3.16.3-vanilla_3.16.3-vanilla-10.00.Custom_i386.deb
dpkg -i linux-headers-3.16.3-vanilla_3.16.3-vanilla-10.00.Custom_i386.deb

shutdown -r now

El último comando hará reiniciar el sistema, así que cruzar los dedos…

Si os estáis preguntando si después de atnto esfuerzo he logrado que mejore el rendimiento de la gráfica, la respuesta es que no. Apenas se nota diferencia de rendimiento. Hice unos tests con GtkPerf y mejora algo, pero no es muy significativo en el uso habitual.

GtkPerf 0.40. Test-Antes - Test-Después

GtkEntry - time:  0,17 - 0,17
GtkComboBox - time:  8,90 - 6,18
GtkComboBoxEntry - time:  6,73 - 4,52
GtkSpinButton - time:  0,90 - 1,03
GtkProgressBar - time:  0,78 - 0,48
GtkToggleButton - time:  0,96 - 0,62
GtkCheckButton - time:  0,64 - 0,39
GtkRadioButton - time:  1,11 - 0,59
GtkTextView - Add text - time:  2,61 - 1,73
GtkTextView - Scroll - time:  1,59 - 0,97
GtkDrawingArea - Lines - time:  6,73 - 3,89
GtkDrawingArea - Circles - time:  8,21 - 4,70
GtkDrawingArea - Text - time:  2,42 - 2,30
GtkDrawingArea - Pixbufs - time:  0,31 - 0,27
 --- 
Total time: 42,07 - 27,88

 

 

 

 

 

Share on Google+0Tweet about this on TwitterShare on Facebook0Share on LinkedIn0Email this to someone