Si bueno ya se que no es nada original y probablemente sea uno de los temas que en más ocasiones se repite en los foros de Linux. De hecho tampoco es que existan generalmente muchos motivos para cocinarte tu propio núcleo. En la actualidad la mayoría de distribuciones dan un soporte bastante avanzado y equilibrado en sus compilaciones de kernel. Pero bueno, siempre se puede intentar hacer mejor ¿no?

Las únicas razones que realmente justificarían compilar tu propio kernel serían:

  • Dar soporte a características o dispositivos que no están compilados en tu distribución.
  • Mejorar el rendimiento de tu equipo optimizando algunos ajustes, como el tipo de procesador.
  • Reducir el tiempo de carga, eliminando módulos que no necesitáis en el equipo.
  • Corregir problemas de seguridad e inestabilidad del sistema.

Realmente no es que se obtenga una ganancia sustancial de rendimiento, ni se reduzca el tiempo de arranque mucho más de unos segundos. Pero todo es relativo y quizás en algunos casos merezca la pena, como en equipos muy especializados o poco potentes.

Obtener la última versión del kernel

No tiene ningún misterio, os dirigís a http://www.kernel.org y descargais la versión que más os interese, generalmente la última estable. En este post utilizaré la 3.9.4, así que simplemente si sigues este HOW-TO sustituye la versión por la que estés utilizando. Por supuesto, todos los comandos descritos los ejecutaremos con la cuenta de root.

cd /usr/src
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz

Preparar la instalación

Prepararemos la instalación siguiendo el estandard Linux copiando el fichero descargado en /usr/src/. Descomprimimos el fichero. Se encuentra empaquetado con «xz» así que sino lo tienes deberás de instalarlo. Luego desempaquetamos con «tar. En el ejemplo utilizamos un «pipe» para descomprimirlo en un solo paso.

xz -dc linux-3.9.4.tar.xz | tar xv

Esto nos crea una carpeta /usr/linux/linux-3.9.4. Es interesante no realizar las operaciones directamente en este directorio y realizar un enlace simbólico a un nuevo directorio /usr/src/linux en donde trabajaremos. De este modo en futuras versiones del kernel simplemente cambiaremos a donde apunta el enlace y si tenemos varias versiones instaladas no nos confundiremos de directorio.

ln -s /usr/src/linux-3.9.4 /usr/src/linux

Configurar el kernel

Existen varias formas de hacerlo, por consola, por medio de la librería ncurses, cómo entorno de menús, con un entorno GUI… Siempre me ha parecido lo más cómodo utilizando la clásica opción menuconfig ya que es bastante ordenada y cómoda, además de no necesitar un servidor gráfico corriendo. Para ello necesitareis tener instalada la librería ncurses. En mi Debian libncurses.

También será necesario que tengais instalados el compilador, la utilidad make, etc. La lista es generalmente la siguiente: GCC, make, ncurses, ncurses-dev, bin86, libc6, libc6-dev, binutils. Puede que la lista sea más extensa según vuestra distribución, pero no os preocupéis. Durante el proceso os avisará cuando falte una librería. Cuando suceda buscáis el paquete a incluir y repetís el proceso.

Lo más sencillo es partir de una configuración que sepamos que funciona. Por ejemplo la del kernel que estáis corriendo. Aunque sea de una versión anterior contiene una configuración válida y funcional. Lo único que hay que hacer es adaptar dicha configuración al nuevo kernel.

En el directorio /boot existe una copia de dicho fichero de configuración para cada kernel alojado, por lo que podemos copiar dicho fichero al directorio de compilación. El fichero por defecto donde se guarda la configuración del kernel cuando compilamos es .config, por lo que le daremos ese nombre.

cp /boot/config-3.2.0-4-amd64 /usr/src/linux/.config

A continuación adaptaremos ese fichero de configuración a nuestra version, con el siguiente comando:

make silentoldconfig

De este modo carga la anterior configuración y la aplica a nuestra nueva versión mostrando por pantalla unas cuantas preguntas para adaptar el fichero al nuevo kernel. Yo siempre elijo la opción por defecto dado que vamos a revisar la configuración de todos modos.

make menuconfig

Ahora es cuando se desplegará el menú con varios miles de opciones (literalmente) con los que personalizar nuestra máquina. Lleva bastante tiempo y experimentación así que te recomiendo que realices las pruebas con un ordenador potente, dado que es bastante difícil que tu primer kernel arranque si has modificado muchas opciones y vas a pasar un buen rato compilando.

Lo ideal es que empieces poco a poco y te vayas familiarizando primero con las opciones del procesador. Debes conocer bien tu máquina para saber qué módulos necesitas compilar y de cuales prescindir. Para ello comandos como lspci, lsusb o lshw te daran mucha información sobre los componentes.

Una vez tengas soltura te darás cuenta que cuanto más conozcas tu máquina y más tiempo pierdas configurando el kernel menos tiempo tardarás en finalizar el proceso de compilación. 😉

¡Compilando!

Por fin tras varias ¿horas? recorriendo menús y probablemente con algo de dolor de cabeza ha llegado la hora de compilar.

Deberemos de compilar en dos fases. Primero el núcleo que será lo que carguemos directamente cuando arranque el ordenador; y luego los módulos, partes de código que se almacenan en disco y se cargan después del kernel. En un sola linea:

