COMO: Compilar un Kernel en Ubuntu

Esta es una pequeña guía para compilar un núcleo en Ubuntu. Está basado en una guía para compilar un núcleo en Fedora pero con algunos cambios para adaptarlo a esta otra distribución, y en parte me he basado en esta otra guía del portal que debéis considerar:

http://www.ubuntu-es.org/node/427

He querido realizar esta guía para los usuarios acostumbrados a otras distribuciones y que prefieren, como yo, hacer las cosas de forma más parecida a como lo hacían antes (para que sea menos traumático el cambio de sistema), con pasos más detallados y todo eso. Por tanto vienen comandos que en Ubuntu, como se puede consultar en la otra guía que he mencionado, pueden ser sustituidos por otros y que tal vez podrían simplificar el trabajo y hacerlo más rápido.

No pretendo hacer una guía con la "mejor" forma de compilar el núcleo, sino como he dicho una guía para compilar el núcleo "de una forma distinta".

Tampoco soy un experto en el asunto, de hecho hay comandos que no comprendo perfectamente qué es lo que hacen, pero estos son los pasos que yo he seguido y me ha funcionado.

1.- Obtener las herramientas necesarias:

apt-get install build-essential kernel-package

2.- Descargar la fuente del Kernel desde Kernel.org, concretamente de: http://www.kernel.org/pub/linux/kernel/v2.6/ .Descárgate un paquete que tenga extensión .gz y que no comience su nombre por patch para descargarte las fuentes del kernel completas.

3.- Cópiala en /usr/src y descomprímela:

cd /usr/src/
tar -xvzf linux-X.Y.ZZ.tar.gz

4.- Crear un enlace simbólico al directorio descomprimido de las fuentes (opcional)

ln -s linux-X.Y.ZZ linux

o

mv linux-X.Y.ZZ linux

5.- Obtener las herramientas para configurar el núcleo

apt-get install libncurses5-dev

6.- Ir al directorio de las fuentes

cd /usr/src/linux-X.Y.ZZ

7.- Ahora puedes coger tu vieja configuración e importarla al nuevo kernel si quieres. Para ello debes copiar el fichero config-A.BB.CC que estés usando (puede haber varios) de /boot a la carpeta /usr/src/linux-X.Y.ZZ que has creado, pero llamándolo .config

cp /boot/config-A.BB.CC /usr/src/linux-X.Y.ZZ/.config

8.- Ejecutar "make mrproper" dentro del directorio /usr/src/linux-X.YY.ZZ. No tengo ni idea de para qué sirve, pero venía en la guía de Fedora :P

make mrproper

