Cómo compilar un kernel
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:
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í:
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):
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.