Compilación de Núcleo · 7 min read · Nov 09, 2025

Cómo Compilar Un Núcleo - La Manera de CentOS

Cómo Compilar Un Núcleo - La Manera de CentOS

Versión 1.0
Autor: Falko Timme

Cada distribución tiene algunas herramientas específicas para construir un núcleo personalizado a partir de las fuentes. Este artículo trata sobre la compilación de un núcleo en sistemas CentOS. Describe cómo construir un núcleo personalizado utilizando las últimas fuentes de núcleo sin modificar de www.kernel.org (núcleo vanilla) para que seas independiente de los núcleos suministrados por tu distribución. También muestra cómo parchear las fuentes del núcleo si necesitas características que no están allí.

He probado esto en CentOS 4.4.

Quiero decir primero que esta no es la única manera de configurar un sistema así. Hay muchas maneras de lograr este objetivo, pero esta es la forma que elijo. No emito ninguna garantía de que esto funcione para ti!

1 Nota Preliminar

En este artículo describiré dos maneras de construir un núcleo para sistemas CentOS. La primera te dará un paquete rpm del núcleo que puedes instalar o compartir con otros. La segunda manera es la misma para todas las distribuciones de Linux, pero no terminas con un paquete rpm.

2 Construyendo Un Paquete rpm del Núcleo

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

2.1 Descargar Las Fuentes del Núcleo

