Construyendo Un Kernel Linux A Partir de Su Codigo Fuente
Construyendo Un Kernel Linux A Partir de Su Codigo Fuente
Construyendo Un Kernel Linux A Partir de Su Codigo Fuente
Comencemos, X y su
Los comandos se ejecutan desde una terminal X y, en algn punto, se inicia el congurador del kernel
(basado en X).
El escritorio corre como yo (mi usuario) pero mis kernels se construyen como root. Para lograr lo
anterior y hacer que root tenga acceso a mi servidor X, se hace lo siguiente (desde mi terminal):
obtener privilegios de superusuario, unir mi propio archivo Xauthority con el de root, y asignar la
variable DISPLAY. Despus de hacer eso, se pueden ejecutar aplicaciones X desde la terminal su.
Descargando y congurando
Ahora que el entorno de compilacin est congurado, continuemos con el siguiente paso: la
obtencin de las fuentes. Descargue un nuevo kernel de www.kernel.org, descomprmalo en /usr/src y
cree el vnculo simblico linux para que los comandos sean un poco ms genricos. Tomaremos una
versin del kernel 2.6.27.7 como ejemplo. Si su versin es diferente, sabr donde hacer los cambios
de versin en las respectivas cadenas de texto subsecuentes. Si desea saber como vericar la
integridad del cdigo fuente usando la clave GPG del kernel, lea el ltimo captulo.
wget http://www.us.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.7.tar.bz2
tar -C /usr/src -jxvf linux-2.6.27.7.tar.bz2
cd /usr/src
rm linux # remueve el vnculo simblico existente
ln -s linux-2.6.27.7 linux # crea un vnculo simblico apuntando a su
nueva fuente linux
Cambiar el vnculo simblico linux es seguro. Las aplicaciones no fallarn si deja que apunte hacia
un kernel que no sea el que Slackware instal por Usted.
SlackDocs - http://docs.slackware.com/
Last update: 2012/10/26
es:howtos:slackware_admin:kernelbuilding http://docs.slackware.com/es:howtos:slackware_admin:kernelbuilding
06:10 (BST)
Probablemente notar ms directorios linux-* en /usr/src. Es comn dejar que el vnculo linux
apunte al kernel con el cual trabaja actualmente, sin embargo no es un requerimiento contar con
ste. El software moderno que necesite saber la localizacin del cdigo fuente de un kernel instalado,
buscar adonde el vnculo simblico /lib/modules/<kernelversion>/build apunte
Hay un debate acerca de si se deberan compilar los kernels en el rbol /usr/src o en alguna otra parte
completamente diferente.
La causa de la discusin, es un viejo post escrito por Linus Torvalds (julio de 2000) donde aconseja a
la gente construir el kernel desde dentro del directorio del usuario (home). Yo creo que el consejo es
irrelevante para Slackware por la forma en que tiene sus kernel headers y la conguracin del
paquete glibc. As, mi consejo es ignorar este viejo post de Linus Torvalds e instalar las fuentes del
kernel en /usr/src si as lo desea. La localizacin del entorno de construccin del kernel es slamente
un asunto de preferencia personal.
Ahora, obtenga un archivo de conguracin del kernel de Slackware para tener cierta ventaja durante
su propia conguracin. Los archivos de conguracin de Pat son bastante genricos. Para cuando lea
esto, pueden haber archivos disponibles para una nueva versin 2.6.x
wget
http://slackware/mirrors.tds.net/pub/slackware/slackware-12.2/source/k/confi
g-generic-smp-2.6.27.7-smp
cp config-generic-smp-2.6.27.7-smp /usr/src/linux/.config
De manera alternativa, puede obtener la conguracin del kernel que est corriendo actualmente
Ejecute make oldcong en el directorio donde estn las fuentes del kernel nuevo, as, las opciones
predeterminadas son usadas desde el archivo .cong que recin instal. Dado que las fuentes de su
kernel son ms nuevas que su archivo .cong, habr nuevas opciones de conguracin. Usted slo
deber responder a stas(presione Enter para aceptar los valores por defecto, o M para construir el
controlador como un mdulo)
cd /usr/src/linux
make oldconfig
El paso anterior es bastante importante para no contar con una conguracin desactualizada, sobre
todo si se cambia de rama del kernel.
Ahora ha congurado un kernel bastante genrico (esa es probablemente la razn por la que Pat lo
llama kernel-generic) pero seguramente querr cambiar algunas cosas para que se ajuste a sus
necesidades. Para ello ejecute el congurador basado en X (si no tiene un servidor X corriendo y est
en una consola, slo ejecute make menucong para obtener el programa basado en curses)
make xconfig
De un paseo por el bosque de opciones. Lo que usualmente cambio son cosas como:
Construir ext3 (necesita el controlador jbd) y los controladores de los sistemas de archivos
reiser/xfs/jfs/ext4 dentro del kernel en vez de compilarlos como mdulos (as no es necesario
crear un initrd adicional [vea Filesystems en el congurador)])
Habilitar 64GB de RAM. (dentro de Processor type and features > High Memory Support
(64GB)). Use esto si tiene un sistema con 4 GB de ram o ms.
Habilite el kernel de baja latencia si usa un computador porttil o de escritorio (las aplicaciones
multimedia corrern de manera ms uida [dentro de Processor type and features >
Preemption model > Preemptible kernel]). Si tiene un sistema de escritorio con muchas
aplicaciones multimedia, entonces sta es una opcin til para Usted, ya que mantendr a su
sistema con mejores respuestas incluso ante una gran carga de procesos.
Asignar un temporizador de 1000Hz (en Processor type and features > Timer Frequency >
1000 Hz). Un conteo de tics ms alto, puede ser benecioso para sistemas de escritorio
multimedia
O asignar un temporizador sin tics (dynamic ticks - under Processor type and features >
Tickless System (Dynamic Ticks)).
y ms cosas que no se me ocurren ahora. Puede decidir deshabilitar muchos de los mdulos
que las conguracin global construir, para acortar el tiempo de arranque, (si no tiene el
hardware en su computador). Tambin puede revisar las opciones de software suspend y CPU
frequency scaling (dentro de Processor type and features) si posee un computador porttil
Hay que tener cuidado con los sistemas de archivos ya que si no se incluye correctamente la opcin
para aquel donde reside el sistema (opcin Y) o bien se tiene como mdulo sin un initrd, el sistema
arrojar un kernel panic y no arrancar
Construyendo el kernel
Ahora inicie la construccin del kernel y de los mdulos, e instlelos en los lugares adecuados
SlackDocs - http://docs.slackware.com/
Last update: 2012/10/26
es:howtos:slackware_admin:kernelbuilding http://docs.slackware.com/es:howtos:slackware_admin:kernelbuilding
06:10 (BST)
En los kernels 2.6.x y 3.x, ejecutar make o make all en vez de make bzImage modules debera
ser suciente, esto construir los objetos predeterminados, siendo vmlinux el kernel sin comprimir,
bzImage el kernel comprimido y modules los mdulos del kernel. Ya que no necesitamos el kernel
descomprimido, es mejor usar el comando make bzImage modules
Si desea saber ms acerca de los objetos make disponibles, puede ejecutar make help y revisar lo
que entrega. Los objetos predeterminados estn marcados con un asterisco (*).
Modicando lilo.conf
Edite /etc/lilo.conf y agregue una nueva seccin para su nuevo kernel. Recuerde, puede que su nuevo
kernel ni siquiera arranque si cometi un error en alguna parte, por eso querr dejar la(s) seccion(es)
de su(s) kernel(s) intacta(s)(para poder cargar su sistema de los kernels que funcionen, en caso de
cualquier problema). Su archivo /etc/lilo.conf actual, tendr una seccin similar a sta al nal del
archivo
image = /boot/vmlinuz
root = /dev/hda1
label = linux
read-only # Non-UMSDOS filesystems should be mounted read-only for checking
Agregue otra seccin debajo (aadindola debajo, garantizar que su kernel actual permanecer
como opcin por defecto para arrancar)
image = /boot/vmlinuz-custom-2.6.27.7
root = /dev/hda1
label = newkernel
read-only # Non-UMSDOS filesystems should be mounted read-only for checking
Despus de agregar un prrafo, para el nuevo kernel a /etc/lilo.conf, y guardar el archivo, ejecute lilo
para activar los cambios
lilo
Ahora es tiempo de reiniciar, para probar los resultados. En la pantalla de lilo, seleccione la opcin,
newkernel en vez de linux. Si el nuevo kernel arranca bien, puede agregar esta lnea en la parte
superior de /etc/lilo.conf y re-ejecutar lilo
default = newkernel
Usted va a construir y usar un nuevo kernel. y puede preguntarse, Qu debo hacer con el paquete
Slackware kernel-headers? La respuesta es: no lo remueva!
Hay dos lugares donde encontrar kernel headers: uno es dentro del directorio del cdigo fuente del
kernel (en nuestro caso /usr/src/linux-2.6.27.7) y el otro lugar es /usr/include/linux. El paquete kernel-
headers usualmente contiene las cabeceras tomadas del cdigo fuente del kernel que Slackware
tiene por defecto. Estas cabeceras particulares, son usadas cuando el paquete glibc es construido. El
hecho que el paquete kernel-headers instala estos archivos a /usr/include/linux los hace
independientes de los archivos de cabecera que encontrar en el directorio del cdigo fuente.
En algn punto, querr actualizar (recompilar!) partes del software de su sistema. Si ese software
est vinculado con glibc (como la mayora del software lo hace), su compilacin existosa depende
de la presencia de las correctas cabeceras del kernel en /usr/include/linux. No importa si est
ejecutando un sistema completamente distinto al kernel que Slackware trae por defecto. El paquete
kernel-headers reeja el estado del sistema cuando glibc fue construido. Si elimina el paquete kernel-
headers, su sistema no se ver afectado, pero no ser capaz de (re-)compilar la mayora del software
Todava sirven las fuentes del kernel, una vez que ste se ha construido?
En el punto anterior, se dijo que la compilacin de software del sistema usa los archivos de cabecera
localizados en /usr/include/linux. Asimismo, el rbol del cdigo fuente del kernel, es requerido cada
vez que quiera compilar un mdulo de terceros (madwi, linux-uvc,ndiswrapper la lista es
interminable). Usted no est limitado a compilar un driver para el kernel que se est ejecutando.
Puede hacerlo para cualquier kernel, mientras el rbol de mdulos(/lib/modules) y las fuentes estn
presentes. Digamos que va a construir un mdulo para un kernel cuya versin est especcada en
una variable de entorno $KVER, por ejemplo ejecutando:
export KVER=2.6.38.2
Durante la compilacin del driver necesitar tener disponibles las cabeceras del kernel en
/lib/modules/$KVER/build/include/linux. El vnculo simblico /lib/modules/$KVER/build es creado
cuando instala su nuevo kernel y modulos. Si borra las fuentes del kernel despus de que construye
ste, no ser capaz de construir ningn driver fuera-del-kernel (otra manera de decir drivers de
terceros) ms adelante.
Lo ms probable es que tenga instalados uno o ms paquetes que contienen mdulos del kernel pero
que no son partes de ste. Por ejemplo, Slackware instala el paquete svgalib-helper, y si instala
cualquier controlador inalmbrico, stos tambin son bsicamente mdulos del kernel.
Sea consciente que instalando y arrancando su nuevo kernel, ya no tendr disponibles estos mdulos
fuera-del-kernel.
Debe recompilar sus fuentes para que los mdulos resultantes coincidan con la versin de su nuevo
kernel.
Puede tener una visin general de todos los paquetes que han instalado un mdulo para su kernel
actual, ejecutando ste comando (debe ejecutarlo mientras ejecute su viejo kernel)
cd /var/log/packages
grep -l "lib/modules/$(uname -r)" *
SlackDocs - http://docs.slackware.com/
Last update: 2012/10/26
es:howtos:slackware_admin:kernelbuilding http://docs.slackware.com/es:howtos:slackware_admin:kernelbuilding
06:10 (BST)
Todos los paquetes mencionados necesitarn recompilarse si tambin quiere tener los mdulos
disponibles para su nuevo kernel
Si reconstruye un paquete que contiene un mdulo del kernel, use installpkg en vez de
upgradepkg para instalarlo sin remover su versin original.
Si usa upgradepkg, esto remover el mdulo del kernel antiguo, y todava podra necesitarlo si quiere
usar versiones anteriores del kernel. Este truco funciona bajo el supuesto que la versin del kernel es
parte de la VERSION del paquete como por ejemplo: svgalib_helper-1.9.25_2.6.37.6-i486-1.txz (ya s
que es un mal ejemplo ya que este paquete ya no existe)
El mtodo descrito anteriormente, no tendr consciencia de los mdulos del kernel que pueda haber
compilado manualmente en vez de crear un paquete para ellos. Tpicamente los controladores
grcos propietarios como los de Nvidia o Ati le causarn algunos momentos preocupantes si olvida
recompilarlos para el nuevo kernel antes de iniciar el servidor X, especialmente si su computador
arranca con un runlevel 4 de manera predeterminada.
En ese caso, reinicie en runlevel 3, descargue, compile e instale la ltima versin de los controladores
grcos. Esto le permitir iniciar su sistema con login grco.
Para aquellos que olvidaron cmo iniciar en un runlevel distinto al predeterminado, es sencillo:
cuando la pantalla de LILO aparezca, escriba la etiqueta de su kernel (newkernel en nuestro ejemplo
anterior) seguido del nmero del runlevel: Newkernel 3
Creando un initrd
En caso que su kernel no incluya un controlador para su sistema de archivos raiz, o un controlador
para su bus SATA, u otras cosas que son slo construidas como mdulos, su kernel entrar en
pnico(kernel panic), si arranca y no puede acceder los discos, particiones y/o archivos necesarios.
Esto, tpicamente se ve as:
Esto signica que deber construir un initrd o Initial Ram Disk, conteniendo los mdulos requeridos.
Su localizacin es luego agregada a la seccin apropiada de /etc/lilo.conf, as el kernel puede
encontrarlo cuando arranca, y es capaz de cargar los controladores que necesita para acceder a los
discos. Crear un initrd es bastante simple, y mostrar dos casos:uno en caso que posea un sistema de
archivos Reiser en su particin raiz y el segundo caso, si tiene un sistema de archivos ext3. En los
comandos ejecutados a continuacin, se asume que tiene un kernel 2.6.27.7 . Si su nuevo kernel es
de una versin distinta, cambie donde corresponda.
cd /boot
Ejecute el comando mkinitrd para crear el archivo /boot/initrd, el cual contiene un sistema de
archivos comprimido con los mdulos que le indica que agregue.
image = /boot/vmlinuz-custom-2.6.27.7
root = /dev/hda1
initrd = /boot/initrd.gz
label = newkernel
read-only # Non-UMSDOS filesystems should be mounted read-only for
checking
Re-ejecute lilo
lilo
Crear una segunda imagen initrd usando el comando que se muestra a continuacin, pero con un
nombre explcito para el archivo resultante (el cual debe ser diferente del nombre por defecto para no
sobreescribir el antiguo)
image = /boot/vmlinuz-custom-2.6.27.7
root = /dev/hda1
initrd = /boot/initrd-custom-2.6.27.7.gz
label = newkernel
read-only # Non-UMSDOS filesystems should be mounted read-only for
checking
O agregue los mdulos para su nuevo kernel en el archivo initrd existente. De esa manera, tendr
una sola imagen initrd conteniendo mdulos para mltiples kernels. Todo lo que necesita hacer es
dejar fuera la opcion -c la cual sirve para eliminar el directorio /boot/initrd-tree y empezar de cero:
/usr/share/mkinitrd/mkinitrd_command_generator.sh /boot/vmlinuz-
generic-2.6.27.7
SlackDocs - http://docs.slackware.com/
Last update: 2012/10/26
es:howtos:slackware_admin:kernelbuilding http://docs.slackware.com/es:howtos:slackware_admin:kernelbuilding
06:10 (BST)
#
# $Id: mkinitrd_command_generator.sh,v 1.11 2008/04/10 23:56:18 root Exp
root $
#
# This script will now make a recommendation about the command to use
# in case you require an initrd image to boot a kernel that does not
# have support for your storage or root filesystem built in
# (such as the Slackware 'generic' kernels').
# A suitable 'mkinitrd' command will be:\\
mkinitrd -c -k 2.6.27.7 -f ext3 -r cryptslack -m mbcache:jbd:ext3 -C
/dev/sda8 -u -o /boot/initrd.gz
# An entry in 'etc/lilo.conf' for kernel '/boot/vmlinuz-generic-2.6.27.7'
would look like this:
# Linux bootable partition config begins
# initrd created with 'mkinitrd -c -k 2.6.27.7 -f ext3 -r cryptslack -m
mbcache:jbd:ext3 -C /dev/sda8 -u -o /boot/initrd.gz'
image = /boot/vmlinuz-generic-2.6.27.7
initrd = /boot/initrd.gz
root = /dev/mapper/cryptslack
label = 2.6.27.7
read-only
# Linux bootable partition config ends
Previo a Slackware 11.0, los mdulos para su kernel eran cargados ya sea por el hotplug subsystem
o por comandos modprobe explcitos en el archivo /etc/rc.d/rc.modules. Tener los mismos archivos
rc.modules para los kernels 2.4.x y 2.6.x no era una situacin
En Slackware 12.0 y versiones posteriores, el kernel 2.6.x es el nico kernel que est disponible. La
carga de los mdulos est manejada por udev y explcitamente por los comandos modprobe: los
mdulos que no son cargados por udev pueden ser puestos todava en un archivo rc.d. Slackware
revisar por la existencia de los siguientes archivos (ejecutables) en ste orden:
$(uname -r) es la actual versin del kernel. Entonces, por ejemplo, si su versin del kernel es
2.6.27.7-smp, entonces Slackware buscar un archivo /etc/rc.modules-2.6.27.7-smp para ejecutar. De
esta manera, archivos rc especcos para diferentes kernels pueden estar presentes, permitiendo un
anamiento ptimo de su sistema
Si decide construir su propio kernel 2.6 desde las fuentes, podra intrigarse por el hecho que no habr
un archivo llamado /etc/rc.d/rc.modules-$(uname -r)- deber crearlo. rc.modules es usualmente un
vnculo simblico a rc.modules-2.6.27.7-smp. Un resultado tpico de la ausencia de un archivo
rc.modules para su kernel especco es que su mouse no responder. Tome ese comportamiento
como una pista para crear el archivo rc.modules. Puede basarse en una copia completa de cualquier
archivo rc.modules-2.6.xx. Si su sistema no tiene ningn archivo, puede tomar uno del CD de
Slackware como un ejemplo: /source/k/kernel-modules-smp/rc.modules.new. Aqu hay un ejemplo en
caso que hubiera construido un kernel versin 2.6.28.8.alien teniendo ya instalado un kernel versin
2.6.27.7-smp
cp -a /etc/rc.d/rc.modules-2.6.27.7-smp /etc/rc.d/rc.modules-2.6.28.8.alien
Firma gpg
Los archivos fuente del kernel de linux estn rmados con OpenPGP Linux Kernel Archives
Verication Key. Esto es un medio para vericar que el cdigo fuente que descarg es el archivo
original y no ha sido alterado. Los pasos para esta validacin, son resumidos en este captulo
Primero, importe la llave OpenPGP en su llavero GnuPG; ya sea copindola desde la pgina de rmas
o importndola desde un servidor. La clave ID del kernel es 0x517D0F0E. Un ejemplo sera algo como:
gpg: key 517D0F0E: public key "Linux Kernel Archives Verification Key
<[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1
wget
http://www.us.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.7.tar.bz2.sign
gpg: Signature made Fri 21 Nov 2008 12:10:49 AM CET using DSA key ID
517D0F0E
gpg: Good signature from "Linux Kernel Archives Verification Key
<[email protected]>"
gpg: checking the trustdb
SlackDocs - http://docs.slackware.com/
Last update: 2012/10/26
es:howtos:slackware_admin:kernelbuilding http://docs.slackware.com/es:howtos:slackware_admin:kernelbuilding
06:10 (BST)
Si le hubiese dicho a gnupg que conase en esta llave, la ltima parte se hubiese visto distinta. Para
mi el agregar un nivel de conanza a llave no tiene sentido a menos que conociese a algn
desarrollador del kernel que tuviese su clave consigo y que pudiera presentar credenciales conables.
Sin embargo el resultado es que el archivo del cdigo fuente, fue ciertamente rmado con la llave
que import. As que son buenas noticias
Fuentes
Fuente Original: http://alien.slackbook.org/dokuwiki/doku.php?id=linux:kernelbuilding
Escrito originalmente por: Eric Hameleers
Traducido originalmente por: Mandrake
From:
http://docs.slackware.com/ - SlackDocs
Permanent link:
http://docs.slackware.com/es:howtos:slackware_admin:kernelbuilding