Cómo compilar un kernel

Configurar el núcleo

Cada distribución tiene algunas herramientas específicas para construir un kernel personalizado a partir de las fuentes. Este artículo trata sobre la compilación de un kernel en un sistema Debian (Etch). Describe cómo construir un kernel personalizado utilizando las últimas fuentes de kernel no modificadas de www.kernel.org (Vanilla Kernel) para que seas independiente de los núcleos proporcionados por tu distribución. También muestra cómo parchear las fuentes del kernel si necesita funciones que no están allí.

¡No emito ninguna garantía de que esto funcionará para usted!

1 Nota Preliminar

Describiré dos formas de compilar un nuevo kernel. Usando el primer método, terminará con un paquete kernel .deb que se puede instalar en el sistema y que puede compartir con otros e instalar en otros sistemas Debian Etch.

El segundo método es compilar un kernel de la manera «tradicional». De esta manera funciona en cualquier distribución de Linux, pero por supuesto, no termina con un paquete kernel .deb.

2 Creación de un paquete .deb del núcleo

Este capítulo muestra cómo construir un núcleo y terminar con un paquete .deb que puede instalar y compartir con otros.

2.1 Instalar los paquetes necesarios para la compilación del kernel

Primero actualizamos nuestra base de datos de paquetes:

apt-get update

Luego instalamos todos los paquetes necesarios como este:

apt-get install kernel-package ncurses-dev fakeroot wget bzip2 build-essential

2.2 Descargar las fuentes del kernel

A continuación, descargamos nuestro kernel deseado a /usr/src. Ir www.kernel.org y seleccione el núcleo que desea instalar, por ejemplo, linux-2.6.21.3.tar.bz2 (puede encontrar todos los núcleos 2.6 aquí: http://www.kernel.org/pub/linux/kernel/v2.6/). Luego puedes descargarlo a /usr/src así:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2

Luego desempaquetamos las fuentes del kernel y creamos un enlace simbólico de Linux al directorio de fuentes del kernel:

tar xjf linux-2.6.21.3.tar.bz2
ln -s linux-2.6.21.3 linux
cd /usr/src/linux

2.3 Aplicar parches a las fuentes del kernel (opcional)

A veces, necesita controladores para hardware que no es compatible con el nuevo kernel de forma predeterminada, o necesita soporte para técnicas de virtualización o alguna otra tecnología de última generación que aún no ha llegado al kernel. En todos estos casos, debe parchear las fuentes del kernel (siempre que haya un parche disponible …).

Ahora supongamos que ha descargado el parche necesario (lo llamo parche.bz2 en este ejemplo) a /usr/src. Así es como lo aplica a las fuentes de su núcleo (todavía debe estar en el directorio /usr/src/linux):

bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1

El primer comando es solo una prueba, no hace nada a sus fuentes. Si no muestra errores, puede ejecutar el segundo comando que realmente aplica el parche. ¡No lo hagas si el primer comando muestra errores!

También puede aplicar preparches de kernel a sus fuentes de kernel. Por ejemplo, si necesita una función que solo está disponible en el kernel 2.6.22-rc3, pero aún no se han publicado las fuentes completas para este kernel. En su lugar, está disponible un parche-2.6.22-rc3.bz2. Puede aplicar ese parche a las fuentes del kernel 2.6.21, pero no al kernel 2.6.21.1 o 2.6.21.2, etc. Esto se explica en http://kernel.org/patchtypes/pre.html:

Los parches previos son el equivalente a las versiones alfa para Linux; viven en los directorios de prueba en los archivos. Deben aplicarse usando la utilidad patch(1) al código fuente de la versión completa anterior con un número de versión de 3 partes (por ejemplo, el parche previo 2.6.12-rc4 debe aplicarse a las fuentes del kernel 2.6.11, no , por ejemplo, 2.6.11.10.)

Entonces, si desea compilar un kernel 2.6.22-rc3, debe descargar las fuentes del kernel 2.6.21 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) en el paso 3 en lugar del kernel 2.6.21.3!

Así es como aplica el parche 2.6.22-rc3 al kernel 2.6.21:

cd /usr/src 
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1

2.4 Configurar el núcleo

