Cómo compilar un núcleo de Linux …

1 07 2008

Un núcleo ( kernel ) es el componente central de muchos sistemas operativos. Sus responsabilidades incluyen el manejo de los recursos del sistema ( la comunicación entre hardware y software ). Podemos decir que es una capa importante en la arquitectura del sistema para la compatibilidad de los componentes que tenemos como herramientas para nuestro trabajo. Existen varios núcleos los que se diferencian tanto en estructura como en rendimiento, como por ejemplo el núcleo de BSD, el de Linux de Torvalds, el Hurd de GNU, el de Windows, etc …

En ocasiones perseguimos optimizar un sistema construyéndolo con las opciones más específicas posibles. Quizás por razones de limitaciones de recursos, o la necesidad de habilitar alguna opción específica que por defecto no viene construida en la mayor parte de las distribuciones, la configuración de los núcleos se presenta como una opción viable para la personalización y conocimiento de los componentes de nuestro ordenador.

Este artículo cubrirá solamente cómo configurar y construir un núcleo de Linux para las distribuciones GNU/Linux existentes.

Veremos algunas propuestas que podemos tener en cuenta como una guía para llevar a cabo esta tarea.

Identificación de Hardware y Software

Primeramente necesitamos tener conocimiento de los componentes del sistema donde correrá nuestro núcleo. Esto puede variar tanto desde un conocimiento mínimo como hasta uno detallado de nuestro ordenador, tanto para los componentes de hardware como de software ya que existen muchas funcionalidades que necesitan ser habilitadas en el núcleo para ejecutar determinados programas en un modo de operación conocido como “espacio de núcleo” ( kernel space ). Existen programas que nos pueden ayudar para averiguar el hardware existente en nuestra pc.

$ lspci
00:00.0 Host bridge: Intel Corporation Mobile 945GM/PM/GMS/940GML  ...
00:01.0 PCI bridge: Intel Corporation Mobile 945GM/PM/GMS/940GML ...
00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) ...
...
..
00:1f.0 ISA bridge: Intel Corporation 82801GBM (ICH7-M) LPC ...
00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM ...
00:1f.3 SMBus: Intel Corporation 82801G (ICH7 Family) ...
01:00.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility X1400
03:00.0 Ethernet controller: Broadcom Corporation BCM4401-B0 100Base-TX ...
03:01.0 FireWire (IEEE 1394): Ricoh Co Ltd Unknown device ...
03:01.1 Generic system peripheral [0805]: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro ...
..
.
0b:00.0 Network controller: Broadcom Corporation Dell Wireless 1390 WLAN Mini-PCI Card (rev 01)

$ lsusb

Bus 005 Device 001: ID 1d6b:0002
Bus 004 Device 005: ID 413c:8126 Dell Computer Corp.
Bus 004 Device 007: ID 0a5c:4503 Broadcom Corp.
Bus 004 Device 004: ID 0a5c:4500 Broadcom Corp.
Bus 004 Device 006: ID 0a5c:4502 Broadcom Corp.
Bus 004 Device 001: ID 1d6b:0001
Bus 002 Device 003: ID 16d8:6803
Bus 002 Device 001: ID 1d6b:0001
Bus 003 Device 001: ID 1d6b:0001
Bus 001 Device 001: ID 1d6b:0001

Veremos los elementos más importantes para tomar en consideración y cómo podemos identificarlos en estas herramientas que usamos ( lspci y lsusb ). Necesitamos identificar el chipset de la placa madre ( Host bridge ), la tarjeta de audio que tiene ( Audio device ), la tarjeta de video ( VGA controller ), la tarjeta de red alámbrica ( Ethernet controller ), si existe alguna otra interfaz de red , en este caso es inalámbrica ( Network controller ), la capacidad de la memoria de nuestro sistema ( podemos verla con el comando free ), la capacidad del disco duro que tenemos ( con el comando fdisk -l ) y algún otro periférico específico que estemos usando ( tarjetas capturadoras de video, convertidores, etc … )

Proceso de configuración del núcleo

