Compilar Kernel de Linux

Linux Kernel

 

¿Qué es el Kernel?

Como su nombre lo indica, es el núcleo del sistema. El Sistema Operativo es un programa que gestiona y administra a todos los demás programas llamados Software. El Sistema Operativo es el intermediario entre el Software y el Hardware. Muchas personas creen que Linux es el Sistema Operativo, lo cual es una idea errónea, Linux es solo el Kernel, el Sistema Operativo es Debian, RedHat, OpenSUSE, etc, quienes utilizan a Linux como su Kernel, quien junto a otras aplicaciones GNU hacen que todo funcione.

Para poder verificar las versiones del Kernel y efectuar las descargas para actualizarlo, podemos dirigirnos a la siguiente página web “http://www.kernel.org/

Existen dos tipos de Kernel en Linux los cuales veremos a continuación:

1.    Monolítico: Este tipo de Kernel engloba todos los servicios del sistema, posee un rendimiento mayor que el de un micronucleo. Esto es posible porque todas las funcionalidades posibles están integradas con el sistema. Cualquier cambio efectuado sobre cualquier servicio requiere la re-compilación del Kernel y el reinicio del sistema para aplicar los cambios.
2.    Modular: Un Kernel modular tiene compilados archivos como objetos, los cuales el Kernel puede cargar o remover bajo demanda. Estos modulos se encuentran en /lib/modules. Lo positivo del Kernel Modular es que no hace falta reiniciarlo al efectuar algún cambio. No tiene sentido que el Kernel se comunique con todos los periféricos, por lo cual lo que en otros Sistemas Operativos se llaman drivers, pero en Linux se desarrollo una interface adecuada para crear los módulos que cumplan las mismas funciones, pudiendo estos ser añadidos en tiempo de ejecución.

IMPORTANTE: La parte monolítica se carga en el arranque y está activa en todo momento, sin embargo los módulos únicamente se activan cuando se requiere utilizar ese dispositivo en concreto.

Para poder administrar los diferentes módulos, tenemos un paquete llamado modutils, las aplicaciones contenidas dentro de este paquete son:

•    lsmod: Lista los módulos cargados
•    rmmod: Elimina un modulo.
•    insmod: Inserta un modulo.
•    modprobe: Inserta los módulos y las dependencias listadas en modules.dep.
•    modinfo: Lista información del autor, tipo de licencia y parámetros de los módulos.

Algunos módulos son dependientes de otros módulos. Estas dependencias se sitúan en una base de datos plana situada en /lib/modules/<versión de Kernel>/modules.dep.  Este archivo es generado por el comando depmod, el cual es lanzado al iniciar la PC.

Para cargar cualquier modulo listado en modules.dep o modules.conf podemos utilizar el comando modprobe. El archivo modules.conf es consultado por los IRQ y los IO ports, pero generalmente se encarga de almacenar los alias de los dispositivos, así en lugar de referirnos al dispositivo por el nombre genérico, podemos utilizar el alias.

Ejemplo: si tenemos una placa de red que se llama Realtec RTL8100B(L), mediante el modules.conf, le podremos asignar el nombre eth0 y llamarla por el mismo lo cual es más fácil de memorizar.

Versiones del Kernel:

Cada versión posee 3 dígitos los cuales sirven para saber con qué tipo de Kernel se está trabajando.
–    El primer número siempre indica la versión principal, solo cambia cuando se produce un cambio significativo en el núcleo.
–    El segundo número hace referencia a cambios menos significativos y si la versión es estable o de desarrollo. Si el número es par es estable y si es impar es de desarrollo.
–    La tercera y última marca nuevas versiones dentro de otra versión, pero solo muestra que se han corregido errores de programación llamados bugs.

Cómo y por qué compilar un Kernel:

Compilar el Kernel es algo bastante habitual, es el mecanismo por el cual los archivos fuente, escritos en modo texto a un lenguaje de programación que el procesador pueda leer llamados binarios. Como el Kernel es un programa, como cualquier programa primero debe compilarce para crear los binarios que permitan la ejecución del programa. Para esto es necesario un compilador, que en el caso de Linux es utilizado el llamado gcc, quien chequea la sintaxis del código.
Compilar el Kernel sirve para tener un buen rendimiento entre el Software y el Hardware.

Pasos para la compilación del Kernel:

