Cuando arrancamos Linux ya tenemos configurado un núcleo de sistema, pero este puede que no contenga soporte para algún dispositivo o funcionalidad que queramos tener. También podemos querer optimizar o actualizar nuestro sistema.
Normalmente la distribución que estemos utilizando nos tendrá preparado y actualizado nuevas actualizaciones ya compiladas del núcleo, pero puede que no sea suficiente para lo que necesitamos.
Entonces tendremos que coger el código fuente del kernel, configurarlo, compilarlo nosotros e instalarlo.
Normalmente las distribuciones de Linux también nos proporcionan las fuentes de núcleo como paquete. Suelen ser las versiones estables. Si queremos una versión más moderna o de desarrollo podemos directamente descargarnos los fuentes de www.kernel.org.
Una vez instalado el paquete o descargado descomprimimos, deberá
colocarse en /usr/src
.
Para configurar los fuentes del núcleo debemos ir a directorio donde se encuentran y ejecutar make con una de las siguientes opciones.
config: nos irá preguntando por consola una por una las opciones del núcleo. Debiendo responder si la queremos o no.
[root@sal]#
make config
scripts/kconfig/conf arch/i386/Kconfig # # using defaults found in .config # * * Linux Kernel Configuration * * * Code maturity level options * Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?]
y
menuconfig: podremos configurar las opciones con una pantalla con menús textuales, moviendo con los cursores entrando en las opciones y seleccionado las opciones.
xconfig: Nos permite utilizar en entorno X Windows.
Con estas presentaciones de opciones se pretende que vayamos seleccionado que dispositivos, protocolos, sistemas de ficheros y otras opciones del núcleo queremos que estén disponibles en nuestro nuevo núcleo. Se nos presentan las opciones ordenadas por grupos:
Code maturity level options: Contiene opciones para que nos muestre o no opciones del núcleo que todavía no están suficientemente probadas. Sobre todo son drivers para nuevos dispositivos.
General setup: Opciones generales, sobre si el núcleo va a tener llamadas de sistema de estándares de UNIX.
Loadable module support: Soporte de módulos en el núcleo. Se abordará en una sección posterior.
Processor type and features: Nos permite compilar el núcleo más específicamente para procesador.
Power management options (ACPI, APM): Soporte para los sistemas de ahorro de energía.
Bus options (PCI, PCMCIA, EISA, MCA, ISA): Soporte para los distintos buses de datos.
Executable file formats: Los distintos formatos de binarios en que pueden encontrarse en las aplicaciones, que el núcleo reconocerá y será capaz de ejecutar.
Device Drivers: Opciones para todos los dispositivos hardware que Linux soporta. Este grupo es muy extenso y esta divido por los tipos de hardware. Suele ser el motivo por el cual recompilamos el núcleo.
File systems: Tipos de sistemas de ficheros que nos soporta el núcleo
Profiling support: Opciones que nos van a permitir analizar el comportamiento del núcleo. Esto se hace normalmente para desarrollo y optimización.
Kernel hacking: Soporte para depurar el núcleo.
Security options: Opciones para sistemas de seguridad que permiten que incluso el superusuario no tenga totalmente el control de la máquina.
Cryptographic options: API para que el núcleo tenga opciones de criptografía. Algunos drivers lo utilizan, por ejemplo los driver para tarjetas y redes wifi.
Library routines: Librerias disponibles para el resto de driver y opciones.
Siempre para cada opción o grupo tenemos una pequeña ayuda que nos indica para que sirve y aconseja que opción es la mejor.
Una vez seleccionadas podemos guardar la configuración en un
fichero a parte o bien al salir nos preguntará si queremos guardarlo
en el fichero .config
que será el utilizado en la
compilación.
Una vez configurada las opciones y guardadas las
opciones en el fichero .config
debemos
compilar para ello ejecutaremos el comando
make con las siguientes opciones:
[root@sal]#
make dep
...
[root@sal]#
make bzImage
...
[root@sal]#
Nos creará el binario del núcleo.
Debian dispone unas herramientas en paquete
kernel-package
, que nos permiten
compilar y crear un
paquete deb con el núcleo compilado ya preparado
para su instalación. Haciendo mucho más sencillo el proceso y
facilitando la instalación en otros sistemas con esta distribución.
Aunque se supone que el núcleo es monolítico, es decir, todas los servicios del núcleo están en un solo bloque, realmente en Linux se pueden cargar dinámicamente módulos.
Esto nos permite durante la ejecución cargar solo los drivers para los dispositivos que estemos utilizando. También hace que el programa principal sea más pequeño y ocupe menos en memoria y sólo se ocupe la memoria cuando estemos utilizando el módulo.
Las distribuciones lo que suelen hacer para tener un núcleo que tenga soporte para cualquier sistema es compilar la mayor parte de las opciones como núcleo, así es poco probable que todo nuestro hardware no este soportado. Aunque se supone que es más óptimo que un driver este en el núcleo principal en vez de como módulo.
Para crear los módulos debemos en el momento de la configuración del núcleo establecer que queremos soporte para módulos, y poner en la configuración las opciones que queremos como módulos. Para ello al establecer una opción como módulo con los distintos sistemas de configuración (config, menuconfig y xconfig) debemos poner una M.
Para compilarlos debemos hacer make modules.
Una vez compilados cada módulo es un archivo binario con
extensión .o
en las versiones 2.4 y
anteriores o .ko
en las versiones
2.6. Los módulos instalados se encuentra en la ruta
/lib/modules/
versión del núcleo.
Una vez que tenemos el binario del núcleo y los módulos tenemos que instalarlo. Para ello tenemos que hacermake modules_install y make install.
Para que el nuevo kernel funcione debemos arrancar el sistema, para ello el gestor de arranque debe estar configurado y reinstalado con el nuevo núcleo.
El gestor de arranque es un pequeño programa instalado en los sectores de arranque que se encarga de arrancar Linux.
Existe dos gestores de arranque más conocidos (para plataformas intel), dependiendo de la distribución:
lilo: Es el gestor más antiguo pero más probado.
Para el nuevo
núcleo debemos configurar su fichero
de configuración /etc/lilo.conf
con el
nuevo núcleo en la etiqueta image y ejecutar lilo.
grub: El gestor nuevo, gráficamente más atractivo y otras mejoras.
El fichero de configuración es grub.conf, donde metemos el nuevo la localización del fichero binario del núcleo en la etiqueta kernel. Después ejecutamos el comando grub.