Compilar el kernel a lo Debian


Tengo que admitir que Debian facilita algunas tareas de administración como el proceso de compilado del kernel. A primera vista, el procedimiento luce similar al que vimos de compilar el kernel a lo tradicional pero lo que lo hace diferente es que terminarás con un archivo .deb con la imagen del kernel, de forma que será más fácil instalar la misma imagen en otras computadoras con solo instar el archivo .deb.

Otra ventaja de compilar el kernel en Debian es que no tienes que preocuparte por hacer la imagen intramfs o hacer cambios en el gesto de arranque, ya que Debian lo hace automágicamente.

Entonces, creo que puedes estar interesado en compilar el kernel a lo Debian, así que veamos cómo hacerlo…

Requisitos

Como vas a compilar un kernel, necesitarás algunos archivos y compiladores. También necesitarás ncurses para desplegar diálogos en una consola, y para crear un archivo .deb necesitarás el paquete kernel-package. En Debian puedes instalar todo esto escribiendo:

aptitude install build-essential libncurses5-dev kernel-package

Directorio de trabajo

Es común usar el directorio /usr/src/ al momento de compilar el kernel, controladores y módulos. Entonces, entra a ese directorio:

cd /usr/src/

Procedimiento

Necesitarás las fuentes del kernel para compilarlo. Estas pueden obtenerse desde los repositorios de la distribución o desde kernel.org directamente. En Debian tendrás un archivo tar en el directorio /usr/src/ al instalar el siguiente paquete:

aptitude install linux-source-2.6.30

Si quieres descargarlas desde kernel.org sería algo como como esto:

wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.bz2

Ahora descomprime el archivo tar:

tar xjfv linux-2.6.32.2.tar.bz2
De existir por compilaciones previas, borra el enlace linux:
rm linux
Ahora crea un enlace al directorio descomprimido. Si descargaste las fuentes desde Debian esto sería:
ln -s linux-source-2.6.30 linux

Si las descargaste desde kernel.org, debes escribir:

ln -s linux-2.6.32.2 linux

Entra al directorio linux:

cd linux

Si has compilado otros kernels es buena idea limpiar todo antes de comenzar a compilar el kernel nuevo:

make mrproper

Procede ahora a configurar las opciones de tu kernel. Para hacer esto, puedes usar make config (una interfaz interactiva pero algo molesta), make menuconfig (basada en mcurses). Yo sugiero usar la segunda opción:

make menuconfig

Luego de que hayas seleccionado las opciones, escoge Exit para escribir el archivo .config.

A lo Debian

Aquí es donde las cosas son diferentes del procedimiento original porque compilarás tu kernel y sus módulos pero el resultado de la compilación quedará en un archivo .deb. Digamos que quieres compilar una imagen de Linux con los archivos initramfs y headers, la orden y opciones para hacer esto es:

make-kpkg --revision lnv1 --initrd kernel_image kernel_headers

Donde:

Option Description
--revision lnv1
Número de versión del archivo .deb generado
--initrd
Incluir la imagen initramfs y sus scripts de instalación
kernel_image
Generar un archivo .deb con la imagen del kernel
kernel_headers
Generar un archivo .deb con los headers del kernel
kernel_source
Generar un archivo .deb con el código fuente del kernel

Para instalar tu nuevo kernel compilado solo instala el archivo .deb como sigue:

dpkg -i /usr/src/linux-image-2.6.32.2-mundungus_lnv1_i386.deb

Esto instalará la imágenes del kernel y el initrd en el directorio /boot y ejecutará en utilitario update-grub automáticamente, de forma que la nueva imagen del kernel aparecerá listada en el menú de grub la próxima vez que reinicies tu computadora.

