=========================================
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.