Suponiendo que disponemos del código fuente de un núcleo de Linux bajo el directorio /usr/src/linux/, a continuación se listan las acciones que deben realizarse para construir un nuevo núcleo binario e instalarlo en el sistema.
Eliminar cualquier resto de ficheros de compilación en el núcleo, para recompilarlo desde cero.
[root@yoda]# cd /usr/src/linux [root@yoda]# make mrproper
Configurar el nuevo núcleo. Existen tres herramientas de configuración alternativas: una basada en texto puro (make config), otra en un entorno de ventanas simulado en modo texto y (make menuconfig) finalmente otra en modo gráfico (make xconfig). Si utilizamos ésta última:
[root@yoda]# make xconfig
obtenemos una ventana que ejecuta un script escrito en Tcl/Tk que visualiza un menú como el que aparece en la Figura 4.1. El menú principal de configuración del núcleo.
Como vemos, la ventana muestra multitud de botones, que ocultan a su vez menús de configuración organizados temáticamente. Al pulsar cada botón nos aparece el menú correspondiente, en donde configuraremos el soporte que deseamos para nuestro nuevo núcleo. La Figura 4.2. Uno de los submenús de configuración del núcleo. muestra, como ejemplo, el menú de configuración del tipo de procesador para el que se compilará el núcleo y sus características principales.
En esta figura aparecen buena parte de las alternativas de configuración que podemos encontrarnos en todos los submenús: las opciones que aparecen en gris están habilitadas, porque son incompatibles con otras que hemos escogido (posiblemente en otros submenús). Las opciones que aparecen en negrita (opciones selecionables) pueden ser de tres tipos fundamentalmente:
Opciones "sí/módulo/no". En este tipo de opciones podemos elegir entre tres alternativas: y, indicando que queremos incluir ese soporte en el binario principal del nuevo núcleo; m, indicando que queremos el soporte pero como módulo de núcleo; y finalmente n, indicando que no queremos ese soporte. Como vemos en la figura, en algunas de las opciones no existe la posibilidad de compilarla como módulo.
Opciones múltiples. En estas opciones podemos elegir entre un conjunto de alternativas. Por ejemplo, en el tipo de procesador podemos elegir entre 16 tipos distintos. El menú con dichos tipos aparece al pulsar el botón correspondiente del submenú.
Valor numérico. Existen opciones que permiten introducir un valor numérico concreto, que luego se pasará a los ficheros fuente involucrados como una constante de preproceso.
Cuando hemos acabado de configurar todas las opciones del núcleo que necesitamos para nuestro nuevo núcleo, hemos de pulsar el botón de salvar los cambios (botón "Save and Exit" en la Figura 4.1. El menú principal de configuración del núcleo.) y salir de la herramienta de configuración.
Comprobar el número de versión. Antes de iniciar la compilación, es conveniente asegurarse de que el núcleo tendrá un número de versión distinto del que tenemos instalado actualmente, puesto que mientras no nos aseguremos que el nuevo núcleo funciona correctamente no es buena idea deshacerse (o sobreescribir) el antiguo. Para ello editaremos el fichero /usr/src/linux/Makefile y observaremos sus primeras líneas, donde se muestra la información sobre el número de versión:
VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 20 EXTRAVERSION = -20.9custom
Por ejemplo, con esta información se generaría un núcleo cuya versión sería 2.4.20-20.9custom. En el caso de que coincidiera con un núcleo actualmente instalado y que no queremos sobreescribir, deberíamos modificar sólo el campo EXTRAVERSION. De hecho, el Makefile ya nos propone un sufijo denominado "custom" que no se encuentra en ningún núcleo "oficial".
Este número de versión (en el ejemplo, 2.4.20-20.9custom) será el sufijo de todos los ficheros del directorio /boot/ que dependen del núcleo concreto (vmlinuz, initrd, System.map, config y module-info), así como el nombre del directorio donde residirán los módulos de núcleo, debajo del directorio /lib/modules/.
Compilar el núcleo. Para compilar el binario principal y los módulos del núcleo hay que ejecutar las siguientes órdenes:
[root@yoda]# make dep [root@yoda]# make bzImage [root@yoda]# make modules
Instalar el núcleo. Los ficheros binarios del nuevo núcleo (binario principal y módulos) residen todavía en ciertos subdirectorios de /usr/src/linux/ y no en los lugares definitivos donde el sistema podrá encontrarlos. Para llevar a cabo esta acción hay que ejecutar:
[root@yoda]# make modules_install [root@yoda]# make install
que, siguiendo el ejemplo anterior, instalará los módulos de núcleo en el directorio denominado /lib/modules/2.4.20-20.9custom/ y creará los siguientes ficheros y enlaces simbólicos en el directorio /boot/:
config-2.4.20-20.9 initrd-2.4.20-20.9.img module-info-2.4.20-20.9 System.map-2.4.20-20.9 vmlinux-2.4.20-20.9 vmlinuz-2.4.20-20.9 module-info -> module-info-2.4.20-20.9 vmlinuz -> vmlinuz-2.4.20-20.9 System.map -> System.map-2.4.20-20.9
Además de realizar estas acciones, la instalación también realiza la configuración necesaria para que nuestro gestor de arranque (lilo o grub) sepa de la existencia del nuevo núcleo para que podamos arrancarlo en el próximo reinicio.
Reiniciar. Para que el núcleo nuevo sea cargado y ejecutado debemos reiniciar el sistema y asegurarnos de que en la lista de arranque de lilo o grub elegimos este núcleo y no el antiguo. En el caso de que algo salga mal (el núcleo no arranca, ciertos servicios no funcionan, etc.), deberemos reiniciar el sistema con el núcleo antiguo y probablemente volver al punto 2 para revisar la combinación de opciones con las que hemos configurado el nuevo núcleo.
Eliminar los ficheros objeto. Una vez el núcleo nuevo funciona correctamente y posee todas las funcionalidades que queríamos de él, podemos eliminar los objetos del directorio /usr/src/linux/, puesto que no los necesitamos más. Para ello ejecutaremos lo siguiente:
[root@yoda]# cd /usr/src/linux [root@yoda]# make clean
La diferencia entre esta orden y la del punto 1 es que en este caso no se borran los ficheros de configuración del núcleo, con lo que si volvemos a ejecutar make xconfig tendremos en pantalla las mismas opciones con las que compilamos el núcleo la última vez.
Como alternativa, también podemos guardarnos esta configuración en un fichero, para poder recuperarla más tarde. Esto se realiza mediante los botones "Store Configuration to File" y "Load Configuration from File" de la ventana principal de configuración (ver Figura 4.1. El menú principal de configuración del núcleo.). Si elegimos esta opción (guardarnos el fichero de configuración) podemos incluso borrar el directorio completo de los fuentes, puesto que siempre podremos volver a obtenerlo más tarde si es necesario.