make bzImage && make modules

Llevará tiempo, según el ordenador hasta varias horas, así que ten paciencia y búscate algo que hacer mientras.

A instalar

Bueno, después de un buen rato compilando estamos deseando probar nuestro kernel, así que vamos ver qué pasos llevar a cabo para colocar cada parte en su ubicación. Suele ser bastante sencillo.

Primero instalamos los módulos en su ubicación con make modules_install, operación que no llevará mucho tiempo y ubicará los ficheros en /lib/modules/3.9.4 y generará el archivo de dependencias modules.dep.

En segundo lugar ubicaremos el kernel en el directorio /boot, generaremos el archivo initrd y enlazaremos todo en nuestro gestor de arranque. Puede resultar extraño que primero instalemos los módulos y luego realizamos la parte del kernel, pero tiene sentido. Para realizar las tres operaciones antes descritas tenemos el objetivo make install que las realiza automaticamente y deja listo nuestro sistema para probar nuestro kernel.

Por supuesto, sino tuvieramos los módulos ubicados en su ubicación no podríamos generar el fichero initr y tendríamos que generarlos nosotros a mano, por este motivo lo realizamos después.

En cualquier caso nada te impide no realizar make install o make modules_install y realizar las operaciones manualmente. Es un buen ejercicio para conocer el funcionamiento de un kernel. 😉

El archivo de dependencias, una vez ubicados los archivos de los módulos en su ubicación se genera con:

depmod 3.9.4.

Y si por un casual alguna vez tenemos que generar el archivo initrd es tan fácil como ejecutar:

mkinitramfs -o /boot/initrd.img-3.9.4 3.9.4

Y en unos segundos generará un nuevo fichero. Asegúrate que tu gestor de arranque apunta a este fichero o de lo contrario no funcionará.

Después de estos pasos nuestro sistema ya estará listo para su primer arranque.

Arrancando el sistema

Bueno, una vez veas el menú de tu gestor de arranque aparecerá la nueva entrada para el kernel recién compilado y comenzará la carga. A partir de ahora verás (si todo va bien) cómo carga el kernel, el initrd y a continuación cada uno de los módulos necesarios. Observa y anota los mensajes de error que puedas obtener y revisa /var/log/messages. Es posible que otros componentes del sistema, como los drivers propietarios de la tarjeta gráfica, necesiten ser compilados para la nueva versión del kernel. Esa es otra tarea a realizar.

También es posible que el sistema simplemente ni arranque, no encuentre algún módulo crítico y no pase de las primeras etapas. Bueno, simplemente es cuestión de observar los errores y buscar en internet. Vuelta a tu antigua versión de kernel y a reconfigurar y recompilar.

Si realizas muchos cambios en la configuración quizás sera recomendables que elimines cualquier rastro de anteriores compilaciones con make clean antes de volver a compilar. Esto eliminará cualquier librería y te dejará sólo las fuentes del kernel sin librerías, como si empezaras nuevamente. Tranquilo, tu archivo de configuración sigue ahí.

Pero si lo que quieres realmente es borrar todo, incluso tu archivo de configuración puedes usar make mrproper.

Trucos

  • ¡Nunca desinstales tu anterior kernel! Será tu última salvación y nadie está libre de equivocarse aunque sea muy experimentado. Casi seguro que deberás de compilar alguna vez más tu kernel así que la manera más fácil será arrancar de nuevo con la antigua versión, analizar los fallos y vuelta a compilar.
  • Puedes acelerar la velocidad de compilación con make -j. Dado que hoy en día la mayoría de procesadores son multicores puede utilizar varios de ellos o todos a la vez en la compilación.
  • Generalmente los módulos se compilan con un montón de información de debug, por lo que suelen ocupar mucho espacio en disco. Si cuando vayas a instalarlos utilizas make INSTALL_MOD_STRIP=1 modules_install los ficheros «adelgazarán» sensiblemente, y sobre todo cuando crees el initrd verás como su tamaño se reduce en un 75% o más.
  • Asegurate de cargar los módulos de tu controladora de disco y los sistemas de ficheros de tu sistema. De lo contrario no pasarás de las primeras etapas dado que no podrás acceder al disco, ni al kernel ni a los módulos.
  • No cambies demasiadas opciones y módulos las primeras veces. Simplemente ajusta las características del nuevo kernel para optimizarlo a tu arquitectura y poco a poco con la experimientación podrás eliminar aquellos módulos que no necesitas. Sino perderás mucho tiempo con pruebas y compilaciones.
Comparte si te ha gustado

Autor:
Última actualización:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

De acuerdo con lo dispuesto en el Reglamento (UE) 2016/679 de 27 de abril de 2016, consiento que mis datos sean tratados bajo la responsabilidad de Oscar Gascón Arjol para recibir respuesta a consultas. publicación de comentarios del blog y que las conserve mientras haya un interés mutuo para ello. Me doy por informado que tengo derecho a revocar este consentimiento en cualquier momento y a ejercer los de acceso, rectificación, portabilidad y supresión de mis datos y los de limitación y oposición al tratamiento dirigiéndome por email a me@oscargascon.es. También estoy informado de que puedo reclamar ante la autoridad de control a www.agpd.es.