Una vez que conozcamos lo que tenemos en nuestra pc pasaremos a configurar el núcleo para luego poder construirlo. El mecanismo de configuración opera de forma tal que se separa el código del núcleo de su configuración considerándola un estado más del núcleo. Imagínense que pudiéramos tener varias configuraciones con solo portar los archivos de configuración tendríamos listo varios núcleos. Los archivos de configuración almacenan símbolos y estados para ellos. Los estados le dicen al núcleo cómo se debería compilar esa funcionalidad, como un módulo M, como un elemento interno Y o si no se debería construir N. Debemos tener en cuenta a la hora de construir el núcleo que si construimos alguna funcionalidad como un módulo ganaremos en espacio físico del mismo, pero perderemos en tiempo de carga ya que los módulos se demoran en cargar. Por otra parte incorporando las funcionalidades nos limita desde el punto de vista del espacio, algo que no puede ser factible en escenarios de dispositivos empotrados.

Para comenzar necesitamos elegir qué forma usaremos para configurarlo .

Forma Directa

Ya indirectamente sugerimos una, aunque es más complicada : podemos editar manualmente los archivos de configuración y habilitar las opciones que querramos. Bastará con cualquier editor de texto.

Ncurses

Tenemos otra forma de acceder a la configuración a través de una interfaz visual. Podemos usar una en modo consola basada en las bibliotecas ncurses que posibilitan hacer aplicaciones en modo texto con una alta interactividad.

# apt-get install libncurses5-dev

Para levantar la interfaz vamos al directorio donde reside el código fuente del núcleo que vayamos a compilar y ejecutamos:

# make menuconfig

Veremos una interfaz similar a esta en nuestra terminal:

Gconfig o Xconfig

Para aquellos que deseen usar interfaces visuales más interactivas existen opciones para ello. Podemos construir nuestro núcleo usando Gconfig basada en bibliotecas de GTK o con Xconfig construidas con las bibliotecas visuales de X directamente.

# make gconfig

Configuración del núcleo

En esta guía nos centraremos en las funcionalidades principales que harán que nuestro sistema corra correctamente en nuestra máquina. Nos concentraremos en los dispositivos que nombramos al principio : Procesador, memoria … etc … Existen guías dedicadas para la instalación de computadoras específicas, con configuraciones específicas. Ello no será tratado a continuación. Trataremos de brindar una guía de donde ubicar los recursos más utilizados así como de una filosofía útil de configuración y manejo de la construcción de un núcleo de linux a través de sus interfaces. Puede ser que en ocasiones se nos quede algún elemento por habilitar tras su construcción propiciando que nuestro sistema no arranque, o carezca de algunas funcionalidades. A medida que se configuren más núcleos se irá perfeccionando esta técnica y aprendiendo de sus componentes.

La configuración en las interfaces se presenta como una jerarquía de elementos por la cual podemos ir navegando y activando las funcionalidades que querramos utilizar. Existen en ocasiones interrelaciones que no podemos obviar y que en ocasiones nos pueden traer problemas si no conocemos bien el dispositivo que querramos habilitar. Trae además una ayuda contextual que nos puede asistir para decidir si incluimos o no algún recurso en nuestro núcleo.

Siempre que empecemos es aconsejable localizar los elementos críticos de nuestro sistema, habilitarlos y luego ir en busca de la optimización ( si es esto lo que queremos ). Debemos notar que algunos elementos vienen habilitados por defecto, generalmente los de uso más común. En la jerarquía están clasificados según su rol en el sistema, basta simplemente buscar los que queramos configurar y trabajar sobre ellos, por ejemplo:

Processor type and features // Procesador y memoria
Networking // Soporte para sistemas con conectividad ( redes, bluetooth, infrarojo, etc ... )
Device Drivers // Soporte para controladores de dispositivos ( discos SATA, sonido, gráficos, dispositivos I/O, etc ... )
Filesystems // Involucra los sistemas de archivos que usaremos ( ext, vfat, ntfs, nfs , etc ... )

Parches y actualizaciones

