16 nov. 2009

Compilar el kernel (2.6.31.6)

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:
  1. Activar funciones no activadas por defecto en el kernel de la distribución
  2. Usar opciones experimentales
  3. Mantener el kernel actualizado
  4. Optimizar/ajustar el kernel a nuestro hardware
  5. 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.

  • Instalar las fuentes
El kernel se distribuye en forma de código fuente que podemos encontrar en http://www.kernel.org

Descargaremos 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


  • Configurar las opciones
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


  • Más información
http://www.kernel.org
Como compilar el kernel de ubuntu

  • Artículos relacionados
Compilar el kernel (2.6.25)

5 comentarios :

winninglero dijo...

Hasta que porfin encontre como compilar el kernel de linux desde las mismas fuentes de kernel.org y actuales (2.6.31) en ubuntu (en mi caso xubuntu) aunque tratare de compilar el kernel 2.6.32 (y no la x.31) para ver si porfin tengo soporte a ext4 en xubuntu 8.04 lts.
GRacias de antemano por el turorial.

Jorge Andrés Alvarez Oré dijo...

Hize lo que ponias (pero con el sources del kernel 2.6.32)pero me trabo en esto:

sudo make install modules_install

me sale esto:
sh /home/jorge/linux-2.6.32/arch/x86/boot/install.sh 2.6.32 arch/x86/boot/bzImage \
System.map "/boot"
In order to use the new kernel image you have just installed, you
will need to reboot the machine. First, however, you will need to
either make a bootable floppy diskette, re-run LILO, or have GRUB
installed.

Checking for ELILO...No

Checking for LILO...No

Checking for SILO...No

Checking for PALO...No

Should I make a bootdisk? (y/N) n

WARNING: Your system is probably unbootable now. After correcting any
problems, rerun this script with the command `mkboot -i'.
make[1]: *** [install] Error 1
make: *** [install] Error 2

despues cuando hago:

sudo update-initramfs -c -k 2.6.32

y me sale esto:
update-initramfs: Generating /boot/initrd.img-2.6.32
Cannot find /lib/modules/2.6.32
update-initramfs: failed for /boot/initrd.img-2.6.32

Datos de mi sistema:
*Xubuntu 8.04 lts (totalmente actualizado al 141209) con ext3,
*Kubuntu 9.10 con ext4
*Grub2 (cuando instale el xubutnu 8.04 despues de kubuntu 9.10 le puse que no instalara grub, pues ya tenia grub2)

*La única razon para tratar de compilar el kernel 2.6.32 es para tener soporte (montarlo) a mi particion ext4 de kubuntu 9.10, si sabes de otra manera de tener aceso a esa particion sin necesidad de instalar un nuevo kernel dimelo porfavor.

fosco_ dijo...

Para compilar los modulos ejecuta: sudo make modules_install

Luego revisa que te ha generado una imagen del kernel en /boot (lo distinguirás por que debe ser el unico de version 2.6.32)

Revisa tambien que el grub se ha actualizado para soportar el nuevo kernel, en caso de que no sea hazlo tu a mano tam como explica el articulo.

Suerte

Anónimo dijo...

che existe una pagina que te podes bajar los debs de los kernels mas nuevos

yo me baje el 2.6.32.2 y me anda barbaro en mi amd64 ahi les dejo la pagina muchos no lo saben

http://kernel.ubuntu.com/~kernel-ppa/mainline/

fosco_ dijo...

Buen aporte,aunque nunca está de más saber compilar un kernel manualmente. Un saludo.