El kernel es el núcleo del sistema operativo. Es responsable por manejar la memoria, asegurar controles de seguridad, redes, acceso a disco, y más. Tradicionalmente, FreeBSD usaba un kernel monolítico: un gran programa que soportaba una lista fija de dispositivos, donde, para cambiar su comportamiento, era necesario compilarlo para adaptarlo a nuestras necesidades. En la actualidad se trata de un kernel modular. La mayoría de las funcionalidades del kernel FreeBSD están contenidas en módulos que pueden ser cargados en el kernel dinámicamente a medida que sea necesario.

Pero, a pesar de esta flexibilidad, compilar el kernel tiene muchas ventajas. Por ello en este artículo voy a explicar cómo compilar un kernel personalizado en FreeBSD 10.



El proceso de compilar e instalar un kernel personalizado es una tarea que consume mucho tiempo, pero que puede traer beneficios a un sistema FreeBSD. A diferencia del kernel genérico (GENERIC), que debe soportar una gran cantidad de hardware, un kernel personalizado puede ser destripado para sólo proveer soporte al hardware del sistema donde está corriendo. Esto trae un número de beneficios, tales como:

  • Menor tiempo de boot. Dado que el kernel sólo debe buscar el hardware del sistema, el tiempo que toma el inicio del sistema disminuye.
  • Menor uso de memoria. Un kernel personalizado utiliza menor cantidad de memoria que el kernel GENERIC si se remueven características y drivers de dispositivos no utilizados. Esto es importante porque el código del kernel permanece residente en memoria física en todo tiempo, impidiendo que la memoria que utiliza pueda ser aprovechada por las aplicaciones.
  • Soporte de hardware adicional. Un kernel personalizado puede tener soporte para dispositivos que noe stán presentes en el kernel genérico.

El código fuente de un sistema FreeBSD se encuentra dentro del directorio /usr/src. El directorio /usr/src/sys contiene un subdirectorio para cada arquitectura soportada: amd64, i386, ia64, pc98, powerpc, y sparc64. Cada una posee un directorio de configuración conf, que contiene la configuración del kernel GENERIC para esa arquitectura.

FreeBSD utiliza un único archivo de configuración para cada kernel donde se configuran todos los dispositivos del sistema. A diferencia de Linux, no hay ninguna clasificación o jerarquía de dispositivos más que los comentarios en el archivo de configuración. Por ello compilar un kernel es una tarea mucho más sencilla y menos propensa a errores. Esta simpleza enamora, esto es KISS.

Para compilar un kernel personalizado no se deben hacer ediciones en el archivo GENERIC. En lugar de ello se debe copiar el archivo con un nombre diferente y luego editar la copia. Esto se hace para que una actualización del sistema no sobrescriba el contenido personalizado. La convención para el nombre del kernel es usar sólo letras mayúsculas, por ejemplo: MYKERNEL.

Por otro lado, como el proceso de compilación involucra varios comandos, y puede ser necesario realizarlo sobre múltiples servidores, voy a crear un script que realice dicha tarea. Además voy a crear un directorio /root/scripts/kernel donde guardar este script junto con el archivo de configuración del kernel personalizado.

Entonces, para comenzar, crear el directorio /root/scripts/kernel:

root@fbsd10:~ # mkdir /root/scripts
root@fbsd10:~ # mkdir /root/scripts/kernel

Copiar el archivo de configuración del kernel GENERIC con el nombre MYKERNEL:

root@fbsd10:~ # cp /usr/src/sys/amd64/conf/GENERIC /root/scripts/kernel/MYKERNEL

Como el sistema actual posee la arquitectura amd64, la ruta al archivo de configuración es /usr/src/sys/amd64/conf/GENERIC. Modificar esta ruta para que refleje la arquitectura de cada sistema.

Cambiar al directorio /root/scripts/kernel:

root@fbsd10:~ # cd /root/scripts/kernel/

Ya tenemos una copia del archivo de configuración del kernel para amd64:

root@fbsd10:~/scripts/kernel # ll
total 17
-rw-r--r--  1 root  wheel  13709 Oct 30 13:49 MYKERNEL

Ahora es necesario crear el script de compilación. Abrir el archivo compilar_instalar_MYKERNEL.sh con cualquier editor de texto:

root@fbsd10:~/scripts/kernel # vi compilar_instalar_MYKERNEL.sh

El contenido del script es el siguiente:

#!/bin/csh

set DIR_ACTUAL=`pwd`
set FECHAHORA_ACTUAL=`date '+%Y-%m-%d_%H-%M-%S'`

cd /usr/src && \
make clean && \
make -j3 buildkernel KERNCONF=MYKERNEL > buildkernel.$FECHAHORA_ACTUAL && \
make installkernel KERNCONF=MYKERNEL > installkernel.$FECHAHORA_ACTUAL && \
make  clean && \
echo Listo

cd $DIR_ACTUAL

 

Este script cambia al directorio base del código fuente del sistema, compila el nuevo kernel especificando el nombre del archivo de configuración personalizado, y por último instala el nuevo kernel asociado al archivo de configuración personalizado (copia el nuevo kernel en /boot/kernel/kernel y guarda el anterior en /boot/kernel.old/kernel).

A continuación se debe realizar la tarea más importante de todo el proceso: configurar el kernel personalizado. Esto requiere conocer con exactitud qué hardware posee el sistema. Es posible revisar la salida de dmesg, o el contenido del archivo /var/run/dmesg.boot, para determinar qué hardware fue encontrado durante el proceso de probing durante el inicio. Tambien es posible utilizar la herramienta pciconf, la cual posee una salida más verbosa (pciconf -lv).

Una vez que se ha determinado qué hardware posee el sistema, editar el archivo de configuración MYKERNEL:

root@fbsd10:~/scripts/kernel # vi MYKERNEL

El formato del archivo de configuración del kernel es extremadamente simple. Cada línea contiene una palabra clave que representa un dispositivo o subsistema, un argumento, y una breve descripción. Todo texto seguido a un caracter # es un comentario, y es ignorado.

Para eliminar el soporte para un dispositivo o subsistema, insertar un # al comienzo de la línea. No agregar o eliminar numerales en líneas que no se entiendan o no se sepa qué hacen. Es fácil eliminar soporte para un dispositivo u opción y terminar con un kernel roto que no bootea. En caso de duda, es mejor dejar soporte.

Las descripciones en los comentarios indican las dependencias entre módulos y subsistemas. Adicionalmente existen notas para cada arquitectura, las cuales se encuentran en el mismo directorio donde está ubicado el archivo de configuración bajo el nombre NOTES. Las notas independientes de la arquitectura se encuentran en /usr/src/sys/conf/NOTES.

Una vez finalizada la configuración de nuestro kernel personalizado, crear un link simbólico al archivo de configuración dentro del directorio específico de la arquitectura:

root@fbsd10:~/scripts/kernel # ln -s /root/scripts/kernel/MYKERNEL /usr/src/sys/amd64/conf/MYKERNEL

Otorgar permiso de ejecución al script:

root@fbsd10:~/scripts/kernel # chmod +x compilar_instalar_MYKERNEL.sh

Compilar el kernel:

root@fbsd10:~/scripts/kernel # ./compilar_instalar_MYKERNEL.sh

Finalmente, reiniciar:

root@fbsd10:~/scripts/kernel # reboot

Si hemos hecho todo bien, el sistema iniciará con nuestro kernel personalizado:

root@fbsd10:~ # uname -a
FreeBSD fbsd10 10.0-RELEASE-p12 FreeBSD 10.0-RELEASE-p12 #1: Tue Nov 11 11:14:10 ART 2014     root@fbsd10:/usr/obj/usr/src/sys/MYKERNEL  amd64

Si algo sale mal, consultar la siguiente página del manual: 9.6. If Something Goes Wrong.

Fuente

FreeBSD Handbook - Chapter 9. Configuring the FreeBSD Kernel


Tal vez pueda interesarte


Compartí este artículo