En algunas ocasiones en el proceso de desarrollo de un núcleo surgen momentos para los cuales es necesario crear elementos autocontenidos que presentan mejoras, actualizaciones, resoluciones de fallas, o adiciones de funcionalidades nuevas al código. Estos elementos se denominan parches. Básicamente contienen una estructura similar a esta:

parche.patch

Index: archivo
===================================================================
--- archivo
+++ archivo

Texto constante

- Texto a eliminar
+Texto a añadir

Como notarán trabaja mediante un proceso de eliminación y adición de elementos. Al aplicarse sobre un archivo este localizará el cambio y lo aplicará. Para aplicarlo ejecutamos el siguiente comando asumiendo que nos encontramos en la carpeta del archivo a ser aplicado:

# patch < parche.patch

Construcción

Luego de la configuración de un núcleo pasaremos a su construcción. Un núcleo termina siendo un archivo compactado que se ubica generalmente junto a los archivos de arranque del sistema y es llamado por una entrada en el listado del gestor de arranque que utilicemos. Mostraremos dos vías aquí para su construcción la vía tradicional para todas las distribuciones y la vía de Debian utilizando make-kpkg

Vía estándar

Comenzaremos con un comando que creará las interdependencias necesarias en nuestro árbol de núcleo y lo limpiará de construcciones previas:

# make dep && make clean

Luego pasaremos a construir el archivo contenido:

# make bzImage

Luego pasamos a construir los módulos del núcleo:

# make modules

Copiaremos entonces nuestro núcleo construido en el directorio de arranque ( por lo general /boot )

# cp arch/i386/boot/bzImage /boot/nuevo_nucleo

Instalamos los módulos en /lib:

# make modules install

Instalamos el núcleo:

# make install

Luego construimos una imagen initrd. Por sus siglas en inglés es un sistema de archivos temporal usado por el kernel Linux durante el inicio del sistema. Es usado típicamente para hacer los arreglos necesarios antes de que el sistema de archivos raíz pueda ser montado.

# cd /boot
# mkinitrd -o initrd.img-nuevo_nucleo nuevo_nucleo

En este caso usamos el gestor de arranque GRUB. Editamos el archivo /boot/grub/menu.lst y añadimos nuestro módulo para que sea usado en un futuro arranque:

title           Núcleo Nuevo compilado
root            (hd0,1) // Debe ir el identificador de la partición donde está la raíz del sistema
kernel          /nuevo_nucleo root=/dev/sda3 ro i386 // Debe ir el nombre del dispositivo de la raíz
initrd          /boot/initrd.img-nuevo_nucleo
savedefault
boot

Y listo …

Vía Debian

El equipo de Debian provee de un mecanismo más simple para la construcción de un núcleo con el comando make-kpkg:

# apt-get install kernel-package

Cuando tengamos configurado el núcleo simplemente ejecutamos:

# make-kpkg --initrd kernel_image

Su resultado será un archivo .deb ubicado en la carpeta padre a la actual y que al instalarlo nos ubicará el núcleo construido en su ubicación final y nos creará automáticamente su llamado desde el menu.lst. Si consultan el manual del comando verán que puede ser usado para generar cabeceras, números de revisión, versiones, etc …

Una vez instalado veremos que una copia del archivo de configuración terminará en /boot/config. Si quisiéramos aplicar esa u otra configuración para otro código de un núcleo utilizando la interfaz ncurses por ejemplo usamos:

# cp /boot/config.nucleo_nuevo /usr/src/linux-source/.config
# make oldconfig menuconfig

Debemos tener en cuenta que cualquier modificación que podamos hacer a nivel de núcleo puede traer implicaciones en el funcionamiento de nuestro sistema operativo. Los procesos que corren a este nivel son considerados críticos es por eso que debemos tener cuidado con lo que habilitemos y lo que no. La ayuda contextual sirve de mucho para ello. Veremos que con más práctica iremos dominando esta técnica.

Referencias:

Wikipedia
Guía de compilación

Advertisements

Actions

Information

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s




%d bloggers like this: