Actualización del kernel de GNU/Linux

Escrito por Pablo Chamorro (pchamorro@users.sourceforge.net)

El kernel o núcleo es la parte esencial de un sistema operativo. El kernel proporciona todos los servicios básicos requeridos por otras partes del sistema operativo y aplicaciones, y en complemento, se encarga de la administración de la memoria, los procesos y los discos.  El kernel es independiente de la distribución GNU/Linux utilizada, de tal forma que el mismo kernel debería servir en cualquier caso. La actualización del kernel se divide en 2 partes: compilación e instalación del nuevo kernel.
  • Introducción
  • Compilación del kernel
  • Instalación del nuevo kernel
  • Referencias

  • Introducción

    1. Acerca de esta guía
    En esta guía se desarrolla el ejemplo de la compilación del kernel versión 2.2.18 bajo Red Hat 6.1 (kernel 2.2.12). Si desea compilar un kernel 2.4.x bajo un sistema con kernel 2.2.x deberá consultar otros documentos que tratan específicamente sobre el tema.

    De cualquier forma al final de este instructivo se presentan algunas referencias de documentos disponibles en Internet para mayor ilustración.

    2. Porqué compilar.
    Hay diversas razones para querer reconstruir el kernel de GNU/Linux:

    Es útil recompilar un kernel porque trabajando con kernels nuevos generalmente se obtiene:

    1. Un sistema más rápido, estable y robusto.
    2. Un sistema con soporte a elementos de hardware no encontrado en kernels viejos.
    3. Un sistema con soporte a características especiales disponibles pero no habilitadas en kernels viejos.

    Una alternativa a recompilar el kernel es instalar una nueva versión de la distribución GNU/Linux que esté utilizando. Dependiendo de las circunstancias puede resultar conveniente o preferible lo uno o lo otro. Por ejemplo, si tiene un sistema GNU/Linux que le costó esfuerzo y tiempo para instalar y configurar, y no desea volver a realizar todo ese trabajo otra vez, es posible que recompilar el kernel sea lo más sencillo para dar solución a su necesidad particular.

    Recompilar el kernel de GNU/Linux no es más que personalizar el kernel y como con cualquier aplicación, la personalización se hace para sacar un mayor provecho de las diferentes características que ofrece el software.

    En forma particular, se sabe que algunas versiones de GNU/Linux Red Hat no están optimizadas para procesadores Pentium, siendo recomendable recompilar su kernel.

    Importante: Si usted no tiene experiencia compilando el kernel es recomendable que utilice un equipo donde usted pueda practicar sin temor de que su sistema eventualmente vaya a quedar estropeado. No hay ningún riesgo al compilar el kernel (salvo que se quede sin espacio), en cambio, la instalación del mismo debe de realizarse con algo de cuidado.

    3. Versiones de producción y de desarrollo.
    Los kernels pueden corresponder a versiones de "producción" o a versiones de "desarrollo". Las versiones 2.0.x, 2.2.x y 2.4.x son versiones de producción, por el contrario, las versiones 2.1.x y 2.3.x son versiones de desarrollo. En forma particular se tiene que, por ejemplo, la versión 2.2.17 o la versión 2.2.18 son versiones de producción, estables y para usuarios finales y las versiones 2.1.1 o 2.1.2 corresponden a versiones de desarrollo, inestables, utilizadas por desarrolladores o por ciertos usuarios que desean probar.

    Importante: No utilice kernels de desarrollo a menos que usted sepa lo que está haciendo.

    4. Acerca de los módulos
    Varias partes de código del kernel pueden compilarse por separado en forma de módulos, dando flexibilidad al sistema. Los módulos no están enlazados directamente en el kernel, siendo necesario insertarlos en él ya sea durante el proceso de arranque o si se quiere, posteriormente, de tal forma que sólo se usan cuando se necesitan, sin utilizar innecesariamente la memoria RAM del sistema.

    Importante: Hay componentes que no deben compilarse como módulos porque son escenciales para hacer posible el arranque del sistema, por ejemplo el soporte para el sistema de archivos ext2, que GNU/Linux utiliza en forma predeterminada. Otros componentes si pueden hacerlo, por ejemplo, el soporte para una cierta tarjeta de red.

    4. Software requerido
    Los requerimientos de software necesario para compilar el kernel varian considerablemente de una versión mayor del kernel a otra, por ejemplo para compilar un kernel 2.4.x bajo un sistema con kernel 2.2.x. Si es esa su necesidad, es mejor que consulte la nota respecto a la instalación de kernels 2.4.x, en la sección de Introducción de este documento.

    Para compilar un nuevo kernel correspondiente a una misma versión mayor del kernel, como es el caso del ejemplo escogido (instalar kernel 2.2.18 bajo Red Hat 6.1/kernel 2.2.12), seguramente no necesitará software adicional al incluido en la distribución GNU/Linux que esté empleando.

    En cualquier caso es recomendable consultar primero el archivo README principal incluido en los fuentes del kernel a instalar bajo el directorio base linux.

    5. Tiempo de compilación
    El tiempo necesario para compilar es muy variable, dependiendo del computador que se vaya a utilizar. En computadores recientes, por ejemplo en equipos Pentium Celeron o superiores, el proceso toma 10 minutos o menos. Tenga en cuenta que si utiliza computadores poco recientes, por ejemplo en equipos Pentium viejos, 486s y 386s el proceso puede tardar incluso varias horas.
    6. Espacio en disco requerido
    El espacio necesario para compilar el kernel varía de acuerdo a la versión del kernel a utilizar. Los fuentes del kernel 2.2.18 ocupan cerca de 92 MB, así que para este caso tomado de ejemplo sería bueno disponer de al menos unos 100 MB libres.

    Compilación del kernel

    Estrictamente hablando, para compilar el kernel no se necesita ser root ya que se puede realizar desde el directorio de un usuario, siempre y cuando se disponga de suficiente espacio en disco y de las herramientas de compilación instaladas. En este instructivo se utiliza la cuenta del root para efectos prácticos.
    1. Obtención y descompresión de los fuentes
    Obtenga una copia del código fuentes del kernel de http://www.kernel.org o de alguno de los servidores alternos listados en  http://www.kernel.org/pub/mirrors/. Para el ejemplo, para el kernel versión 2.2.18 el archivo a obtener es ya sea linux-2.2.18.tar.bz2 (empaquetado con tar y comprimido con bzip2) o linux-2.2.18.tgz (empaquetado con tar y comprimido con gzip). Los archivos comprimidos con bzip2 normalmente son de menor tamaño.
    2. Descompresión de los fuentes
    Antes de proceder a su descompresión, verifique que disponga de 70 o más MBytes libres en el disco duro, por ejemplo con el comando df:

    [root@linux]# df

    Importante: Normalmente el directorio donde se descomprimen los fuentes del kernel es /usr/scr. Los archivos fuentes del kernel crean una estructura de directorios a partir de /usr/src/linux, lo que puede resultar inconveniente si (1) ya existe un vínculo o un directorio con ese nombre y (2) al desempaquetar se sobreescriben archivos.

    Luego de seleccionar el directorio de trabajo proceda a descomprimir de la siguiente forma:

    (1) Si decidió trabajar con el archivo linux-2.2.18.tar.bz2, desempaquete y descomprima utilizando mediante:

    [root@linux]# bzcat linux-2.2.18.tar.bz2 | tar -xvf -

    Alternativamente puede ejecutar:

    [root]# tar --use-compress-program bunzip2 -xvf linux-2.2.18.tar.bz2

    (2) Si optó por usar el archivo linux-2.2.18.tgz, el comando a utilizar es:

    [root]# tar -zxvf linux-2.2.18.tgz

    3. Creación de un archivo de configuración
    La definición de la configuración del nuevo kernel es el punto crucial de la compilación. Una buena configuración se alcanza sólamente: (1) si tiene a la mano todos los datos del hardware que el kernel va a soportar: puertos, discos duros, tarjetas, etc. (2) si define qué características ofrecidas van a ser soportadas por el nuevo kernel, ya sea directamente dentro del núcleo o como módulos.

    Las alternativas para configurar el nuevo kernel corresponden a los comandos:

    El comando make config ofrece un interfaz primitivo basado en modo texto, sin ayuda ni menús. Los comandos make menuconfig y make xconfig conducen a mejores interfaces de usuario, con menús y quizá lo más importante, con una ayuda contextual que facilita en gran medida la configuración.

    Para el ejemplo se utiliza make menuconfig, porque ofrece un interfaz amigable al usuario al igual que make xconfig, pero resulta más práctica si no se dispone o no se quiere utilizar X Windows. Antes de proceder a ejecutar este comando, cámbiese al directorio apropiado:

    [root]# cd linux

    Ahora si ejecute:

    [root]# make menuconfig

    Las diferentes opciones disponibles a partir del menú inicial se presentan en forma ampliada en la siguiente figura:

     Linux Kernel v2.2.18 Configuration
    -----------------------------------------------------------------------------
     +------------------------------- Main Menu -------------------------------+
     |  Arrow keys navigate the menu.  <Enter> selects submenus --->.          |
     |  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, |
     |  <M> modularizes features.  Press <Esc><Esc> to edit, <?> for Help.     |
     |  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable     |
     | +---------------------------------------------------------------------+ |
     | |           Code maturity level options  --->                         | |
     | |           Processor type and features  --->                         | |
     | |           Loadable module support  --->                             | |
     | |           General setup  --->                                       | |
     | |           Plug and Play support  --->                               | |
     | |           Block devices  --->                                       | |
     | |           Networking options  --->                                  | |
     | |           Telephony Support  --->                                   | |
     | |           SCSI support  --->                                        | |
     | |           I2O device support  --->                                  | |
     | |           Network device support  --->                              | |
     | |           Amateur Radio support  --->                               | |
     | |           IrDA (infrared) support  --->                             | |
     | |           ISDN subsystem  --->                                      | |
     | |           Old CD-ROM drivers (not SCSI, not IDE)  --->              | |
     | |           Character devices  --->                                   | |
     | |           USB support  --->                                         | |
     | |           Filesystems  --->                                         | |
     | |           Console drivers  --->                                     | |
     | |           Sound  --->                                               | |
     | |           Kernel hacking  --->                                      | |
     | |           ---                                                       | |
     | |           Load an Alternate Configuration File                      | |
     | |           Save Configuration to an Alternate File                   | |
     | +-----------v(+)------------------------------------------------------+ |
     +-------------------------------------------------------------------------+
     |                    <Select>    < Edit >    < Help >                     |
     +-------------------------------------------------------------------------+

    Un ejemplo de uno de los submenús expandido (Processor type and features)se aprecia en seguida:

    +---------------------- Processor type and features ----------------------+
    |  Arrow keys navigate the menu.  <Enter> selects submenus --->.          |
    |  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, |
    |  <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.     |
    |  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable     |
    +-------------------------------------------------------------------------+
    | |   (PPro/6x86MX) Processor family                                    | |
    | |   < > /dev/cpu/microcode - Intel P6 CPU microcode support (NEW)     | |
    | |   < > /dev/cpu/*/msr - Model-specific register support (NEW)        | |
    | |   < > /dev/cpu/*/cpuid - CPU information support (NEW)              | |
    | |   (1GB) Maximum Physical Memory                                     | |
    | |   [ ] Math emulation                                                | |
    | |   [ ] MTRR (Memory Type Range Register) support                     | |
    | |   [*] Symmetric multi-processing support                            | |
    +-------------------------------------------------------------------------+
    |                    <Select>    < Exit >    < Help >                     |
    +-------------------------------------------------------------------------+

    En esta pantalla se puede apreciar por ejemplo que en forma predeterminada se ha desactivado la emulación matemática (Math emulation) y que si se desea habilitar ésta quedaría incluida necesariamente dentro del kernel y no como un módulo (como lo indican los parentesis rectangulares de esa opción), contrario a las opciones que están acompañadas por parentesis angulares (<>), que pueden compilarse o no como módulos si se desea.

    Continuando con el ejemplo, si se ingresa al sub-menú Processor Family, se aprecian las siguientes opciones:

    +------------------------- Processor family -------------------------+
    |  Use the arrow keys to navigate this window or press the hotkey of |
    |  the item you wish to select followed by the <SPACE BAR>. Press    |
    |  <?> for additional information about this option.                 |
    +--------------------------------------------------------------------+
    | |                      ( ) 386                                   | |
    | |                      ( ) 486/Cx486                             | |
    | |                      ( ) 586/K5/5x86/6x86                      | |
    | |                      ( ) Pentium/K6/TSC                        | |
    | |                      (X) PPro/6x86MX                           | |
    +--------------------------------------------------------------------+
    |                       <Select>      < Help >                       |
    +--------------------------------------------------------------------+

    En definitiva el procedimiento a seguir es entonces:

    (1) Con la ayuda de las teclas de movimiento del cursor y la tecla [Enter] recorra todas y cada una de las opciones de los submenús disponibles a partir del menú principal,

    (2) Con la ayuda de la barra espaciadora defina si habilita o no el soporte para una u otra característica, y si lo hace en forma integrada al kernel o en forma modular si desea y es posible.

    Al oprimir la barra espaciadora una o varias veces según se necesite, es posible que visualice:

    (3) Cuando haya llevado a cabo por completo los puntos 1 y 2, desde el menú principal seleccione la opción exit y responda con Y (de Yes) para grabar la configuración resultante en el archivo .config. , de lo contrario tendrá que volver a realizar todo el proceso otra vez.

    El procedimiento es dispendioso pero necesario.

    4. Una guía de apoyo para definir un archivo de configuración
    La ayuda contextual de disponible con make menuconfig o con make xconfig es quizá lo suficientemente apropiada para facilitar el proceso de definición del archivo de configuración, no obstante aquí se presenta alguna ilustración adicional.
    5. Compilación
    Como se mencionó, no se necesita ser root para compilar el kernel. En este ejemplo se muestran los comandos a nombre del root.

    (1) Para compilar el kernel ejecute primero:

    [root]# make dep

    O mejor, para poder observar de mejor forma la salida y eventuales errores, ejecute:

    [root]# make dep 1> dep-salida.txt 2>dep-errores.txt

    (2) Ahora compile el kernel mediante:

    [root]# make bzImage

    o mejor, por ejemplo mediante:

    [root]# make bzImage 1> bzImage-salida.txt 2>bzImage-errores.txt

    Es necesario mencionar que make bzImage no es la única opción. Consulte la documentación disponible bajo el directorio linux/Documentation para obtener alguna información al respecto.

    Al ejecutar bzImage se generan entre otros, el kernel linux/arch/i386/boot/bzImage y el archivo linux/System.map, para instalar posteriormente bajo el directorio /boot.

    (3) Si se habilitaron los múdulos, ejecute:

    [root]# make modules

    o si prefiere:

    [root]# make modules 1> modules-salida.txt 2>modules-errores.txt

    Instalación del nuevo kernel

    Por el contrario, la instalación del nuevo kernel es tarea que sólo el root puede realizar.
    1. Instalación de los archivos del kernel
    (1) Para comenzar de un vistazo al contenido del directorio /boot y tome atenta nota de ello. Note que algunos archivos son vínculos simbólicos.

    [root]# ls -l /boot

    Algunos de los archivos allí contenidos son:

    lrwxrwxrwx   1 root  root       20 Nov 12 09:34 System.map -> System.map-2.2.12-20
    -rw-r--r--   1 root  root   191102 Sep 27  1999 System.map-2.2.12-20
    lrwxrwxrwx   1 root  root       17 Nov 12 09:34 vmlinuz -> vmlinuz-2.2.12-20
    -rw-r--r--   1 root  root   622784 Sep 27  1999 vmlinuz-2.2.12-20

    (2) Mire el contenido del archivo /etc/lilo.conf, dando como un hecho que se está utilizando Lilo:

    [root]# cat /etc/lilo.conf

    Por ejemplo, ese archivo podría contener:

    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    default=linux

    image=/boot/vmlinuz-2.2.12-20
            label=linux
            initrd=/boot/initrd-2.2.12-20.img
            read-only
            root=/dev/hda9

    (3) Desde el directorio linux utilizado, proceda a copiar el archivo bzImage generado durante la compilación dentro del directorio /boot. Por ejemplo, de esta forma:

    [root]# cp -i arch/i386/boot/bzImage /boot/vmlinuz-2.2.18

    (4) Desde el directorio linux utilizado, proceda a hacer lo propio con el archivo  System.map. Por ejemplo, de esta forma:

    [root]# cp -i System.map /boot/System.map-2.2.18

    2. Instalación de los módulos del kernel
    (5) Ahora proceda a instalar los módulos. Si está instalando un kernel de la misma versión del que ya tiene en el sistema, ejecute primero, por ejemplo:

    [root]# mv /lib/modules/2.2.12-20 /lib/modules/2.2.12-20.old

    y luego si:

    [root]# make modules_install

    3. Edición del archivo /etc/lilo.conf e instalación de un nuevo MBR
    (6) Edite el archivo /etc/lilo.conf y adicione una nueva sección para el nuevo kernel, para el ejemplo, así:

    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    default=nuevo

    image=/boot/vmlinuz-2.2.12-20
            label=linux
            initrd=/boot/initrd-2.2.12-20.img
            read-only
            root=/dev/hda9

    image=/boot/vmlinuz-2.2.18
            label=nuevo
            read-only
            root=/dev/hda9

    Note el cambio realizado en la línea default.

    (7) Ubíquese dentro del directorio /boot:

    [root]# cd /boot

    (8) Cambie los vínculos simbólicos asociados, si desea realizando una copia de respaldo de ellos, con estos comandos:

    [root]# ln -sfb vmlinuz-2.2.18 vmlinuz
    [root]# ln -sfb System.map-2.2.18 System.map

    Los archivos de respaldo generados son: vmlinuz~ y System.map~.

    (9) Pruebe sin llevar a cabo la instalación del nuevo MBR ejecutando:

    [root]# /sbin/lilo -t -v

    (10) Si no observó nada anormal proceda a la instalación del nuevo MBR ejecutando:

    [root]# /sbin/lilo

    (11) Reinicie el sistema.

    Si en un dado caso tuviera problemas con el nuevo kernel puede arrancar utilizando el kernel anterior, escribiendo linux frente al indicador de lilo, cuando apenas se inicie el arranque.

    Referencias

  • The Linux Kernel HOWTO: http://linuxdoc.org/HOWTO/Kernel-HOWTO.html

  •  
  • New Linux Kernel Introduced:  http://www.linux.com/live/newsitem.phtml?sid=1&aid=11762

  •  
  • Kernel Upgrade: Know Your Hardware: http://www.linux.com/hardware/newsitem.phtml?sid=26&aid=11532

  •  
  • Configuring The Kernel For Your Needs: http://www.byte.com/column/BYT20000829S0006

  •  
  • Compiling the Linux kernel: http://freeos.com/articles/2589/2/1-3/

  •  
  • Rebuilding the Linux Kernel for Complete Newbies: http://www.gnulinux.com/help/kernel_recompile.shtml

  •  
  • Compiling the Kernel: Part 2: http://www.linux.com/newsitem.phtml?sid=60&aid=8931

  •  
  • Compiling Linux 2.2 Kernel: http://www.zdnet.com/zdhelp/stories/main/0,5594,2213046,00.html

  • Copyright (c) 2001 Pablo Chamorro
    Se permiten copias idénticas de este escrito en cualquier medio, mientras se preserve esta nota.