Lo primero que deberemos hacer es ingresar a la web mencionada anteriormente para descargar la última versión del Kernel disponible http://www.kernel.org/.  Debemos descomprimir los archivos fuente en el directorio “/usr/src/” que es donde se debe hacer el proceso de compilación. Luego de descomprimido el Kernel, creamos un enlace simbólico a /usr/src/linux ya que algunas aplicaciones se referencian a este directorio. Luego de acceder al nuevo directorio y modificamos las opciones que debe llevar el nuevo Kernel. Para esto tenemos 3 opciones, las cuales voy a enumerar, cada una es más visual que la anterior:
1.    make config: esto maneja las configuraciones en modo texto y funciona en base a preguntas que se van efectuando y que nos permiten 3 opciones para responder a las mismas “y” para compilar como parte del Kernel, “m” para compilar como módulo y para no compilar deberemos contestar “n”.
2.    make menuconfig (recomendada): Basado en modo texto, funciona en base a una ventana de menúes bastante gráfica y con ayudas.
3.    make xconfig: Basado plenamente en una interface gráfica.

Ejecutando el comando recomendado se desplegará un menú de opciones en las cuales podremos modificar la compilación de nuestro Kernel. Las mismas son:

–    []: Significa que puede ser agregado o no al Kernel.
–    <>: Que se puede agregar  M como módulo o * incluirlo en el Kernel.

Luego de marcar todo lo que necesitemos, vamos a compilar dicha selección, ejecutando los siguientes comandos:

•    make dep: Este comando es necesario pues crea las dependencias para los módulos marcados.
•    make clean: Borra todas las configuraciones anteriores.
•    make bzImage: Este comando lo que hace es comprimir el Kernel que creamos.

Ya realizados estos pasos solo queda compilar los módulos que hemos definido.
•    make modules
•    make modules_install: Crea los directorios e instala los módulos del paso anterior

Con todos estos pasos realizados solo queda copiar el Kernel al directorio correspondiente y editar el gestor de arranque. Para copiar el Kernel en el directorio correcto, debemos saber que el lugar en el cual queda la imagen del nuevo Kernel compilado es “/usr/src/linux/arch/i386/boot/” con el nombre bzImage. Por lo tanto debemos ejecutar el comando “cp bzImage /boot/vmlinuz-x.x.x-1”, deberemos reemplazar las x por la versión correspondiente y el -1 hace referencia a que es el nuevo Kernel en el caso que el anterior posea el mismo nombre. Eso se debe hacer para no pisar el Kernel anterior el cual se encuentra funcional y puede servirnos en caso de que algo falle.
Ahora para editar el gestor de arranque, vamos a añadir la siguiente entrada:

En el caso de LILO: Archivo de configuración : /etc/lilo.conf

image=/boot/vmlinuz-2.6.8-1
label=linuxnuevo # aquí va el nombre que quiera ponerle.
read-only
initrd=/boot/initrd-2.6.8-1.img
append=opciones # aquí van las opciones que necesiten. Por ejemplo:
append=”hdc=ide-scsi” (esto sería para una grabadora)

Si se construyo una imagen nueva initrd hay que informarle a LILO que la utilice. Ejecutar el comando lilo sin ninguna opción y esto hará que el programa lea la configuración del archivo de configuración. Si hay un error será indicado.

En el caso de GRUB: Archivo de configuración: /boot/grub/menu.lst

boot=/dev/hda
default=0
timeout=10

title Debian GNU/Linux (2.6.8)
root (hd0,1)
kernel /boot/vmlinuz-2.6.8 ro root=LABEL=/
initrd /boot/initrd-2.6.8.img

title Debian GNU/Linux (2.6.8-1)
root (hd0,1)
kernel /boot/vmlinuz-2.6.8-1 ro root=LABEL=/
initrd /boot/initrd-2.6.8-1.img

title windows
root (hd0,0)
chainloader +1
Como pueden ver agregamos lo que figura marcado en negrita. Al reiniciar la PC deberían figurar las 3 opciones que se muestran de arranque.

Con eso ya tenemos el nuevo Kernel completamente funcional.

Espero les sea de utilidad. Les dejo el Link de descarga.

Un saludo.

Author: Nicolas Ventre

Virtualization architect with more than 15 years implementing complex environments. Security Specialist and Linux instructor