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
rm linux
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.
Planeta Linux
#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 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 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:
por:
Suerte!!
#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?