Optimizando (un poco) el kernel

[kernel doc]

Una de las ventajas de Ubuntu es que convierte en algo rápido y, relativamente sencillo, poner a funcionar un ordenador de sobremesa con el conjunto de aplicaciones habituales. Ahora bien para conseguir esto realiza algunas “generalizaciones” que hacen que la configuración adoptada no sea la óptima para nuestro equipo, pudiendo mejorar su rendimiento optimizando entre otras cosas, el núcleo (kernel).

Por omisión cuando instalamos Ubuntu -aquí en la versión 7.10- se instala una modalidad del kernel denominada “genérica”. Este núcleo puede funcionar -al menos en teoría- en cualquier PC x86 compatible; hasta podría funcionar en un 8086 a 4′77 Mhz en versión de línea de comandos, o inclusive, con un gestor de ventanas muy básico. Este punto de partida digamos de “compatibilidad universal” penaliza el rendimiento de nuestro PC, especialmente si es algo antiguo. Veamos como mejorar esta situación.

La alternativa más simple es, si tenemos un AMD o Intel Core 2 de útima generación, instalar la versión de 64 bits. Si no disponemos de uno de estos procesadores, o si hemos instalado la versión “normal” del SO, disponemos de un núcleo “ligeramente” optimizado con sufijo i386; y que conseguimos instalando el meta-paquete linux-image-386:

sudo apt-get install linux-image-386

Reiniciamos Ubuntu y notaremos la diferencia enseguida.

Bien. Pero podemos ir bastante más allá generando un núcleo adaptado a la serie a la que corresponde nuestro procesador. Esto es algo más complicado pero tampoco demasiado:

Guías para compilar el kernel hay muchas; como este how-to, por lo que no me extenderé en ello, solo un breve resumen:

  • Instalar las herramientas necesarias build-esential, libncurses5, libncurses5-dev, kernel-package
  • Instalar las fuentes del último kernel vigente: meta-paquete linux-source
  • Ir al directorio /usrc/src y descomprimir las fuentes linux-source-2.6.22.tar.bz2 que allí se encuentran.
  • Crear un enlace al directorio de fuentes: sudo ln -s /usr/src/linux-source-2.6.22 /usr/src/linux
  • Cambiar a /usr/src/linux
  • Lanzamos la herramienta de configuración, con la configuración por omisión como punto de partida: sudo make oldconfig menuconfig
Si al lanzar sudo make oldconfig menuconfig nos empieza preguntar, significa que no tenemos la configuración por defecto disponible. La copiamos:

/usr/src/linux$ sudo cp /boot/config-2.6.22-9-i386 .config

Aquí si hemos de detenernos y localizar aquellas opciones que hemos de activar o desactivar:

En primer lugar hay que averiguar que procesador tenemos; probablemente ya lo sabes, pero si no, en un terminal:

dmesg | grep CPU:

Que nos devolverá puede que varias líneas, una de ellas indica la CPU:

CPU: Intel Celeron (Coppermine) Steping 0a

[menuconfig]

Tenemos que entrar en el menú de la imagen Processor type and features

  • Seleccionando Processor family elegimos la opción que corresponda a nuestro procesador; en este caso Pentium-III/Celeron (Coppermine)/Pentium-III Xeon
  • Del mismo submenú desmarcamos Generic x86 support y Math Emulation. Estas opciones solo serían necesarias si usaramos un 8086,80286 o 80386 equivalente, cosa poco probable.
  • Si tenemos menos de 4 Gigabytes de memoria en nuestro sistema podemos poner en off la opción High Memory Support.
  • Si tienes un procesador de doble núcleo, como el Core 2 Duo, puedes activar el soporte para usarlos simultaneamente, activando Symetric multi-proccessing support (Esto no lo he probado)
  • Cambia Timer frequency de 250 a 300MHZ (Quizás con un Core 2 venga bien ponerlo a 1000)
  • Si no tienes un portátil Toshiba o Dell puedes desactivar Toshiba Laptop Support y Dell Laptop Support (Menos cosas a cargar en memoria y a comprobar al arrancar)

Podemos ir más allá, eliminando el soporte a dispositivos que no nos son necesarios en nuestro sistema en particular. Así conseguimos un kernel más pequeño y más eficiente, ya que no tiene que chequear y/o cargar código de muchos dispositivos que nunca tendremos. Pero esto ya es más delicado, y corremos el riesgo de que, tras tan larga espera, no funcione el nuevo kernel o algún dispositivo asociado.

[kernel menuconfig video]

Como ejemplo, en la imagen, he desactivado los drivers de las gráficas que no tengo -y nunca tendre porque es un portátil- y dejado el driver trident. Se trata, sobre todo, de eliminar aquellos componentes marcados con un [*] que son los que hacen “engordar” al kernel.

Bien, pues salimos guardando los cambios, y comenzamos la generación del kernel así redefinido:

Hacemos una limpieza previa:

sudo make-kpkg clean, e iniciamos la compilación:

sudo make-kpkg --initrd --append-to-version=-p3 kernel_image kernel_headers

Sustituye p3 (el guión previo es obligatorio) por cualquier cosa que distinga a tu nuevo kernel de los ya existentes en tu equipo. Este proceso, sobre todo si es un ordenador poco potente, puede tardar entre 4 y 6 horas. Así que cuando lances el comando mejor que sea antes de irte a dormir. (Si tienes un Core 2 Duo a 3ghz tardará muchísimo menos como es lógico).

Y a la mañana siguiente….

Te encontrarás con dos paquetes deb en el directorio superior al que estás, /usr/src/. Uno corresponde a la imagen del nuevo kernel y otro a las cabeceras, necesarias por si compilas algo sobre él. Los instalamos:

sudo dpkg -i linux-image-2.6.22.9-p3_2.6.22.9-p3-10.00.Custom_i386.deb

sudo dpkg -i linux-headers-2.6.22.9-p3_2.6.22.9-p3-10.00.Custom_i386.deb

Es recomendable, por último, borrar el enlace simbólico /usr/src/linux.

Ya puedes reiniciar, y este recién creado, será el nuevo núcleo predeterminado.

Aunque no he hecho ningún benchmarking exhaustivo, se nota la diferencia y el portátil ha ganado algo de agilidad. Si bien no cabe esperar maravillas, sobre todo con una gráfica y un procesador tan exiguos.

Diagnóstico y Problemas

Los otros kernels instalados, el generic y en su caso el i386, siguen estando disponibles. Si hay problemas bastará pulsar Esc en la cuenta atrás de Grub para que aparezca el menú y poder seleccionar algunos de estos, arrancando normalmente y con seguridad. Esto hace que operación tan delicada no implique prácticamente ningún riesgo.

Los paquetes deb recién instalados aparecen en Synaptic como linux-image-2.6.22.9-p3 y linux-headers-2.6.22.9-p3 y podremos ya desinstalarlos desde allí comodamente si fuera necesario.

Si quieres dejar el nuevo como núcleo alternativo basta con editar /boot/grub/menu.lst y poner la opción default 0 al número de orden del núcleo con el que queramos arrancar, o ponerlo el primero de la lista.

Driver compilados

Si tienes drivers compilados por tí, hay que volver a compilarlos para que funcionen con el nuevo núcleo.