Si ya posees experiencia en GNU/Linux y sistemas operativos podrías saltar esta sección he ir directamente a la siguiente sección. Cuando hablamos de "Linux" es frecuente que lo referenciemos al Sistema Operativo con sus aplicaciones y no al núcleo del sistema. Realmente, Linux es solamente el núcleo del sistema (también denominado kernel). Éste es el componente más importante y es quien hace funcionar al sistema. Entre las funciones más importantes del kernel linux (también aplica a la mayoría de los núcleos) estan:
Aunque estas no son las únicas, si son las más importantes. El kernel Linux se caracteriza por recibir grandes cantidades de actualizaciones en muy poco tiempo, comúnmente contienen nuevos módulos, mejoras de seguridad, administración de recursos, otras. ¿Cómo saber que incorpora cada nuevo Kernel que se libera? Observando el archivo llamado ChangLog que está dentro del paquete en donde descargamos el kernel, también se puede ver en la página oficial del proyecto. Es frecuente encontrar usuarios novel preguntando si es necesario compilar el kernel cada vez que liberan una versión, esto es falso. Solamente se compila cuando tenemos dispositivos de hardware muy recientes y nos vemos forzados a migrar a una versión que incluya módulos con soporte para estos. Otra razón es que poseemos uno muy viejo y optamos por actualizarlo para poseer mejoras con la administración de memoria, de procesos y de recursos. Por ejemplo, actualmente ocurre esto con la rama 2.4 y 2.6 del kernel. Muchos servidores poseen la 2.4 y compilan la versión de la rama (2.6.X) motivo a que este administra de manera más eficaz la memoria y recursos.
El kernel NO se actualiza, si quieres una nueva versión tienes que descargarla de la página oficial del proyecto y compilarla. Sino buscar un paquete con una versión ya compilada para tu arquitectura de hardware.
Compilar un kernel a la manera Debian (a la debian way, como dicen muchos) y no hacerlo a la manera clásica nos proporciona muchas ventajas, ya que este se empaqueta automáticamente, es decir, se crea un un paquete con extensión .deb. El hecho de que se genere un paquete con nuestro kernel compilado hace que:
dpkg -r TU_KERNEL. Donde TU_KERNEL es el nombre que le diste al paquete(ya más adelante detallaremos esto). Para eliminar el kernel también puedes utilizar herramientas como apt-get, aptitude, o mejor aún Synaptic para los usuarios novel que están comenzando en el mundo de Linux (o los que se sientan cómodos usándolo).
Por ejemplo, si tienen 20 máquinas en su oficina y necesitan actualizarle el kernel, es poco práctico compilarlo en cada computador, pero es más cómodo e inteligente crear un kernel genérico el cual proporcione un paquete donde podamos distribuirlo en todas las máquinas mediante CDs, servidor Web, FTP, samba, pendrive o algún otro medio. De manera de poderle instalar rápidamente (en pocos segundos si no surge error) el kernel a las máquinas.
Para compilar un nuevo kernel una condición sine qua non es descargar el código fuente del mismo, para eso vamos a la página oficial del proyecto donde se encuentran todos los kernel oficiales de Linux, desde la primera versión hasta la última. Cuando los descarguemos vendrá empaquetado y comprimido en alguno de los siguientes formatos: .tar.bz2 o .tar.gz . Es indiferente cual se descarguen, explicaré como descomprimir y desempaquetar ambos tipos de formato.
Lo común es que descomprimas el kernel en el directorio /usr/src, aunque tienes la libertad de hacerlo en otro directorio. Actualmente he descargado y desempaquetado la versión 2.6.15 en /usr/src, directorio donde se trabaja para todo lo que tiene que ver con kernel y los módulos.
tar xvzf linux-2.6.15.tar.gz
tar xvjf linux-2.6.15.tar.bz2
Notar la j para el de extensión .tar.bz2
cd linux-2.6.15
Una vez dentro del directorio, necesitamos limpiarlo de todo archivo de configuración que tenga.
NOTA: Podemos obviar este paso para la primera vez que nos lo descarguemos, ya que este viene completamente listo para compilar. Pero una vez que terminas la compilación y por cualquier razón quieres volver a compilarlo, no es necesario que tengas que descomprimirlo y desempaquetarlo de nuevo, puedes reutilizar ese mismo código y es allí cuando tienes que eliminar (limpiar) todos los archivos que se generaron con la compilación anterior.
Para "limpiar" los fuentes del kernel:
make mrproper
Ahora tenemos que configurarlo, esto quiere decir que decidamos que módulos queremos que tenga (o que no tenga) una vez compilado. Como es característico del Software Libre, tenemos varias maneras de hacer las cosas y no estamos atados a sólo un método. Aquí les explico las 3 formas de configurar el kernel:
1era alternativa: make config <-- Hay que tener algo de experiencia, si no la tienes no te recomiendo seguir este camino ya que hace muchas preguntas de hardware.
2da alternativa: make menuconfig <-- Es muy cómodo hacer la configuración por este método porque posees un menú muy sencillo he interactivo. NOTA: Necesitas tener instalado las las librerías ncurses, en debian: aptitude install libncurses5-dev
3ra alternativa: make xconfig <-- Debes tener instalado y en funcionamiento el servidor X, ya que toda la configuración se hace gráficamente (haciendo uso del sistema de ventanas). NOTA: Necesitas tener instaladas las librerías QT, en debian aptitude install libqt3-dev
4ta alternativa: Animate a crearla, ¿cuántas más alternativas quieres?
Para la configuración utilizaré la segunda forma, como lo hago siempre, por supuesto estás en la libertad de utilizar la que quieras. Sin embargo te recomiendo el segundo método debido a que no necesitas estar en entornos de escritorio ni tener funcionando el servidor X, además que tiene una interfaz muy simple e interactiva.
Para comenzar la configuración:
make menuconfig
Cuando se dediquen a configurar el kernel sean muy cuidadosos seleccionando cuales módulos quieren tener. Si tenemos dispositivos como FlashDrive (o Pendrive) es indefectible activar el soporte SCSI (específicamente soporte para discos SCSI), ya que estos son emulados como discos SCSI en Linux. Si desactivas el soporte para CDROM, evidentemente la unidad de CDROM no funcionaría una vez instalado. De igual manera pasa si desactivamos el soporte USB, no funcionaría todo los que conectemos por el puerto USB.
Terminada la configuración del kernel lo compilaremos, debido a que lo estamos haciendo a la "Debian way" es necesario que tengamos instalado un paquete llamado kernel-package, el cual suministrará las herramientas necesarias para poder compilar y generar el paquete con nuestro kernel, para instalarla: aptitude install kernel-package. Antes de comenzar la compilación debemos estar en el directorio donde se encuentra el código fuente del kernel y luego ejecutar lo siguiente:
make-kpkg clean
make-kpkg --initrd kernel_image kernel_headers
Los que han compilado un kernel anteriormente de Linux (no a la debian way) este comando equivale a: make dep, make clean, make bzImage y make modules
La opción --initrd crea una imagen initrd en el paquete que se guardará en /boot cuando instalemos el kernel (recordar que solo estamos compilándolo, no instalándolo).
El comando anterior creará dos paquetes con extensión .deb en el directorio superior. Un paquete será el kernel y el otro los kernel-headers.
La opción de kernel_headers es opcional, yo la utilizo debido a que muchos programas y módulos necesitan tener los headers del kernel que se está usando para poder ser instalados, ejemplo: el driver de nvidia, VMware, ndiswrapper, madwifi, otros. Si no tienes pensado instalar a futuro algún módulo no necesitarás esta opción y puedes borrarla del comando anterior.
NOTA: El tiempo de compilación es directamente proporcional a la configuración que hayas hecho y al poder de cómputo que poseas. Si agregaste muchos módulos se demorará más. Hay que tener paciencia, es muy frecuente que se tarde bastante.
Una vez que termina la compilación y corroborada la exitosa existencia de los dos paquetes en el directorio superior es el momento de instalarlo. La instalación es muy trivial, debemos ejecutar en el directorio donde están los paquetes:
dpkg -i TU_KERNEL.deb
dpkg -i TU_KERNEL-HEADERS.deb
Por ejemplo, en mi caso fue así:
dpkg -i kernel-image-2.6.15_10.00.Custom_i386.deb
dpkg -i kernel-headers-2.6.15_10.00.Custom_i386.deb
Module Assistant es una herramienta para el manejo y gestión de módulos ya empaquetados (sus fuentes) para Debian. Dicho en otras palabras: Nos permite compilar, construir, instalar y cargar módulos del kernel sin necesidad de reiniciar el computador. No debemos olvidar que module-assistant sólo permite gestionar los módulos que están preparados para Debian.
Para entender como funciona, me propuse hacer un ejemplo con algún módulo, escogí uno que permite hacer uso de cualquier tarjeta inalámbrica que implemente chipset atheros. Así, los módulos de madwifi ya preparados para debian que se encuentran en los repositorios oficiales (en la sección de non-free) nos permitirán utilizar nuestra tarjeta.
Debemos instalar (descargar) el código fuente de los módulos madwifi, para eso instalaremos el paquete madwifi-source el cual trae empaquetado la fuente de estos módulos. Motivo que es condición sine qua non que el módulo deba estar preparado para debian, es frecuente que la mayoría de los que queramos instalar estén en los repositorios oficiales de Debian.
aptitude install madwifi-source
Se descargará e instalará el paquete con las fuentes de los módulos en /usr/src/modules/madwifi. Si entran al directorio de las fuentes podrán notar una carpeta debian/ la cual contiene las reglas para la construcción del paquete, por eso hice tanta referencia en que module-assistant debe ser usado para módulos preparados únicamente para debian o derivados.
m-a prepare madwifi
El argumento prepare determinará si tenemos todo lo necesario para la compilación del módulo, si no, module-assistant se encarará de instalar lo que haga falta. Es muy típico que nos falten los cabeceras del kernel (kernel-headers), ya estas se se necesitan para construir todos los módulos (no sólo de madwifi). Una ves corroborado por m-a que tenemos todo lo necesario para compilar el módulo procedemos a compilarlo:
m-a build madwifi
La compilación generará un paquete .deb (paquete de debian) el cual contiene el módulo para nuestro kernel, lo que faltaría es instalar el paquete y cargar el módulo para usarlo (no hace falta reiniciar el computadora).
m-a install madwifi
Con esto ya tienes el módulo instalado y listo para funcionar funcionar. El último comando lo que hace es instalar el paquete .deb al que hicimos referencia anteriormente.
Consulta la sección de tips para encontrar una manera mas resumida de ejecutar todos estos pasos ;-)
Aplicar un parche es muy sencillo, tenemos que hacer uso del programa patch. Es muy probable que ya lo tengamos instalado en nuestro sistema, de no ser así:
aptitude install patch
Una ves hecho eso podrías aplicar el parche de dos formas distintas:
Una vez que tengamos el parche que queramos aplicar (normalmente un archivo .patch), sería mucho más cómodo copiarlo al directorio donde están las fuentes del kernel (depende donde no los hayamos descargado, siguiendo el tutorial es en /usr/src/linux-version) y ejecutar:
make-kpkg --initrd --added-patches=MI-PARCHE kernel_image kernel_headers
make-kpkg se encargará de aplicar el parche y compilar el kernel nuevamente, notar que es le mismo comando que hemos venido usando a lo largo del tutorial. El argumento --added-patches= deberás colocar, separado por comas, los parches que le quieres aplicarle al kernel.
Una vez que tengamos el parche que aplicaremos (normalmente un archivo .patch), sería mucho más cómodo copiarlo al directorio donde están las fuentes del kernel (depende donde no los hayamos descargado, siguiendo el tutorial es en /usr/src/linux-version) y ejecutar:
patch -p0 < nombre-del-parche.patch
Luego debes recompilar el kernel siguiendo la práctica explicada en todo el tutorial.
make-kpkg para compilar el kernel puedes leer las páginas del manual que están completamente en español. Para eso: man make-kpkg
.config(recuerden el "." que es importante, sin él no funcionará el proceso). En mi caso lo copié de esta manera:
cp /boot/config-2.6.14 /usr/src/linux-2.6.15/.config
make oldconfig
Una vez que hacemos eso ya tenemos lista la configuración, podemos verificar usando cualquiera de los 3 métodos explicados en el capítulo 4. Notaremos que tiene una configuración diferente a la que viene por defecto.
make config tenemos que conocer algo sobre nuestro hardware, cuando digo conocer me refiero a que tenemos que saber algunos dispositivos de hardware que posee nuestro ordenador. Por eso si eres medio novato te recomiendo que te vayas por el make menuconfig
--append-to-version=NOMBRE y como ya saben donde dice nombre es donde colocan el nombre que caracterice a cada kernel.
m-a a-i madwifi
a-i Significa "auto-install", equivale a prepare,build e install
Copyright (c) 2006 Alejandro Garrido Mota.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
1ra edición. Versión 1.0: 15 Junio del 2006
2da edición. Versión 1.3: Mejorado y actualizado el artículo. 28 de noviembre del 2006
3ra edición. Versión-1.4: Agregando información acerca de Gestión de módulos y parches. 4 Febrero del 2008