Si posees conocimientos de GNU/Linux y sistemas operativos esta entrada te resultará interesante.
Cuando hablamos de “Linux” es frecuente referirnos al sistema operativo y sus aplicaciones y no al núcleo o kernel del sistema. La realidad es que Linux es sólamente el núcleo del sistema: componente de gran envergadura que hace operar nuestro ordenador. Entre las funciones más importantes del kernel:
- Administración de la memoria del equipo.
- Establecimiento de la comunicación entre aplicaciones y dispositivos de hardware.
- Administración de procesos (o tareas).
Recuerda que para hablar con propiedad (al César lo que es del César), muchas veces denominamos Linux al sistema, cuando debiéramos llamarlo GNU/Linux. Puesto que el sistema operativo esta constituido por aplicaciones y el núcleo. Vaya mosqueo se podría pillar Richard Stallman.
Aunque no son las únicas funciones, sí son las de más importantes.
El núcleo Linux se caracteriza por ser muy volátil y tener muy buenos desarrolladores al momento de corregir un problema o agregar una nueva característica al núcleo; recibiendo así gran cantidad de actualizaciones en poco tiempo.
Dichas actualizaciones comúnmente contienen nuevos módulos, mejoras de seguridad, administración de recursos y muchas otras características.
¿Cómo averiguar que innovaciones incorpora determinado núcleo?
Observando un archivo incorporado en el mismo llamado ChangeLog.
También es posible descargar y observar el archivo de texto plano Changelog desde la página oficial del proyecto.
Muchas veces surgen dudas acerca de la necesidad de compilar el núcleo cuando liberan una nueva versión: no debemos dudar, solamente se compila una nueva versión de kernel cuando tenemos dispositivos de hardware muy recientes y nos vemos forzados a migrar hacia una versión que incluya módulos para el soporte de este.
Otra razón se basa en que poseemos una versión muy antigua y optamos por actualizarlo para tener mejoras en la administración de memoria, procesos, recursos, etc. Actualmente ocurre esto con la rama 3.18 y 3.19 del kernel Linux.
La tercera razón es por motivos relacionados con la seguridad, bugs, fallos.
Cuanto más adaptado se encuentre el kernel a nuestro sistema mejor. Es por eso que a muchos linuxeros puros les gusta Gentoo y Arch Linux y, en ambos casos, es inevitable no mencionar otros nombres como por ejemplo Linux From Scratch, para compilar todo desde Cero.
El kernel NO se actualiza, si deseas una nueva versión debes descargarla de la página oficial del proyecto y compilarla. También puedes buscar un paquete (por ejemplo en los repositorios de Debian) con una versión ya compilada para tu arquitectura de hardware; evitando la tarea de compilar y desaprovechando la optimización del sistema.
¿Porqué compilar un kernel a la manera Debian?
Dejar de compilar un kernel por la vertiente clásica para hacerlo a la manera Debian (debian way) proporciona muchas ventajas: motivo a que se empaqueta se crea un paquete con extensión .deb. Cualquier buen administrador de sistemas sabe las principales ventajas de que se genere un paquete, entre las principales:
- Cuando tengamos que eliminar el kernel (quizás porque ya hayamos compilado una nueva versión, por ejemplo), lo único que debemos hacer es utilizar la herramienta dpkg de la siguiente manera: dpkg -r TU_KERNEL. Donde TU_KERNEL es el nombre que le diste al paquete. 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 con Linux.
- Tener un paquete con nuestro kernel facilita guardarlo en un Pendrive, CD, DVD, o mejor aún: si tenemos un servidor web es factible distribuirlo. El principal objetivo de esto es tener la posibilidad de instalar ese mismo kernel en varias máquinas. Debian está implementando esta característica desde hace mucho años, ofrece kernel’s pre-compilados para tu computador en sus repositorios de paquetes, de manera que si eres un usuario final, te da pereza compilar el kernel o no estés en la necesidad de hacerlo tengas la posibilidad de elegir el paquete (kernel) entre la gran variedad que hay e instalarlo con algún gestor de paquetes como aptitude, apt, dpkg.
Ejemplo práctico
Imagina que en tu trabajo gestionas información de gran envergadura y no deseas que los usuarios puedan hacer uso de pendrives ni dispositivos extraíbles para trasladar dicha información.
Asimismo tu organización decide migrar hacia tecnología inalámbrica: debes configurar el kernel para adicionar el soporte del chipset de tu tarjeta inalámbrica; esto porque tuviste la mala suerte de que por defecto Linux no lo incluía.
Básicamente lo que debes hacer es crear un paquete (por ser paquete: fácil distribución, instalación y purgado) con el kernel de Debian optimizado: deshabilitando los puertos USB y agregando el módulo que ofrece soporte a tu tarjeta inalámbrica.
El problema radica en que tu organización posee 1300 usuarios (cada uno con su máquina), sería poco práctico y absurdo enviar el grupo de soporte a realizar el proceso de compilación máquina por máquina.
Pero como tú eres buen administrador de red: tienes un mirror de Debian personalizado donde subes paquetes desarrollados o modificados por ti (o por tu grupo de administración/soporte de sistemas). Así te motivas a compilar dicho kernel optimizado y lo subes al mirror. Para garantizar la convergencia de dicho kernel en todas las máquinas utilizas herramientas como cfengine, puppet y pkgsync.
Descargando y desempaquetando el kernel
En principio, para compilar un kernel es evidente que debes descargar el código fuente del mismo. Para eso ingresamos en 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 tradicional es descomprimir el kernel en el directorio /usr/src, sin embargo no olvides que tienes la libertad de hacerlo en donde caprichosamente desees.
- Para quienes se descargaron el .tar.gz :
tar xvzf linux-version-kernel.tar.gz
- Para quienes se descargaron el .tar.bz2:
tar xvjf linux-version-kernel.tar.bz2
Notar la j para el de extensión .tar.bz2
- Luego necesitamos ingresar al directorio donde se descomprimió y desempaquetó el kernel para poder configurarlo y compilarlo, ingresamos al directorio:
cd linux-version-kernel
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 debemos configurarlo, esto quiere decir decidir cuales módulos deseamos que tenga (o que no tenga) una vez compilado. Como es característico del Software Libre: tenemos varias maneras de hacer las cosas, hablemos sobre 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
Para la configuración utilizaré la segunda alternativa, es decir, make menuconfig, como lo hago siempre. 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 recuerden ser muy precavidos seleccionando o habilitando los módulos. 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 llamadokernel-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 hayan compilado un kernel de Linux 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 compilando y empaquetando,no instalando).
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 (ver la sección Gestión de 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.
NOTA: El tiempo de compilación es proporcional a la configuración que hayas hecho y a tu poder de computo. Si incluiste 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 es corroborada la 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
¡Felicidades! Con esto terminas la instalación del kernel, ya podrías reiniciar la máquina e iniciar con tu nuevo kernel.
Module Assistant – Compilando y agregando módulos
Module Assistant es una herramienta para la gestión de módulos ya empaquetados (preparadas sus fuentes con un debian/rules) para Debian. Nos permite compilar, construir e instalar módulos del kernel sin necesidad de reiniciar el computador ni recompilar el kernel. No olvidar que permite gestionar sólo los módulos que estén preparados para Debian (y derivados, p.e Ubuntu). Debes tener los headers de nuestro kernel
Para entender su funcionamiento se elaborará un ejemplo con algún módulo. Arbitrariamente escogí uno que permite hacer uso de cualquier tarjeta inalámbrica que implemente chipset atheros . Los módulos de madwifi nos habilitarán el soporte para estas tarjetas, por lo que debemos agregar los módulos de madwifi. Ya dichos módulos vienen preparados para debian y se encuentran en los repositorios oficiales (en la sección de non-free).
Debemos instalar (descargar) el código fuente del módulo madwifi, para eso instalaremos el paquete madwifi-source el cual trae empaquetado las fuentes 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 ingresan 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).
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.
Ya el módulo está instalado, faltaría cargarlo (en la mayoría de los sistemas de carga al conectar la tarjeta).
modprobe ath_pci
Módulos no preparados para Debian
Es muy probable que en la sección anterior se hayan preguntado que hacer con los módulos no preparados para debian: si hay solución para ellos, sólo que es un poco más laboriosa y tedioso el proceso. De igual manera tomaré un ejemplo para explicar los pasos a seguir.
Para aplicar un parche hacemos uso del programa patch. Es probable que lo tengamos instalado, de no ser así:
aptitude install patch
Una vez instalado se puede aplicar el parche distintas formas:
Una vez descargado el parche (normalmente un archivo .patch) lo copiamos al directorio donde están las fuentes del kernel (depende donde no los hayamos descargado, siguiendo el tutorial: /usr/src/linux-version) y al compilarlo agregar:
make-kpkg –initrd –added-patches=MI-PARCHE.patch kernel_image kernel_headers
make-kpkg se encargará de aplicar el parche y compilar nuevamente el kernel, notar que es le mismo comando (make-kpkg) que hemos venido usando a lo largo del tutorial. Adjunto al argumento –added-patches= deberás colocar, separado por comas, los parches a aplicar al kernel.
Lo descargamos y copiamos donde están las fuentes del kernel y ejecutamos:
patch -p0 < nombre-del-parche.patch
Finalmente recompilamos el kernel siguiendo los pasos del tutorial.
¿Dónde consigo más información?
- Si deseas averiguar e indagar sobre otras opciones y argumentos que puedas utilizar con make-kpkg para compilar el kernel te recomiendo leer las páginas del manual (están completamente en español). Para eso: man make-kpkg
- Una vez descargado el código fuente del kernel leer el archivo README incluido en el mismo.
- Todos los kernels que han existido se encuentran en: http://kernel.org/pub/linux/kernel
- Para averiguar los cambios que sufre un determinado release del kernel tendrás que ver el archivo Changelog.
- Si ya tenemos un kernel configurado y no queremos reiterar el tedioso paso de configurar nuevas versiones podemos hacemos lo siguiente: En /boot debe estar nuestra configuración anterior, el archivo que contiene tu configuración anterior se llama config-VERSION_KERNEL. Ese archivo lo tenemos que copiar en directorio donde están las fuentes del kernel con el nombre .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-version-kernel/.config make oldconfig
Una vez que hacemos eso ya tenemos lista la configuración, podemos verificar usando cualquiera de los 3 métodos explicados. Notaremos que tiene una configuración diferente a la que viene por defecto.
- Recordar que para la configuración del kernel con make config debemos conocer nuestro hardware, cuando digo conocer me refiero a que debemos de saber algunos dispositivos de hardware que posee nuestro ordenador. Por eso si eres medio novato te recomiendo que te vayas por el make menuconfig
- Si compilarás más de un kernel puedes colocarle un nombre a cada compilación para identificar al paquete .deb en el directorio superior. Para hacer esto necesitas agregar –append-to-version=NOMBRE. Como ya se imaginan, donde dice nombre es donde colocan el nombre que caracterice a cada kernel.
- ¿Quieres ejecutar con un solo comando todos los pasos para tener en funcionamiento un módulo con Module Assistant? Pues el truco es ejecutar:
m-a a-i madwifi
a-i Significa “auto-install”, equivale a prepare,build e install
- Si tenías un kernel con módulos ya instalados (por ejemplo, madwifi, nvidia, etc) e instalas un nuevo kernel perderás el soporte de estos módulos en tu nuevo kernel. Ergo: tienes que volver a compilarlos, no es tan tráfico porque afortunadamente tienes la herramienta Module Assitant