El kernel es el núcleo del sistema, compilar el kernel no es una tarea sencilla ni mucho menos necesaria. Las distribuciones actuales proveen kernels genéricos preparados para ejecutarse sobre una gran variedad de hardware sin problemas y con una buena colección de módulos para mejorar aun más este soporte.
Sin embargo, compilar el kernel puede ser útil en ciertas circunstancias, como por ejemplo:
- Activar funciones no activadas por defecto en el kernel de la distribución
- Usar opciones experimentales
- Mantener el kernel actualizado
- Optimizar/ajustar el kernel a nuestro hardware
- Por el placer de aprender
Si no necesitas hacer nada de lo anterior te recomiendo que no compiles el kernel manualmente. En mi caso lo he hecho para poder activar el nuevo sistema de ficheros experimental
btrfs, sobre el que hablaremos en el próximo artículo.
El kernel se distribuye en forma de código fuente que podemos encontrar en
http://www.kernel.orgDescargaremos y descomprimimos la versión más actual (la 2.6.31.6 a día de hoy) con la orden:
$ wget -c ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.6.tar.bz2
$ tar xvfj
linux-2.6.31.6.tar.bz2
Si no lo hemos hecho aun, necesitaremos instalar algunos paquetes para poder compilar:
$ sudo aptitude install build-essential libncurses5-dev
Usaremos la configuración del kernel actual como base para la configuración del nuevo:
$ cp /boot/config-`uname -r` ~/linux-2.6.31.6/.config
Ahora lanzaremos el menu de configuración del kernel:
$ cd
~/linux-2.6.31.6/ && make menuconfig
Menu de configuración de las opciones del kernel Nota: si teneis errores diciendo que falta alguna libreria, compilador o utilidad de desarrollo, la instalais y volveis a lanzar el comando.
Nota: existen varios tipos de menús de configuración del kernel, tanto gráficos como en modo texto. En el archivo README del kernel teneis una explicación más detallada.
No voy a alargarme aquí explicando todas las pantallas y opciones pero os recomiendo que os tomeis vuestro tiempo, leais la ayuda y ajusteis al máximo las opciones a vuestro sistema. Un buen consejo es que si no sabemos lo que hace una opción es mejor no tocarla.
- Compilar kernel y módulos
Para compilar el kernel, una vez repasadas las opciones:
$ make
Empezaremos a ver mensajes por pantalla que nos informan del progreso de la compilación. En función de la potencia del hardware y de las opciones marcadas en el kernel este proceso puede tardar mucho rato (en mi sistema tardó 1 hora 40 minutos en compilar el kernel y los módulos con las opciones por defecto).
Para instalarlo ejecutaremos:
$ sudo make install modules_install
Generamos un archivo initrd con:
$ sudo update-initramfs -c -k 2.6.31.6
Los módulos quedarán instalados en
/lib/modules/2.6.31.6, el kernel y el archivo initrd en
/boot/vmlinuz-2.6.31.6 y
/boot/initrd.img-2.6.31.6 respectivamente.
- Actualizar grub1 (Versiones 9.04 y anteriores)
Ahora vamos a crear una entrada en el menu del grub para poder elejir el nuevo kernel:
$ sudo gedit /boot/grub/menu.lst
Recomiendo duplicar la sección de Ubuntu cambiando el número del archivo del kernel y la linea initrd por los nuevos), en mi caso por ejemplo quedó así (resalto los cambios que he hecho en rojo para que lo veais mejor):
[...]
title Ubuntu Jaunty 9.04
root (hd0,1)
kernel /boot/vmlinuz-2.6.28-16-generic root=/dev/sda2 ro splash locale=es_ES vga=792
initrd /boot/initrd.img-2.6.28-16-generic
quiet
title
Linux 2.6.31.6 - manual
root (hd0,1)
kernel
/boot/vmlinuz-2.6.31.6
root=/dev/sda2 ro splash locale=es_ES vga=792
initrd
/boot/initrd.img-2.6.31.6
quiet
[...]
La parte que he añadido es la segunda, y el resto del archivo de configuración del grub se deja sin alterar.
Una vez guardardo el archivo reiniciamos y seleccionamos el nuevo kernel, si todo ha ido bien ejecutamos
uname -r
y veremos algo así:
$ uname -r
2.6.31.6
- Actualizar grub2 (Versiones 9.10 y posteriores)
En el caso de que estemos usando grub2 (versiones Karmic y posteriores de Ubuntu) la forma de modificar el menú de arranque es algo diferente.
Primero editaremos el archivo de opciones generales de grub para asegurarnos de que aparece el menu de selección de sistema operativo y que tenemos tiempo de elegir el nuevo kernel (si en tu sistema ya se muestra el menu de grub2 saltate este paso):
$ gksu gedit /etc/default/grub
Y nos aseguraremos de comentar (poniendo un "#" delante) la linea:
#GRUB_HIDDEN_TIMEOUT=0
Como el nuevo formato de configuración no es muy conocido yo os recomiendo que saqueis una copia de una de las entradas actuales de vuestro grub leyendo el archivo
/boot/grub/grub.cfg. En mi caso las siguientes lineas corresponden a una entrada en el menu:
menuentry "Ubuntu, Linux 2.6.31-14-generic" {
recordfail=1
save_env recordfail
set quiet=1
insmod ext2
set root=(hd0,1)
search --no-floppy --fs-uuid --set fcc3f8cd-346f-4337-b75d-dff91753f1d3
linux /boot/vmlinuz-2.6.31-14-generic root=UUID=fcc3f8cd-346f-4337-b75d-dff91753f1d3 ro quiet splash
initrd /boot/initrd.img-2.6.31-14-generic
}
Nota: los identificadores de particiones y los nombres de archivo serán diferentes en cada caso, usad los vuestros, no copieis estos!Ahora añadiremos la entrada manual copiando la información anterior al final del archivo
/etc/grub.d/40_custom y modificando los nombres del archivo del kernel y del initrd por los que hemos creado nostotros:
$ gksu gedit /etc/grub.d/40_custom
En mi caso al final del archivo añadí estas lineas (resalto los cambios que he hecho en rojo para que lo veais mejor):
menuentry "Linux 2.6.31.6 - manual" {
recordfail=1
save_env recordfail
set quiet=1
insmod ext2
set root=(hd0,1)
search --no-floppy --fs-uuid --set fcc3f8cd-346f-4337-b75d-dff91753f1d3
linux /boot/vmlinuz-2.6.31.6 root=UUID=fcc3f8cd-346f-4337-b75d-dff91753f1d3 ro quiet splash
initrd /boot/initrd.img-2.6.31.6
}
Como veis lo único que he cambiado es la etiqueta de la entrada, la referencia al archivo del kernel y al archivo del initrd.
Finalmente actualizaremos el grub2 con la orden:
$ sudo update-grub
Debemos ver que aparece el nuevo kernel que hemos introducido, reiniciamos y seleccionamos el nuevo kernel, si todo ha ido bien ejecutamos
uname -r
y veremos algo así:
$ uname -r
2.6.31.6
http://www.kernel.orgComo compilar el kernel de ubuntuCompilar el kernel (2.6.25)