9.- Ejecutar "make menuconfig" o "make oldconfig menuconfig" si vas a importar la configuración. En el segundo caso se tomará la configuración antigua para las opciones viejas, y se te preguntará sobre cada una de las nuevas opciones del Kernel. Usa ? para pedir ayuda, y a no ser que sepas bien lo que haces usa la opción por defecto (basta darle a ENTER o mirar cual de las opciones listadas aparece en mayúscula, como por ejemplo Y/n/? o N/y/?

make menuconfig 

o

make oldconfig menuconfig

10.- Tomes o no la configuración antigua, ahora te aparecerá el menú en el que puedes revisar las opciones o cambiar alguna más. Cuando termines, asegúrate de que grabas los cambios realizados.

11.- Ejecutar "make dep" para crear las dependencias.

make dep

12.- Ejecutar "make clean". Esto es poco recomendable si estás cambiando solo un par de opciones sobre un kernel que ya has compilado antes porque tardará muchísimo luego en recompilar todo, ya que borrará todos los .o que ya estuviesen compilados. En definitiva este comando "borra toda la basura" según decía la guía de Fedora.

make clean

13.- Ejecutar "make bzImage" para crear la imagen del kernel. Tardará un poquillo.

make bzImage

14.- Copiar la imagen del kernel bzImage y los maps al directorio /boot

cp System.map /boot/System.map-X.Y.ZZ-identificador
cd /usr/src/linux-X.YY.ZZ/arch/i386/boot
cp bzImage /boot/vmlinuz-X.Y.ZZ-identificador
cd /usr/src/linux-X.Y.ZZ

Asegúrate que llamas a los archivos en /boot de con una identificación idéntica. Puedes llamarlos por ejemplo, para diferenciar con otros kernels, así:
System.map-2.6.10-nuevo y vmlinuz-2.6.10-nuevo
System.map-2.6.11.3-pruebas y vmlinuz-2.6.11.3-pruebas

15.- Ejecutar "make modules" para crear los modulos. Tardará bastante. En en un 400Mhz ha tardado entre 8-10 horas (para Fedora) las distintas veces que lo he ejecutado, mientras que en un 2.8Ghz no habrá tardado ni una hora en Ubuntu.

make modules

16.- Ejecutar "make modules_install" para instalar los modulos.

make modules_install

17.- Ejecutar "mkinitrd -o /boot/initrd.img-X.Y.ZZ-identificador X.Y.ZZ" que debe coincidir en su identificador con System.map y vmlinuz. Observa que el segúndo parámetro NO lleva el identificador, sino que debe coincidir con el nombre del directorio /lib/modules/X.YY.ZZ que contiene los módulos para tu nuevo kernel.

mkinitrd -o /boot/initrd.img-X.Y.ZZ-identificador X.Y.ZZ

18.- Editar la configuración de grub (o de lilo). La configuración de grub está en /boot/grub/menu.lst. Te bastará copiar uno de los bloques ya existentes y añadirlo al final con las modificaciones pertinentes para que se adapte a tu sistema. Un ejemplo sería:

title Ubuntu, kernel 2.6.11.3-pruebas
root (hd0,2)
kernel /boot/vmlinuz-2.6.11.3-pruebas root=/dev/hda3 ro quiet splash
initrd /boot/initrd.img-2.6.11.3-pruebas
savedefault
boot

Y cuando hayas probado que funciona, podrás cambiar la línea default al valor adecuado para que arranque por defecto en esta nueva configuración. Ten en cuenta que si pones default 3 arrancará la cuarta opción de la lista, ya que default empieza a numerar con el 0.

19.- Ejecutar "depmod -a" (de preferencia para actualizar los modulos)

depmod -a

20.- Reiniciar el PC

21.- Disfrutar del nuevo kernel (esperemos que sí) :)

0
Su voto: Ninguno

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

problemas

una pregunta... cuando ejecuto "make dep" me sale el siguiente mensaje:

***warning: make dep is unnecesary now

y si me los salto y escribo "make bzimage", sale:

make: *** No hay ninguna regla para construir el objetivo `bzimage'. Alto.

y no puedo continuar

por favor, si alguien me pude ayudar, estare muy agradecido

EL Warning no es malo, solo

EL Warning no es malo, solo es un Warning.

Y con el bzImage, fíjate que la I es mayúscula, no minúscula.

Saludos

Mmmm...

...Por ké no hay regla para construir el objetivo? es de lo ke se keja "make", fácil, revisemos el orden del punto 7 y el 8.
Echemos un ojo a lo ke hace "make mrproper":
Borra todos los archivos *.o de compilaciones anteriores, asegurando ke ninguna regla anterior interfiera en esta nueva compilación.
Borra los módulos y los objetos de los módulos.
Borra la versión si es ke existe como así también el bzImage y el vmlinux en el directorio raíz.
Borra las plantillas de documentos que no han de crearse explícitamente.
Borra el System.map y el ".config", auch! #%@!!.
Mmmm...entonces:
renombramos el .config para ke mrproper no lo borre!
pingusa:~# mv .config confy
pingusa:~# make -s mrproper (-s en silencio)
pingusa:~# mv confy .config
pingusa:~# make menuconfig
pingusa:~# make -s dep (sólo para versiones anteriores del 2.6.x)
pingusa:~# make -s bzImage (si lo keremos en nuestro disco)(véase zlilo - zImage)
pingusa:~# make -s modules && make -s modules_install (si el primero no falla se instalan)
pingusa:~# make -s install (se copian a /boot el vmlinuz,System.map y config, con suerte actualiza el gestor lilo o grub)
Y no estaría demás editar el archivo /usr/src/linux-2.x.x/Makefile agregando: EXTRAVERSION = -jaipauer1 (por ejemplo) para tener mayor control de las versiones ke vamos compilando, luego un 'uname -r' nos dará el nombre de nuestro kernel:
pingusa:~# uname -r
2.4.26-jaipauer1

Christian
--------------------------------------------------------------
La maldición es el único lenguaje que conocen mejor todos los programadores.

Error en .tmp_linux1

Que tal.

tengo un problemilla cuando intento compilar el kernel, todo va bien hasta que me sale el siguiente error:

LD .tmp_vmlinux1
net/built-in.o(.text+0x6885c): En la función `br_handle_frame_finish':
: undefined reference to `br_fdb_update'
net/built-in.o(.text+0x68b08): En la función `br_handle_frame':
: undefined reference to `br_fdb_update'
net/built-in.o(.text+0x6a8d6): En la función `br_stp_handle_bpdu':
: undefined reference to `br_fdb_update'
make[1]: *** [.tmp_vmlinux1] Error 1
make[1]: Leaving directory `/usr/src/linux-source-2.6.10'
make: *** [stamp-build] Error 2