,

  1. #1 by Luis Gallardo on 28/10/2010 - 9:16

    @LucMAN kernel_source te crea un .deb co el código fuente del kernel como bien comentas, pero debería se suficiente con los headers del kernel para compila otros programas/drivers. Ya actualicé la tabla…

    Gracias por el aporte!!

  2. #2 by LucMAN on 27/10/2010 - 10:34

    Hola! fijate que en la tabla te faltó agregar:

    Option Description
    kernel_source Paquete de código fuente del kernel, requerido para algunos drivers.

    Saludos!

  3. #3 by Luis Gallardo on 26/10/2010 - 9:28

    @Anónimo He acortado un poco la salida para concentramos en lo que falla. El problema está relacionado a que estás usando un libc-dev algo viejo (por ejemplo de Lenny) para la versión de kernel que estás intentando compilar, como lo comentan aquí http://cakebox.homeunix.net/wordpress/?p=100

    Según allí bastaría con editar el archivo Documentation/lguest/Makefile cambiando:

    all: lguest

    por:

    all:

    Suerte!!

  4. #4 by Anónimo on 26/10/2010 - 5:35

    Gracias por el aporte Luis, segui todos los pasos y luego de mandar a debian a hacer el paquete de la imagen…

    #make-kpkg –revision lnv1 –initrd kernel_image kernel_headers

    (te copio aca abajo lo que quedo en el buffer del terminal virtual)

    CC sound/drivers/mpu401/snd-mpu401-uart.mod.o
    LD [M] sound/drivers/mpu401/snd-mpu401-uart.ko
    CC sound/drivers/mpu401/snd-mpu401.mod.o
    LD [M] sound/drivers/mpu401/snd-mpu401.ko
    CC sound/drivers/snd-dummy.mod.o
    LD [M] sound/drivers/snd-dummy.ko
    CC sound/drivers/snd-virmidi.mod.o
    LD [M] sound/drivers/snd-virmidi.ko
    CC sound/pci/ac97/snd-ac97-codec.mod.o
    LD [M] sound/pci/ac97/snd-ac97-codec.ko
    CC sound/pci/snd-intel8x0.mod.o
    LD [M] sound/pci/snd-intel8x0.ko
    CC sound/pci/snd-intel8x0m.mod.o
    LD [M] sound/pci/snd-intel8x0m.ko
    CC sound/soundcore.mod.o
    LD [M] sound/soundcore.ko
    IHEX firmware/acenic/tg1.bin
    IHEX firmware/acenic/tg2.bin
    IHEX firmware/adaptec/starfire_rx.bin
    IHEX firmware/tigon/tg3.bin
    IHEX firmware/tigon/tg3_tso.bin
    IHEX firmware/tigon/tg3_tso5.bin
    IHEX firmware/3com/typhoon.bin
    IHEX firmware/kaweth/new_code.bin
    IHEX firmware/kaweth/trigger_code.bin
    IHEX firmware/kaweth/new_code_fix.bin
    IHEX firmware/kaweth/trigger_code_fix.bin
    HOSTCC firmware/ihex2fw
    H16TOFW firmware/edgeport/boot.fw
    H16TOFW firmware/edgeport/boot2.fw
    H16TOFW firmware/edgeport/down.fw
    H16TOFW firmware/edgeport/down2.fw
    IHEX firmware/edgeport/down3.bin
    IHEX2FW firmware/keyspan_pda/keyspan_pda.fw
    IHEX2FW firmware/keyspan_pda/xircom_pgs.fw
    make[1]: se sale del directorio `/usr/src/linux-2.6.36′
    /usr/bin/make ARCH=i386 \
    -C Documentation/lguest
    make[1]: se ingresa al directorio `/usr/src/linux-2.6.36/Documentation/lguest’
    cc -m32 -Wall -Wmissing-declarations -Wmissing-prototypes -O3 -U_FORTIFY_SOURCE lguest.c -o lguest
    lguest.c:21:25: error: sys/eventfd.h: No existe el fichero o el directorio
    lguest.c:46:30: error: linux/virtio_rng.h: No existe el fichero o el directorio
    lguest.c: In function ‘wait_for_vq_desc’:
    lguest.c:715: error: ‘VRING_DESC_F_INDIRECT’ undeclared (first use in this function)
    lguest.c:715: error: (Each undeclared identifier is reported only once
    lguest.c:715: error: for each function it appears in.)
    lguest.c: In function ‘create_thread’:
    lguest.c:1026: warning: implicit declaration of function ‘eventfd’
    lguest.c: In function ‘get_tun_device’:
    lguest.c:1481: error: ‘IFF_VNET_HDR’ undeclared (first use in this function)
    lguest.c:1486: error: ‘TUNSETOFFLOAD’ undeclared (first use in this function)
    lguest.c:1487: error: ‘TUN_F_CSUM’ undeclared (first use in this function)
    lguest.c:1487: error: ‘TUN_F_TSO4’ undeclared (first use in this function)
    lguest.c:1487: error: ‘TUN_F_TSO6’ undeclared (first use in this function)
    lguest.c:1487: error: ‘TUN_F_TSO_ECN’ undeclared (first use in this function)
    lguest.c: In function ‘setup_tun_net’:
    lguest.c:1568: error: ‘VIRTIO_RING_F_INDIRECT_DESC’ undeclared (first use in this function)
    lguest.c: In function ‘setup_rng’:
    lguest.c:1811: error: ‘VIRTIO_ID_RNG’ undeclared (first use in this function)
    make[1]: *** [lguest] Error 1
    make[1]: se sale del directorio `/usr/src/linux-2.6.36/Documentation/lguest’
    make: *** [debian/stamp/build/kernel] Error 2
    debian#

    No tengo ni idea de por donde empezar a “ver” que sucede… alguna sugerencia?

(No será publicado)