domingo, 25 de enero de 2009

El kernel de linux

El kernel de Linux:
Algunas características:
• Kernel de tipo monolítico, con soporte para carga/descarga de porciones del kernel (módulos) bajo demanda
• Soporte para aplicaciones multithread
• Soporte para multiprocesamiento simétrico (SMP)
• Soporte de múltiples sistemas de ficheros
• Distribuido bajo licencia GPL


Versiones del kernel:
Cada versión del kernel se identifica con tres o cuatro números,p.e. 2.4.27
• El primer número representa la versión (actualmente la 2)
• El segundo representa la revisión principal (major revision); cambia cuando se introducen nuevos drivers o características al kernel
→si es un número impar, se trata de un kernel experimental (no recomendado para instalar)
→si es par, es un kernel estable o de producción (revisión actual 2.6)
→el tercer número indica la revisión secundaria (minor revision); la ultima versión, a 11/01/2009 es la 2.6.28
→el cuarto número (opcional) indica modificaciones pequeñas en el kernel
• Las diferentes distribuciones pueden introducir otra numeración o para indicar parches, p.e. 2.6.24-20
• Podemos obtener la ultima versión en www.kernel.org
• Para ver la versión instalada en el sistema usar el comando uname

Actualización del kernel:
La mayoría de las distribuciones incluyen versiones compiladas del kernel
• ¿Para qué compilarlo entonces?
→tenemos un dispositivo o queremos dar soporte a un servicio no soportado por el kernel oficial
→algunas aplicaciones que queremos usar requieren soporte de un kernel nuevo o de alguna de sus prestaciones, que no aparecen activadas en el kernel precompilado
→queremos optimizar las prestaciones de nuestros dispositivos

Si lo unico que queremos es actualizar a una versión superior del kernel, podemos bajar un paquete ya compilado:
• en Debian instalar kernel-image- o linux-image-
• este paquete nos instala la versi ́n comprimida del kernel en /boot/vmlinuz- y los módulos en /lib/modules/
• además modifica el GRUB (o LILO) para permitir cargar el nuevo kernel

Para compilar el kernel, tenemos que obtener los fuentes
• en Debian, paquetes kernel-source- o linux-source-

Este paquete instala las fuentes comprimidas en /usr/src
1. descomprimirlo con tar xvjf kernel-source-.tar.bz2
2. crear un enlace simbólico de nombre linux en /usr/src


Actualización mediante parches:

Podemos actualizar el kernel mediante parches incrementales
1. Descargar los parches para la nueva versión del kernel
• si queremos pasar de la versi ́n 2.4.15 a la 2.4.17 hay que aplicar parches para pasar a la 2.4.16 y luego a la Arranque y parada 2.4.17
2. Aplicarlos con el comando patch
# zcat parche | patch -p0
Los parches también sirven para añadir funcionalidades (p.e. nuevos drivers) no incluidos en el kernel oficial
• después de instalar el parche tenemos que recompilar el kernel

Comandos patch y diff
Permiten crear y aplicar parches
• diff muestra la diferencia entre ficheros de texto, línea a línea
el formato de la salida permite usarlo para crear parches
• patch aplica un fichero de diferencias, creado con diff a un
original

• Ejemplo:
[patch]$ cat old/file.txt
Este es un
fichero simple
[patch]$ cat new/file.txt
Este es un
fichero algo más complicado
[patch]$ diff -uNr old new > parche
[patch]$ cat parche
diff -uNr old/file.txt new/file.txt
--- old/file.txt 2005-10-10 18:22:51.000000000 +0200
+++ new/file.txt 2005-10-10 18:19:41.000000000 +0200
@@ -1,2 +1,2 @@
Este es un
-fichero simple
+fichero algo más complicado
[patch]$ cd old
[old]$ cat ../parche | patch -p1
patching file file.txt
[old]$ cat file.txt
Este es un
fichero algo mas complicado

• la opción -p1 de patch quiere decir: “Elimina la parte del path en el nombre hasta la primera barra e intenta aplicar el parche con el nombre reducido de esa forma"

Configuración del kernel:
Dentro del directorio /usr/src/linux accedemos podemos acceder al menú de configuración de distintas formas
1. make config: interfaz básica en modo texto; complejo y poco recomendable
2. make menuconfig: interfaz de menú para consola, fácil de usar(necesita instalar los ficheros de desarrollo de la librería ncurses, en Debian paquete libncurses5-dev)
3. make xconfig: interfaz gráfico para entorno de ventanas; basada en la librería QT (en Debian, instalar paquete libqt3-dev)
4. make gconfig: otro interfaz gráfico para entorno de ventanas; basado en la librería GTK (en Debian, instalar paquete libglade2-dev, libgtk2.0-dev)

Dentro de los menús se pueden configurar las opciones que incluirá el nuevo kernel.
→Algunas opciones pueden ser compiladas directamente en el kernel o como módulos que se cargarán o no cuando el kernel esté en fucnionamiento y sean necesarios
→ Otras opciones activan la disponibilidad de opciones nuevas al ser marcadas
Si deseamos utilizar alguna configuración anterior copiamos su fichero de configuración, normalmente /boot/config - al fichero .config dentro del directorio del kernel
→make oldconfig: usa la configuración del .config
→make oldconfig xconfig: parte de la configuración vieja para modificarla


Compilación del kernel
Varios pasos:
1. make dep :(sólo kernels anteriores a 2.6) contruye las dependencias para realizar la compilación real
2. make bzImage :(o make para kernels 2.6) compila y crea una imagen comprimida
3. make modules : (sólo kernels anteriores a 2.6) compila las partes que han sido marcadas como módulos
4. make modules_install : instala los módulos del kernel en el sistema
→ normalmente se instalan en /lib/modules//
Para kernels 2.6 make reemplaza a make dep, make bzImage y make modules

La compilación puede fallar por:
→ Problemas con al versión usada de gcc
→ por errores al configurar el kernel, algunas de sus dependencias no se cumple (posible bug de la herramienta de configuración, o se terminó mal..)
→ la versión bajada del kernel tiene errores(poco probable)
Si falla y se subsana el error, es recomendable limpiar el kernel antes de volver a compilar:
→ make clean: borra ficheros objeto, ficheros intermedios y las imágenes generadas.
→ make mrproper : deja el kernel en el estado en el qu estaba cuando se descomprimió (borra también la configuración realizada)
Para más detalles leer los ficheros README de la documentación del kerenl (directorio /usr/share/doc/)


Instalación del kernel:
Ya sólo resta crear el RAMDisk inicial e instalar el kernel:
1. Crear la imagen initrd
→ RAM disk que contiene los módulos necesarios para iniciar el sistema y montar la partición raíz, y cargar el resto de módulos.
→sólo necesario si los controladores de disco se han compilado como módulos
→ para crearlo se usa:
update-initramfs -c -k kernel-versión
2. Instalar el nuevo kernel
(a) Copiar lo ficheros bzImage y System.map al directorio de arranque del kernel (/boot)
→ Renombrar bzImage a vmlinuz- y System.map a System.map
(b) Configurar GRUB o LILO para poder cargar la nueva imagen


Instalar el kernel en Debian:
Debian tiene una utilidad para simplificar el proceso de compilar e instalar el kernel:
→make-kpkg (paquete kernel-package) compila y crea un paquete Debian con el kernel compilado
→ Ejmplo:
make-kpkg --revision=custom.1.0 kernel_image
→ el paquete creado se instala con dpkg -i
→ si es necesario, crear el initrd y modifciar GRUB o LILO para que carguen este initrd