Es una buena idea usar la configuración de su núcleo de trabajo actual como base para su nuevo núcleo. Por lo tanto copiamos la configuración existente a /usr/src/linux:

make clean && make mrproper
cp /boot/config-`uname -r` ./.config

entonces corremos

make menuconfig

que abre el menú de configuración del kernel. Vaya a Cargar un archivo de configuración alternativo y elija .config (que contiene la configuración de su núcleo de trabajo actual) como el archivo de configuración:

Configurar el núcleo

Guardar como archivo .config

Luego navegue por el menú de configuración del kernel y haga sus elecciones. Cuando haya terminado y seleccione Salir, responda la siguiente pregunta (¿Desea guardar su nueva configuración del kernel?) con Sí:

Guardar nueva configuración del Kernel

2.5 Construir el núcleo

Para construir el kernel, ejecute estos dos comandos:

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

Después de –append-to-version=, puede escribir cualquier cadena que lo ayude a identificar el kernel, pero debe comenzar con un signo menos (-) y no debe contener espacios en blanco.

Ahora sea paciente, la compilación del kernel puede tomar algunas horas, dependiendo de la configuración de su kernel y la velocidad de su procesador.

2.6 Instalar el nuevo kernel

Después de la compilación exitosa del kernel, puede encontrar dos paquetes .deb en el directorio /usr/src.

cd /usr/src
ls -l

En mi sistema de prueba, se llamaban linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (que contiene el núcleo real) y linux-headers-2.6.21.3-custom_2.6.21.3- custom-10.00.Custom_i386.deb (que contiene los archivos necesarios si desea compilar módulos kernel adicionales más adelante). Los instalo así:

dpkg -i linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb

(Ahora puede incluso transferir los dos archivos .deb a otros sistemas Debian Etch e instalarlos allí exactamente de la misma manera, lo que significa que no tiene que volver a compilar el kernel allí).

Eso es todo. El archivo de configuración del gestor de arranque GRUB /boot/grub/menu.lst se ha modificado automáticamente y se ha creado un ramdisk para el nuevo kernel en /boot.

Ahora reinicie el sistema:

shutdown -r now

En el indicador de arranque, seleccione su nuevo kernel (debe estar seleccionado de forma predeterminada):

Arranque en el nuevo Kernel

Si todo va bien, debería aparecer el nuevo núcleo. Puede verificar si realmente está usando su nuevo kernel ejecutando

uname -r

Esto debería mostrar algo como

2.6.21.3-custom

Si el sistema no se inicia, reinícielo y seleccione su antiguo núcleo en el indicador de inicio. Ahora puede volver a intentar compilar un kernel que funcione. No olvide eliminar la(s) estrofa(s) del kernel que no funciona de /boot/grub/menu.lst.

3 Construyendo un kernel de la manera tradicional

Este capítulo describe un enfoque diferente que se puede utilizar en cualquier sistema Linux (aparte de detalles como la creación de un ramdisk o la actualización del gestor de arranque). Por supuesto, no terminará con un paquete kernel .deb.

3.1 Instalar los paquetes necesarios para la compilación del kernel

Primero actualizamos nuestra base de datos de paquetes:

apt-get update

Luego instalamos todos los paquetes necesarios como este:

apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential

3.2 Descargar las fuentes del kernel

A continuación, descargamos nuestro kernel deseado a /usr/src. Ir www.kernel.org y seleccione el núcleo que desea instalar, por ejemplo, linux-2.6.21.3.tar.bz2 (puede encontrar todos los núcleos 2.6 aquí: http://www.kernel.org/pub/linux/kernel/v2.6/). Luego puedes descargarlo a /usr/src así:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.3.tar.bz2

Luego desempaquetamos las fuentes del kernel y creamos un enlace simbólico de Linux al directorio de fuentes del kernel:

tar xjf linux-2.6.21.3.tar.bz2
ln -s linux-2.6.21.3 linux
cd /usr/src/linux

3.3 Aplicar parches a las fuentes del kernel (opcional)

A veces, necesita controladores para hardware que no es compatible con el nuevo kernel de forma predeterminada, o necesita soporte para técnicas de virtualización o alguna otra tecnología de última generación que aún no ha llegado al kernel. En todos estos casos, debe parchear las fuentes del kernel (siempre que haya un parche disponible …).

Ahora supongamos que ha descargado el parche necesario (lo llamo parche.bz2 en este ejemplo) a /usr/src. Así es como lo aplica a las fuentes de su núcleo (todavía debe estar en el directorio /usr/src/linux):

bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1

El primer comando es solo una prueba, no hace nada a sus fuentes. Si no muestra errores, puede ejecutar el segundo comando que realmente aplica el parche. ¡No lo hagas si el primer comando muestra errores!

También puede aplicar preparches de kernel a sus fuentes de kernel. Por ejemplo, si necesita una función que solo está disponible en el kernel 2.6.22-rc3, pero aún no se han publicado las fuentes completas para este kernel. En su lugar, está disponible un parche-2.6.22-rc3.bz2. Puede aplicar ese parche a las fuentes del kernel 2.6.21, pero no al kernel 2.6.21.1 o 2.6.21.2, etc. Esto se explica en http://kernel.org/patchtypes/pre.html:

Los parches previos son el equivalente a las versiones alfa para Linux; viven en los directorios de prueba en los archivos. Deben aplicarse usando la utilidad patch(1) al código fuente de la versión completa anterior con un número de versión de 3 partes (por ejemplo, el parche previo 2.6.12-rc4 debe aplicarse a las fuentes del kernel 2.6.11, no , por ejemplo, 2.6.11.10.)

Entonces, si desea compilar un kernel 2.6.22-rc3, debe descargar las fuentes del kernel 2.6.21 (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) en el paso 3 en lugar del kernel 2.6.21.3!

Así es como aplica el parche 2.6.22-rc3 al kernel 2.6.21:

cd /usr/src 
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.22-rc3.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.22-rc3.bz2 | patch -p1

3.4 Configurar el núcleo

Es una buena idea usar la configuración de su núcleo de trabajo actual como base para su nuevo núcleo. Por lo tanto copiamos la configuración existente a /usr/src/linux:

make clean && make mrproper
cp /boot/config-`uname -r` ./.config

entonces corremos

make menuconfig

que abre el menú de configuración del núcleo. Vaya a Cargar un archivo de configuración alternativo y elija .config (que contiene la configuración de su núcleo de trabajo actual) como el archivo de configuración:

Luego navegue por el menú de configuración del kernel y haga sus elecciones. Cuando haya terminado y seleccione Salir, responda la siguiente pregunta (¿Desea guardar su nueva configuración del kernel?) con Sí:

3.5 Compile e instale el kernel

Para compilar el kernel, ejecute estos comandos:Publicidad

make all
make modules_install
make install

Ahora sea paciente, la compilación del kernel puede tomar algunas horas, dependiendo de la configuración de su kernel y la velocidad de su procesador.

3.6 Pasos posteriores a la instalación

El nuevo kernel ya está instalado, pero aún necesitamos un ramdisk para nuestro nuevo kernel (¡de lo contrario, lo más probable es que el sistema no arranque!), y debemos informarle al cargador de arranque GRUB sobre nuestro nuevo kernel.

Primero, hacemos esto:

depmod 2.6.21.3
apt-get install yaird

Luego creamos un ramdisk con el siguiente comando:

mkinitrd.yaird -o /boot/initrd.img-2.6.21.3 2.6.21.3

La configuración de GRUB es muy fácil en Debian Etch. Todo lo que tenemos que hacer es correr

update-grub

Esto detectará el nuevo kernel y ramdisk y actualizará /boot/grub/menu.lst por nosotros.

Ahora reinicie el sistema:

shutdown -r now

En el indicador de arranque, seleccione su nuevo núcleo (debe estar seleccionado de forma predeterminada). Si todo va bien, debería aparecer el nuevo núcleo. Puede verificar si realmente está usando su nuevo kernel ejecutando

uname -r

Esto debería mostrar algo como

2.6.21.3

Si el sistema no se inicia, reinícielo y seleccione su antiguo núcleo en el indicador de inicio. Ahora puede volver a intentar compilar un kernel que funcione. No olvide eliminar la(s) estrofa(s) del kernel que no funciona de /boot/grub/menu.lst.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *