Compilando el kernel Linux 2.6.x
------------------------------------------
------------------------------------------
Copyright (C) 2004 Marco Antonio Islas Cruz
Permision is granted to copy, distribute and/or midify this document
under the therms os the GNU Free Documentations License, Version 1.1
or any later version published by the Free Software Foundation;
with no Invariant Sections, with no Front-Cover Texts, and with no
Back-Cover Texts. http://www.gnu.org/copyleft/fdl.html
------------------------------------------
------------------------------------------
Bien, en este pequeño manualito, veremos de una forma rapida y
sencilla el proceso de compilacion del Kernel en Linux.
Por si no lo sabes, el kernel es el "corazon" de cualquier Sistema
Operativo. asi, SunOS, *BSD, Linux, MS-DOS, Windows u otros sistemas
tienen un kernel que administra los recursos del sistema.
Una de las razones por las que GNU/Linux es uno de los sistemas mas
poderosos, es por constante actualizacion del kernel. "Actualizar el
nucleo (el kernel) es simple asunto de juntar las fuentes y compilarlo
uno mismo. Se debe compilar el nucleo por si mismo para activar o
desactivar ciertas funciones, ademas de asegurarse de que el nucleo
estara optimizado para correr en esa maquina. El proceso es casi
indoloro"1.
La compilacion de la que se hace mencion en este documento
fueron realizadas en Slackware GNU/Linux 10.0, Aunque en todas las
distribuciones deberia ser practicamente igual puede haber ligeros
cambios,
1-. Bien, lo primero que haremos sera descargarnos
las fuentes del kernel, lo podemos hacer entrando en www.kernel.org, de
donde podremos descargar el parche (Nota: Al referirse como parchar o
parche, no se refiere a "Corregir errores" o "Tapar hoyos", sino al
echo
de actualizar sin tener que compilar TODO el nucleo), asi como el
codigo fuente completo del nucleo linux. Al momento de escribir estas
lineas, el kernel mas nuevo es el reciente Kernel 2.6.0.
2.- Una vez que ya tenemos las fuentes de nuestro
kernel lo descompactamos en "/usr/src/", como el kernel esta
empaquetado
con dos diferentes metodos, mostraremos los dos:
linux-2.6.x.tar.bz2
# tar -xjvf linux-2.6.x.tar.bz2
# bzip2 -d linux-2.6.x.tar.bz2 | tar -xvf
linux-2.6.x.tar.gz
# tar -xzvf linux-2.6.x.tar.gz
# gzip -d linux-2.6.x.tar.gz | tar -xvf
3.- Esto nos generara una carpeta en donde se
encuentran las fuentes del kernel algo asi como
"/usr/src/linux-2.6.x/",
podemos crear un enlace simbolico para nuestra carpeta, llamandolo
"linux" (/usr/src/linux), esto porque muchos programas se referiran a
las fuentes por /usr/src/linux/. De esta manera no tendremos que
cambiar el nombre del directorio. Lo haremos de la siguiente manera:
#ln -s /usr/src/linux-2.6.x/ /usr/src/linux
4.- En este momento, tenemos lo necesario para
empezar con la configuracion de nuestro kernel, asi que dentro de la
carpeta que contiene las fuentes ejecutaremos el comando "make" con la
variable "config","menuconfig" o "xconfig".
#make config
#make menuconfig
#make xconfig
Cualquiera de las tres opciones son para configurar
el kernel, y van de mas complicado a mas sencillo. Con "make config" se
nos haran preguntas sobre las opciones, todas y cada una de ellas
acerca
de la configuracion del modulo (Nada recomendable, es un proceso mas
tardado de lo que imaginas) este proceso es en modo texto. "make
menuconfig" tambien es un proceso en modo texto, con la diferencia de
que aqui apreciaremos todo en un menu. Con "make xconfig" realizaremos
la configuracion del kernel en modo grafico --Solo si contamos con X--,
de todas esta es la opcion mas recomendada, pues es mas sencilla y
organizada.
La configuracion del kernel no la explicare, pues es
un proceso que cada quien lo tiene que realizar ajustanto el kernel a
sus necesidades. La recomendacion que puedo hacer es meter en el kernel
lo que es realmente necesario y que casi siempre se va a utilizar. El
kernel se carga completo desde un principio, asi que si metemos en el
kernel muchos modulos, se hara muy grande y nos consumira mas memoria y
ciclos del CPU. Ahora, tampoco es bueno dejarlo todo como modulo, si
dejamos como modulo por ejemplo la tarjeta de red en una computadora
que
esta siempre conectada, el proceso de carga y descarga del modulo cada
vez que el dispositivo se utiliza ralentizaria nuestro kernel. Tambien
hay que tomar en cuenta ke no debemos poner como modulos cosas que
seran necesarias para booteo de nuestra maquina. Por ejemplo, si
estamos utilizando el sistema de ficheros Ext3 (Ext2 + Journaling), en
nuestro kernel lo marcamos como modulo, y nuestro kernel reside en una
particion Ext3, nuestro kernel sera incapaz de bootear por si solo (a
menos que utilices Initrd). Pues a la hora de intentar cargarse no
podra
cargar el modulo (pues no tiene soporte para Ext3), no podra leer el
sistema de ficheros y por consiguiente, no podra Bootear.
En caso de que tu kernel no funcione a la primera
(Es normal que a la primera no nos quede el kernel como lo queremos),
debe haber sido porque en alguna de las opciones la marcaste con
"m"(modulo) o como "n"(no incluir ni en el kernel ni como modulo).
Recuerda siempre guardar el archivo de configuracion de tu kernel, pues
en caso de tener que reconfigurarlo, no tendras que partir desde cero.
5.- Ok, ya que tenemos configurado nuestro kernel, se
nos instara a que realizemos la compilacion del mismo, es un proceso
sencillo, y nuestro ordenador hara todo :), para ello ejecutaremos
"make
dep" para generar las dependencias, "make clean" para limpiar de
anteriores binarios, y "make bzImage" para generar la imagen comprimida
del kernel. Para ahorrarnos tiempo, marquemoslo todo en la misma linea
de comando:
#[make dep;]make clean; make bzImage
Nota: En los kernels 2.6.x no es necesario hacer el "make dep"
esto solo es necesario para kernels inferiores o iguales a la verison
2.4.x
En esto de la compilacion nos tardara un rato,
dependiendo de lo que le hayamos metido a nuestro kernel, asi como de
la
velocidad de nuestro micro. Referencia: Tengo un procesador P4-M a 1.8
Ghz, tardó aproximadamente 15-20 mins cambiando solo algunos
parametros. En este momento podemos despegarnos de la computadora por
un
minuto, tal vez para preparar lo que haremos mientras compilamos los
modulos ;-).
6.- Una vez compilado el kernel tendremos que
compilar todo lo que hayamos marcado como modulos. Este proceso es
quiza
el mas tardado de todos, pues habra una buena cantidad de modulos que
compilar (a menos que sepas bien lo que necesitas y le hayas kitado
todos los innecesarios). Como ya habia dicho antes, es buen momento
para
retirarse a tomar cafe, a platicar con alguien ver una pelicula o hacer
algo mas. Referencia: En mi maquina ha tardado algo asi de una hora
compilando los modulos, quite drivers innecesarios, soporte para
sistemas de ficheros que no utilizo, y algunos los mande al kernel.
Esto lo haremos con
#make modules
Una vez compilados los modulos, no se nos debe
olividar instalarlos en la carpeta de modulos correspondiente a nuestro
kernel, lo marcaremos con :
#make modules_install
7.- Realizando esto, ya tenemos todo lo que
necesitamos en binarios, no mas compilaciones (si todo salio bien). La
imagen comprimida de nuestro kernel se encuentra en la carpeta
"/usr/src/linux-2.6.0/arch/i386/boot/" (si fue compilado para i386). Lo
que haremos sera copiar el archivo bzImage a /boot/. Por seguridad
cambiemos el nombre.
#cp bzImage /boot/2.6.x
8.- Ya en este lugar, lo que tendremos que hacer es una
imagen de booteo (initrd).
- Por que necesito initrd? (tomado deREADME.initrd del disco 2
Slackware 10.0 "testing/packages/linux-2.6.7" )
- La razon mas usual para usar initrd es porque tu necesitas
cargar los modulos de kernel antes de poder montar la particion de
root. Usualmente estos modulos son requeridos para soportar el sistema
de ficheros usados en la particion raiz (ext3, reiserfs, xfs), o
tambien el controlador del disco duro (SCSI, RAID,etc). Escecialmente,
hay diferentes opciones disponibles en los modernos kernels Linux
que no es practico hacer kernels para cubrir las necesidades de todos.
Es mucho mas flexible crear un solo kernel generico y una serie de
modulos para este kernel.
- Como genero una imagen initrd??
- Esto funcionara para crear una imagen initrd en /boot para el
kernel 2.6.7 con sistema de ficheros ext3, es necesario que esta en
/dev/hdb3. Nota que es necesario tener ambos modulos (jbd y ext3) para
poder utilizarlo.
9.- Ya por ultimo tendremos que ajustar nuestro
gestor de arranque para que bootee con el nuevo kenel, en LiLo seria
algo asi:
image=/boot/vmlinuz
label="linux"
root=/dev/hda8
initrd=/boot/initrd.gz
*append="quiet devfs=mount
acpi=off"
*vga=788
read-only
Nota: Los marcados con * son extra, he
tomado esta
configuracion de mi lilo.conf
No es para nada recomendable, es mas seria algo
"estupido", borrar la imagen del kernel anterior en /boot/, o
eliminarla
de nuestro gestor de arranque, pues, si por alguna razon nuestro kernel
no es capaz de bootear, lo necesitaremos para corregir los errores. A
menos que estemos COMPLETAMENTE SEGUROS de que nuestro kernel si
funciona bien
------------------------------------------
------------------------------------------
Copyright (C) 2004 Marco Antonio Islas Cruz
Permision is granted to copy, distribute and/or midify this document
under the therms os the GNU Free Documentations License, Version 1.1
or any later version published by the Free Software Foundation;
with no Invariant Sections, with no Front-Cover Texts, and with no
Back-Cover Texts. http://www.gnu.org/copyleft/fdl.html