El unico cambio que hice en el .config (version 2.6.10-6-686) fue habilitar el soporte para bridge ethernet.

si me pueden ayudar, gracias.

suerte :D

pregunta con xconf

Hola gente les cuento que cada vez que compilo el kernel lo destrozo jajajj bueno asi voy a aprender.... creo... la pregunta es si en un kernel 2.6.x.y.z yo uso el make xconf me mustra lo que ya esta en mi maquina compilado y funcionando... porque cuando hago el make menuconfig me sale por defecto y haycosas que yo no tengo y por eso me da fallas.... si no es asi como puedo hacer para que me tome las cosas que ya estan compiladas y funcionando... si es que se puede?
desde ya muchas gracias
sebas

pregunta con xconf

Hola gente les cuento que cada vez que compilo el kernel lo destrozo jajajj bueno asi voy a aprender.... creo... la pregunta es si en un kernel 2.6.x.y.z yo uso el make xconf me mustra lo que ya esta en mi maquina compilado y funcionando... porque cuando hago el make menuconfig me sale por defecto y haycosas que yo no tengo y por eso me da fallas.... si no es asi como puedo hacer para que me tome las cosas que ya estan compiladas y funcionando... si es que se puede?
desde ya muchas gracias
sebas

Ta mu bien el COMO,siempre

Ta mu bien el COMO,siempre es bueno saber hacer las cosas de más de una manera. Una cosilla make mrproper lo que hace es borrar la configuración del kernel(es decir que si lo hubieras puesto un paso más adelante...)dejándolo todo "limpito",xD.

Uhhmmm

Interesante.

O sea, que si hubiese puesto el MrProper un paso más tarde... Jo! Que risas me habría pegado.

Gracias!

YO añadiría una cosa: La

YO añadiría una cosa:
La opción de instalar libqt3-mt-dev asín:
apt-get install libqt3-mt-dev
Eso se haría cuando se instala libncurses5-dev. Así, en lugar de usar menuconfig, se podría usar xconfig, igual pero basado en X. A mi me gusta más el menuconfig, pero nunca se sabe.

solo un consejo

el tiempo, que se tarda en compilar los módulos se puede reducir drásticamente si nos armamos con un poco de valor e intentamos limpiar toda la "mierda" que podamos en el kernel, yo uso gentoo y estoi muy acostumbrado ya a hacerlo (aunque mis batallas me ha costado y tropecientos kerneles que no han arrancado...xD).
Osea, que lo que recomiendo a todo el mundo, en el paso del menuconfig, es ir apartado por apartado, quitando los modulos o drivers cargados en el nucleo tb, que no vayamos a utilizar...empezar por lo mas simple, por ejemplo, pa que necesitamos modulos wireless o pcmcia o bluetooth o firewire si me apuras, si tenemos una maquina de sobremesa donde nunca vamos a usar dichas tecnologias?
si lo quitamos, eso que nos ahorramos a la hora de compilar, y encima cada vez iremos teniendo una imagen más reducida del kernel, que aparte de cargar más rapido y trabajar mejor...pos mola mas :)

Ojo!
quitar solamente las cosas que sean muy evidentes al principio y siempre tener una imagen que arranque de backup por si las moscas.

Poseso, a lo dixo, ir poquito a poquito quitando drivers innecesarios y os aseguro que lo agradecereis

Pd: yo compilo el kernel en menos de 15min con mi P4

saludooos

Esto es agotante !

Hola a todos, pues tengo un gran problema, espero puedan ayudarme he seguido todos los pasos de esta manual y pues todo va bien excepto en un paso que porcierto no salgo de ahi...
He seguido algunos otros manuales del mismo tema tambien con ubuntu, pero por una u otra cosa tampoco avanso.
Pues bien mi error o lo que sea es este:

root@ubuntu:/usr/src/linux# mkinitrd -o /boot/initrd.img-2.6.16-386 6.3.16
/usr/sbin/mkinitrd: /lib/modules/6.3.16: Not a directory
/usr/sbin/mkinitrd: MODULES needs to be set to none?
root@ubuntu:/usr/src/linux# mkinitrd -o /boot/initrd.img-2.6.16-386 2.6.16
find: atención: ha especificado la opción -mindepth después de un argumento -type que no
es una opción, pero las opciones no son de posición (-mindepth afecta tanto a
las evaluaciones especificadas antes de él como a las especificadas
después). Por favor especifique las opciones antes de otros argumentos.

find: atención: ha especificado la opción -maxdepth después de un argumento -type que no
es una opción, pero las opciones no son de posición (-maxdepth afecta tanto a
las evaluaciones especificadas antes de él como a las especificadas
después). Por favor especifique las opciones antes de otros argumentos.

find: atención: ha especificado la opción -mindepth después de un argumento -type que no
es una opción, pero las opciones no son de posición (-mindepth afecta tanto a
las evaluaciones especificadas antes de él como a las especificadas
después). Por favor especifique las opciones antes de otros argumentos.

find: atención: ha especificado la opción -maxdepth después de un argumento -type que no
es una opción, pero las opciones no son de posición (-maxdepth afecta tanto a
las evaluaciones especificadas antes de él como a las especificadas
después). Por favor especifique las opciones antes de otros argumentos.

cp: no se puede efectuar `stat' sobre «/sbin/udhcpc»: No existe el fichero o el directorio
ldd: /sbin/udhcpc: No existe el fichero o el directorio
cp: no se puede efectuar `stat' sobre «(0xffffe000)»: No existe el fichero o el directorio
root@ubuntu:/usr/src/linux#

Cuando intento hacer el :
mkinitrd -o /boot/initrd.img-2.6.16-386 6.3.16
Sale eso y no se que hacer ! realmente creo que ya sueño el kernel :(
Alguna personapodria decirme que hacer ?
Gracias !

problemas con gcc

Hola a todos, veamos este problema:

intentando compilar el kernel, despues de instalar built-essential y kernel-packages, al hacer el make xconfig (o menuconfig, da igual) me contesta esto:

/usr/src/linux$ sudo make oldconfig xconfig

/usr/src/linux-source-2.6.12/scripts/gcc-version.sh: line 11: gcc-3.4: command not found
/usr/src/linux-source-2.6.12/scripts/gcc-version.sh: line 12: gcc-3.4: command not found
HOSTCC scripts/basic/fixdep
/bin/sh: gcc-3.4: command not found
make[1]: *** [scripts/basic/fixdep] Error 127
make: *** [scripts_basic] Error 2

Evidentemente, el fallo esta en el compilador, ya que yo tengo instalado el gcc 4.0.2

Ahora viene la pregunta: ¿como lo soluciono?

Un saludo
ArturoM

Un saludo
ArturoM
(http://www.hispalazarus.tk/)

Algunos detalles

Algunos detalles para aclarar:
El mrproper se usa para limpiar la configuración del kernel es decir; porque puede pasar que cuando se hizo el paquete linux-X.Y.Z.tar.gz se fue con la configuración que estaba usando algun programador y mrproper lo que hace es borrar el .config y dejarlo limpio...
Lo del make bzImage, make clean,make dep, ya no se usa para los kernels 2.6 eso es de los 2.4 lean el README que viene en las fuentes del kernel ;-)..
Es decir sólo se hace
make (creamos la imágen antes lo haciamos con "make bzImage" y compila los módulos)
make install (instalamos la imágen)
make modules_install (instalamos los módulos)
Como mensionan en los comentarios tambíen es bueno que vayan deshabilitando cosas que no usan así hacen un kernel más rápido,estable y seguro poco a poquito.
Por lo demás está bien la guía
Salu2
|AhIoRoS|

Observación

En el paso 17 llamas a la instrucción: "mkinitrd", esta (al menos en mi sistema ubuntu 6.06 lts) no venia instalada, para tenerla debes instalar initrd-tools.

$ sudo apt-get install initrd-tools

Saludos!

Juan Pablo Arriagada C.

Inicio de sesión

Encuesta

¿Qué entorno gráfico prefieres usar? ¿Por qué?
Unity
23%
Gnome 3
23%
Gnome classic
39%
Kde
6%
Xfce
4%
Enligthenment
1%
Lxde
2%
Otro - Especificar
1%
¿Entorno gráfico? Ninguno, ¡solo uso la consola!
2%
Total de votos: 1075