=========================================
ES.COMP.OS.LINUX-KERNEL-MINI-HOWTO
=========================================
INTRODUCCION
Como se comentó en el grupo es.comp.os.linux.misc, es recomendable
de vez en cuando escribir algún texto explicativo y dejarlo caer por
las news para que otros aprendan a hacer determinadas cosas y para
allanar el camino para nuestra futura FAQ. Con ese propósito he creado
este sencillo documento que, sin sustituir al Kernel Howto disponible
en http://lucas.ctv.es, pretende ayudar a los nuevos en Linux con
la compilación del kernel. Este documento estará disponible además
en mi página Web junto con otros documentos sobre Linux (URL:
http://www.ctv.es/USERS/sromero).
COMPILACION DEL KERNEL
La compilación del kernel es un paso muy habitual y sencillo en la
configuración de Linux, y aunque en principio pueda parecer un proceso
complicado y que requiera conocimientos de programación, aunque nada
más lejos de la realidad, ya que en Linux es un paso casi automatizado
en su totalidad, basándose en la ejecución de unos comandos que leeran
los Makefiles correspondientes sin necesidad de que nosotros hagamos
nada con los ficheros fuente.
Compilar el kernel no tiene ningun peligro si se realiza una copia
de seguridad del kernel antiguo en una unidad de tipo msdos o en un
diskette cualquiera y además en la misma unidad/diskette se copia el
programa de MSDOS loadlin.exe, incluido en la mayoría de Cds de Linux,
y que permite arrancar Linux desde MSDOS a partir de un kernel copia
de seguridad. Si se estropeara algo en el kernel, puede arrancarse con
loadlin usando el viejo, y recompilar, deshacer cambios, copiar el
kernel viejo sobre el nuevo, etc. El uso de loadlin es muy sencillo:
loadlin zimage root=/dev/hda5: rw
Estando en modo msdos se ejecuta el programa (loadlin) pasándole el
nombre del kernel a arrancar (zimage) e indicándole donde está el
sistema de ficheros que debe montar en el root (/) con el parámetro
(root=/dev/hdxx, indicando xx la partición a arrancar). El rw le
indica que monte dicho sistema de ficheros para lectura (letra r) y
escritura (w). Incluso tener esta precaución la mayoría de las veces
está de sobra, pues lo más que puede pasar con el nuevo kernel es que
algún dispositivo no nos funcione o se nos haya olvidado, pero siempre
arrancará y podremos volver a compilarlo sin problemas.
Para compilar el kernel se deben de tener instalados los fuentes y
ficheros de cabecera del kernel. En RedHat (a título de ejemplo) estos
paquetes se llaman:
kernel-2.0.36-0.7.i386.rpm
kernel-headers-2.0.36-0.7.i386.rpm
kernel-source-2.0.36-0.7.i386.rpm
(variando la versión según la que tengamos instalada). Todo el
proceso de compilación debe hacerse en el directorio /usr/src/linux, y
se basa en una serie de comandos y configuraciones que se realizan
de una forma muy rápida y sencilla. Para modificar las opciones
que debe llevar el nuevo kernel, y siempre dentro del directorio
/usr/src/linux, podemos optar entre 3 formas de configuración, cada
una de las cuales más visual que la anterior. Los 3 comandos son:
make config
make menuconfig
make xconfig
El primero de ellos se basa en la consola en modo texto y funciona a
base de preguntas a las que contestaremos y/n/m. El segundo funciona a
base de menúes y el tercero (para X Window) se realiza mediante un
interface muy visual en Tcl/Tk. Elegiremos uno de los tres tecleando
el comando correspondiente, tras lo que el sistema nos preguntará el
valor para las diferentes opciones para el kernel, a las que
contestaremos con SI (incluir en el kernel), NO (no incluir en el
kernel) o MODULO (compilarlo pero no incluirlo, para poder incluirlo
en cualquier otro momento con insmod). Los módulos se usan para
opciones que no se utilicen habitualmente, como por ejemplo una unidad
zip, pero cosas como las tarjetas de sonido deberían incluirse
directamente en el kernel (ocupando memoria).
Las opciones se agrupan en subsecciones generales, de red, de
sonido, etc. en las cuales tendremos que elegir los parámetros
correspondientes al hardware instalado en nuestro PC. Si por ejemplo
no tuviésemos impresora pero en el futuro pensaramos adquirir una, es
posible compilar el soporte para puerto paralelo como módulo para
poder insertarlo más adelante. Por otra parte, una elección casi
siempre imprescindible es la de Sistema de ficheros iso9660, vfat y
codepages 437, 850 y NLS ISO-8859-1 para poder montar cdroms y
unidades con nombres largos o FAT32. Además en cualquier opción
podemos pulsar F1 para obtener ayuda (según el make realizado) sobre
el tema en cuestión, que además normalmente nos informará el tamaño
que ocuparía dicha opción en el kernel en caso de ser activado y lo
que es recomendado en ese caso.
Tras elegir las opciones salimos grabando (Save and Exit) y
tecleamos los comandos para comenzar la compilación:
make dep clean zImage
Al final del proceso (unos 5 minutos en un P200) saldrá algo como:
System is 502Kb size.
System copied in /usr/src/linux/arch/i386/boot/zImage
También es posible que la compilación del kernel se aborte dando
algún error. Eso suele pasar por motivos muy sencillos: no es un fallo
de la compilación del kernel en sí mismo sino que hemos elegido
alguna opción (o no) que se contradice con otra opción previamente
elegida. Un ejemplo típico de esto es dar soporte para la tarjeta
de sonido y luego decir N a la opción "/dev/audio y /dev/dsp
support". Como estos ficheros son necesarios para la tarjeta de sonido
y sin ellos no puede continuar la compilación, obtenemos un error en
la sección SOUND_CONFIG y se aborta la compilación. Para solucionarlo
basta con hacer de nuevo el make xconfig/config/menuconfig y corregir
nuestro fallo.
Cuando el kernel es muy grande (ocurre cuando seleccionamos muchas
opciones, pocos modulos, o en los ultimos kernels 2.2.x) en lugar de hacer
make zImage debemos decirle a Linux que el kernel va a ser mayor de
512Kb y reemplazar la compilacion del kernel por:
make dep clean bzImage
(lo cual creara un fichero bzImage en lugar de un fichero zImage,
siendo ambos indiferentes en cuanto al resto de compilacion del kernel).
Las diferentes secciones que suelen encontrarse en el make
config/xconfig/menuconfig son:
Code maturity level options:
-> Opciones para permitir drivers en desarrollo.
Loadable module support:
-> Opciones sobre permitir la utilización de módulos.
General setup:
-> Cosas generales: emulado de copro, tipo de procesador, etc.
Floppy, IDE, and other block devices:
-> Unidades IDE y ATAPI.
OJO: El soporte para IDE o SCSI debe ir como Y (no como módulo).
Networking options:
-> Opciones de red.
SCSI support:
-> Soporte para dispositivos SCSI.
Network device support:
-> Propiedades de red.
ISDN subsystem:
-> Para tarjetas ISDN.
CD-ROM drivers (not for SCSI or IDE/ATAPI drivers):
-> Drivers CDROM para unidades no IDE, ATAPI o SCSI.
Filesystems:
-> Sistemas de ficheros: vfat, msdos, ext2, etc...
OJO: El soporte para ext2 debe ir como Y (no como módulo).
Character devices:
-> Config. De impresora, mouse no serie, etc.
Sound:
-> Parámetros de la tarjeta de sonido.
Kernel hacking:
-> Extras avanzados para desarrolladores del kernel.
Si el kernel excede de 512Kb se nos notificará un error y deberemos
realizar la compilación con make bzImage o bien quitar alguna opción
hasta que entre dentro de este rango (máx. 512Kb). El último mensaje
nos indica dónde se ha almacenado el kernel nuevo, que copiaremos a un
lugar más accesible para lilo:
cp arch/i386/boot/zImage /boot/zImage
(o bien cp arch/i386/boot/bzImage /boot/bzImage)
Tras esto debemos modificar el fichero /etc/lilo.conf para que
se arranque con el nuevo kernel. Veamos un sencillo fichero
/etc/lilo.conf:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=linux
image=/boot/zImage
label=linux
root=/dev/hda5
initrd=/boot/initrd-2.0.34-0.7.img
read-only
other=/dev/hda1
label=win
table=/dev/hda
(tambien puede ser image=/boot/bzImage)
Como puede verse, su estructura es muy sencilla. Las primeras líneas
(boot, map, install) son indicativas para el lilo. Con timeout = 50
hace que lilo espere en el arranque 5 segundos para que el usuario
elija el S.O. con que arrancar. Pasados estos arrancará el que haya
por defecto (opción default). Por último image indica con qué kernel
arrancar, y esta es la línea a cambiar por /boot/zImage. Tras esto se
ejecuta lilo -v en la línea de comandos para actualizar los cambios
realizados en el fichero (obligatorio). Por otra parte, no sólo
podemos machacar el kernel anterior cambiando la etiqueta, sino que
podemos añadir una nueva entrada con otra etiqueta para arrancar
cualquiera de los 2 kernels (man lilo para más información).
Por último, para compilar los módulos existentes se deben ejecutar
los siguientes comandos:
make modules modules_install
depmod -a
Este último comando es recomendable que se ejecute siempre durante el
arranque de Linux para resolver las dependencias entre módulos, con
lo que se recomienda escribir el comando depmod -a al final de
algún fichero de arranque como /etc/rc.d/rc.local u otro según
distribuciones.
Tras esto se puede rearrancar y comprobar el kernel que se está
usando con el comando uname -a:
uname -a
Linux compiler.linux.es 2.0.36 #4 mar dic 8 21:12:22 i586 unknown
Y ya podemos disfrutar del nuevo kernel.
Santiago Romero
NOTA PARA USUARIOS DE DEBIAN:
From: Ramon Fernandez - woody@ieeesb.etsit.upm.es
Subject: Recompiling mini-HOWTO :)
Los usuarios de Debian lo tenemos mas facil: instalamos el
paquete kernel-package, y despues de configurar el kernel con
"make menuconfig" o similar, ejecutamos:
make-kpkg kernel_image
Y en el directorio padre se crea un paquete Debian que contiene el
kernel recompilado, los modulos y todo lo demas. Despues, solo
hay que ejecutar:
dpkg -i ../kernel-image-2.2.9_1.00_i386.deb (por ejemplo)
y se instala el nuevo kernel, se instalan los modulos y se crean
los enlaces pertinentes: si teniamos
/vmlinux -> boot/vmlinuz-2.0.0
/vmlinux.old -> boot/vmlinuz-2.0.36
la cosa se queda como
/vmlinux -> boot/vmlinuz-2.2.9
/vmlinux.old -> boot/vmlinuz-2.0.0
Tan solo hay que ejecutar "lilo" y rearrancar. Nada de "make dep"
ni otras historias. Facil, no? :)
Un saludo.
--
Ramón Fernández Marina
IEEE Student Member
Volver a la página de Linux.
|