Primero descargamos nuestro núcleo deseado a /usr/src. Ve a www.kernel.org y selecciona el núcleo que deseas instalar, por ejemplo, linux-2.6.18.3.tar.bz2 (puedes 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.18.3.tar.bz2

Luego descomprimimos las fuentes del núcleo y creamos un enlace simbólico linux al directorio de fuentes del núcleo:

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

2.2 Modificar /etc/modprobe.conf

Ahora debemos comentar el módulo mptscsi en /etc/modprobe.conf porque de lo contrario obtendremos un error como este:

No module mptscsi found for kernel 2.6.18.3-default, aborting.

cuando intentamos crear un ramdisk para nuestro nuevo núcleo.

vi /etc/modprobe.conf

| alias eth0 pcnet32 alias scsi_hostadapter mptbase # alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptfc alias scsi_hostadapter3 mptspi alias scsi_hostadapter4 mptsas alias scsi_hostadapter5 mptscsih |

2.3 Aplicar Parche a Las Fuentes del Núcleo (Opcional)

A veces necesitas controladores para hardware que no está soportado por el nuevo núcleo por defecto, o necesitas soporte para técnicas de virtualización o alguna otra tecnología de vanguardia que aún no ha llegado al núcleo. En todos estos casos debes parchear las fuentes del núcleo (siempre que haya un parche disponible…).

Ahora supongamos que has descargado el parche necesario (lo llamo patch.bz2 en este ejemplo) a /usr/src. Así es como lo aplicas a tus fuentes del núcleo (debes seguir 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 tus fuentes. Si no muestra errores, puedes ejecutar el segundo comando que realmente aplica el parche. ¡No lo hagas si el primer comando muestra errores!

Si tus parches están comprimidos con gzip (.gz) en lugar de bzip2 (.bz2), entonces parchas tu núcleo de la siguiente manera:

gunzip -c /usr/src/patch.gz | patch -p1 –dry-run
gunzip -c /usr/src/patch.gz | patch -p1

También puedes aplicar preparches al núcleo a tus fuentes del núcleo. Por ejemplo, si necesitas una característica que solo está disponible en el núcleo 2.6.19-rc6, pero las fuentes completas aún no han sido liberadas para este núcleo. En su lugar, hay un patch-2.6.19-rc6.bz2 disponible. Puedes aplicar ese parche a las fuentes del núcleo 2.6.18, pero no al núcleo 2.6.18.1 o 2.6.18.2 o 2.6.18.3, etc. Esto se explica en http://kernel.org/patchtypes/pre.html:

Los preparches son el equivalente a las versiones alfa para Linux; viven en los directorios de prueba en los archivos. Deben aplicarse utilizando 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 preparche 2.6.12-rc4 debe aplicarse a las fuentes del núcleo 2.6.11, no, por ejemplo, 2.6.11.10.)

Así que si deseas compilar un núcleo 2.6.19-rc6, debes descargar las fuentes del núcleo 2.6.18 ( http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) en el paso 2.1 en lugar del núcleo 2.6.18.3!

Así es como aplicas el parche 2.6.19-rc6 al núcleo 2.6.18:

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

2.4 Configurar El Núcleo

Es una buena idea usar la configuración de tu núcleo de trabajo actual como base para tu 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

Luego ejecutamos

make menuconfig

que abre el menú de configuración del núcleo. Ve a Cargar un Archivo de Configuración Alternativo y elige .config (que contiene la configuración de tu núcleo de trabajo actual) como el archivo de configuración:

Luego navega a través del menú de configuración del núcleo y haz tus elecciones. Asegúrate de especificar una cadena de identificación de versión del núcleo bajo Configuración General —> () Versión local - añadir a la versión del núcleo. Yo uso -default para que nuestro paquete rpm del núcleo se llame kernel-2.6.18.3default-1.i386.rpm. Puedes dejar la cadena vacía o especificar una diferente que te ayude a identificar el núcleo (por ejemplo, -custom o lo que prefieras).

Por favor nota: Después de haber instalado kernel-2.6.18.3default-1.i386.rpm y decides compilar otro paquete rpm del núcleo 2.6.18.3, es importante usar una cadena de versión diferente, por ejemplo, -default1, -default2, etc., porque de lo contrario no podrás instalar tu nuevo núcleo porque rpm se queja de que kernel-2.6.18.3default-1.i386.rpm ya está instalado!

Cuando termines y selecciones Salir, responde a la siguiente pregunta (¿Deseas guardar tu nueva configuración del núcleo?) con Sí:

2.5 Construir El Núcleo

Para construir el núcleo, simplemente ejecuta este comando:

make rpm

Ahora ten paciencia, la compilación del núcleo puede tardar algunas horas, dependiendo de la configuración de tu núcleo y la velocidad de tu procesador.

2.6 Instalar El Nuevo Núcleo

Después de la exitosa construcción del núcleo, se han creado un src.rpm y un paquete rpm. El paquete src.rpm se puede encontrar en el directorio /usr/src/redhat/SRPMS/, puedes averiguar su nombre ejecutando

ls -l /usr/src/redhat/SRPMS/

En mi sistema se llamó kernel-2.6.18.3default-1.src.rpm.

El paquete rpm se puede encontrar en /usr/src/redhat/RPMS/i386/, /usr/src/redhat/RPMS/i586/, /usr/src/redhat/RPMS/i686/, /usr/src/redhat/RPMS/x86_64/, etc., dependiendo de tu arquitectura. En mi sistema estaba ubicado en /usr/src/redhat/RPMS/i386/, y al ejecutar

ls -l /usr/src/redhat/RPMS/i386/

descubrí que su nombre era kernel-2.6.18.3default-1.i386.rpm.

Ahora podemos instalar nuestro paquete rpm del núcleo así:

cd /usr/src/redhat/RPMS/i386/
rpm -ivh –nodeps kernel-2.6.18.3default-1.i386.rpm

Por favor nota el switch –nodeps: si no lo usas, verás un error como este:

error: Failed dependencies:
kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386

Descubrí que ignorar esta dependencia no causó problemas en mi sistema.

Ahora incluso puedes transferir el paquete rpm del núcleo a otros sistemas CentOS e instalarlo allí exactamente de la misma manera, lo que significa que no tienes que compilar el núcleo allí nuevamente.

A continuación, creamos un ramdisk para nuestro nuevo núcleo, porque de lo contrario el sistema probablemente no arrancará nuestro nuevo núcleo:

mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default

2.7 Configurar El Cargador de Arranque GRUB

Ahora debemos configurar nuestro cargador de arranque GRUB para que nuestro nuevo núcleo se inicie cuando reiniciemos el sistema.

Ejecuta

ls -l /boot

para averiguar sobre tu nuevo núcleo (típicamente comienza con vmlinuz, por ejemplo, vmlinuz-2.6.18.3-default) y ramdisk (típicamente comienza con initrd, por ejemplo, initrd-2.6.18.3-default.img).

Luego edita /boot/grub/menu.lst. Echa un vistazo a tus estrofas de núcleo existentes (funcionando) allí y toma una de ellas como muestra para tu nueva estrofa y reemplaza el núcleo y el ramdisk, luego agrega la estrofa por encima de todas las demás estrofas.

vi /boot/grub/menu.lst

Por ejemplo, mi menu.lst se ve así antes de agregar la nueva estrofa:

| # grub.conf generado por anaconda # # Nota que no tienes que volver a ejecutar grub después de hacer cambios en este archivo # AVISO: Tienes una partición /boot. Esto significa que # todos los caminos del núcleo e initrd son relativos a /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |

y así después:

| # grub.conf generado por anaconda # # Nota que no tienes que volver a ejecutar grub después de hacer cambios en este archivo # AVISO: Tienes una partición /boot. Esto significa que # todos los caminos del núcleo e initrd son relativos a /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18.3-default) root (hd0,0) kernel /vmlinuz-2.6.18.3-default ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3-default.img title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |

Ahora reinicia el sistema:

shutdown -r now

Si todo va bien, debería arrancar con el nuevo núcleo. Puedes verificar si realmente está usando tu nuevo núcleo ejecutando

uname -r

Esto debería mostrar algo como

2.6.18.3-default

Si el sistema no arranca, reinícialo, y cuando veas esto:

![](/files/dc3a6f2d-b1a7-426d-bf0f-e8f3f6c15739.png) 

presiona cualquier tecla para entrar en el menú GRUB:

![](/files/38e75d67-5999-4269-bad4-c4ae566c059f.png)

Selecciona tu antiguo núcleo y arranca el sistema. Ahora puedes intentar nuevamente compilar un núcleo funcional. No olvides eliminar la estrofa del núcleo que no funciona de /boot/grub/menu.lst.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.