Esta página es editable

DPD Kernel

De Gleducar, http://www.gleducar.org.ar

Esta página fue revisada y cumple los estándares de Gleduwiki.

Contenido

Conceptos del núcleo

Tipos de núcleos

Los dos diferentes tipos de Kernel son:

A. Monolitico
Los núcleos monolíticos son aquellos que soportan todo el hardware, el sistema de red, el sistema de archivos compilado dentro de un solo archivo.
B. Modular
Los núcleo modulares son aquellos en que los controladores (módulos) se encuentran compilados como objetos, los cuales el núcleo puede cargar o descargar según sea necesario. Los módulos se encuentran en /lib/modules

La ventaja de un núcleo modular es que no siempre es necesario recompilarlo cuando nuevo hardware es agregado o reemplazado en el sistema. Los núcleos monolíticos inician un poco más rápido que los núcleos modulares, pero no superan en rendimiento a un núcleo modular.

El núcleo modular

Muchos componentes del núcleo Linux deben ser compilados como módulo que el núcleo pueda dinamicamente cargar o remover.

  • Los módulos para un núcleo en particular son guardados en /lib/modules/<kernel-version>.
  • Los mejores componentes para modularizar son aquellos que no se requieron en el momento de carga, por ejemplo dispositivos perisféricos y sistema de archivos suplementarios.
  • Los módulos del núcleo son controlado por las herramientas proporcionadas por el paquete modutils
lsmod lista los modulos cargados
rmmod remueve el módulo especificado
insmod inserta el módulo especificado
modprobe inserta el módulo especificado con sus dependncias listada en modules.dep
modinfo muestra información sobre un módulo: autor, tipo de licencia y parámetros

Muchos módulos dependen de la presencia de otros módulos. Una base de datos de la dependencia de módulos (en texto plano) es almacenada en /lib/modules/<kernel-version>/modules.dep. El programa que genera esta base de datos es depmod, el cual se inicia en el arranque (por ejemplo dentro de el script rc.sysinit).

modprobe puede cargar cualquier módulo y las dependencias de modulos listados en modules.dep (o conf.modules)

Busca por ejemplo los modulos que seran cargados en el momento de carga de tvaudio.

grep tvaudio /lib/modules/kernel-version/modules.dep
/lib/modules/kernel-version/kernel/drivers/media/video/tvaudio.o:  \ 
/lib/modules/kernel-version/kernel/drivers/i2c/i2c-core.o

Esto significa que el modulo i2c-core.o sera tambien cargado cuando usamos modprobe. Esta dependencia tambien aparece cuando listamos los modulos con lsmod:

lsmod 
Module                  Size    Used by       Not tainted
tvaudio                16796    0  (unused)
i2c-core               19236    0  [tvaudio]

/etc/modules.conf es consultado para determinar los parametros de cada modulo(IRQ y E/S) pero es mas comun que contenga una lista de alias. Un alias refiere a un dispositivo usando un nombre comun. Por ejemplo el primer dispositivo ethernet siempre esta referido como eth0 y no con el nombre particular del modulo.

Ejemplo del archivo /etc/modules.conf:

alias eth0 e100
alias usb-core usb-uhc
alias sound-slot-0 i810_audio
alias char-major-108 ppp_generic
alias ppp-compress-18 ppp_mppe

# 100Mbps full duplex
options eth0 e100_speed_duplex=4 

modinfo dará informacion sobre los modulos.

modinfo tvaudio
filename:    /lib/modules/kernel-version/kernel/drivers/media/video/tvaudio.o
description: "device driver for various i2c TV sound decoder / audiomux chips"
author:      "Eric Sandeen, Steve VanDeBogart, Greg Alexander, Gerd Knorr"
license:     "GPL"
parm:        debug int
parm:        probe short array (min = 1, max = 48), description "List of adapter,address pairs to scan additionally"
parm:        probe_range short array (min = 1, max = 48), description "List of adapter,start-addr,end-addr triples to scan additionally"
parm:        ignore short array (min = 1, max = 48), description "List of adapter,address pairs not to scan"
parm:        ignore_range short array (min = 1, max = 48), description "List of adapter,start-addr,end-addr triples not to scan"
parm:        force short array (min = 1, max = 48), description "List of adapter,address pairs to boldly assume to be present"
parm:        tda9874a_SIF int
parm:        tda9874a_AMSEL int
parm:        tda9874a_STD int
parm:        tda8425 int
parm:        tda9840 int

Para obtener informacion sobre las opciones de parametro usamos modinfo -p, paraobtener informacion sobre el tipo de licencia usamos modinfo -l, etc.

kmod es un mecanismo que permite al nucleo cargar los modulos automaticamente (rara vez necesitamos cargar los modulos manualmente). Esto es en realidad u modulo compilado estaticamente que necesita ser configurado previo a la compilacion del nucleo. El comando usado por el nucleo para cargar los modulos es /proc/sys/kernel/modprobe.

Recompilación rutinaria del núcleo

Extracción del código fuente

El codigo fuente del nucleo esta guardado en /usr/src/linux, que es un enlace simbólico al directorio /usr/src/(kernel-version). Cuendo se extrae un nuevo archivo con el codigo fuente del nucleo se recomienda:

  • quitar el enlace simbolico al viejo codigo fuente del nucleo...
rm linux

El código fuente que ha sido empaquetado como un RPM frecuentemente crea un enlace llamado linux-2-4

  • extraer el nuevo código fuente (ej linux-2.4.20.tar.bz2)
tar xjf linux-2.4.29.tar.bz2

NOTA: Los núcleo Linux de la serie 2.2 crean un directorio llamado linux en vez de linux-version. Por esta razón el primer paso es importante, de otra forma podriamos sobrescribir una versión vieja de las fuentes con la versión nueva. Desde la serie 2.4 el nombre del directorio es linux-version.

  • crea un enlace simbólico llamado linux desde el directorio nuevotory
ln -s linux-2.4.20 linux

El núcleo ya está casi configurado, pero primero necesitamos asegurarnos que los viejos archivos binarios no están presentes en el árbol de directorio de las fuentes, esto es realizado con el comando mrproper.

Advertencia: este comando también eleminará el archivo de configuración del núcleo .config, al cual nos referiremos más adelante.

cd /usr/src/linux
make mrproper

Nota: mrproper es una marca escandinava de limpiador que se promociona como "Limpia más que limpio", es un paso más allá de "make clean".

Configuración del núcleo

Primero edita el archivo Makefile y asegurate que la variable "EXTRAVERSION" es diferente a la de la versión existente:

VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 20
EXTRAVERSION = -test

El núcleo está ahora listo para ser configurado. Esto se hace creando el archivo de configuración llamado .config. Esto se realiza desde el directorio del núcleo /usr/src/linux usando cualquier de los siguiente comandos:

make menuconfig 
make xconfig 
make config 

Todos estos métodos guardarán la configuración en el archivo /usr/src/linux/.config

Es comunmente más facil configurar un nuevo núcleo usando uno viejo, esto se realiza usando el comando oldconfig. Este solo mostrará al usuario las nuevas opciones o caracteristicas en el código fuente del núcleo (si el núcleo es nuevo o ha siso parcheado).

Nota: Algunas distribuciones como RedHat tienen un subdirectorio que contiene los archivos .config con una serie de configuracion predefinidas.

Para habilitar las funciones del núcleo (con make menuconfig) es necesario entrar a una categoria de mayor nivel moviendose on las flechas y presionando enter para acceder sobre la categoria deseada. Una vez dentro de la categoria escojida, el presionar la barra espaciadora cambiará el estado de alguna opción (una función del núcleo o un controlador).

Las posibles opciones son:

  • soportado (compilado estaticamente) [*]
  • modular (compilado modularmente) [M]
  • no soportado [ ]

La misma elección s posible con las otras aplicaciones de configuración de nucleos y xconfig.

Problema: Para que menuconfig funcione es necesario contar con las cabeceras de las librerias ncurses. Estas son provistas por el paquete ncurses-devel y deben ser instaladas previamente.

Fig 2: El menu de xconfig

Compilación del núcleo

make clean

El comando make toma las intrucciones que figuran dentro del Makefile y compila lo que es necesario. Si algunos archivos estan presentes, make los usará. En particular archivos con la extensión ".o". Para asegurarse que todas las opciones de configuracion dentro de .config son usadas para reconstruir los archivos ncesario es necesario ejecutar make clean (elimina los archivos ".o")

Nota: no es necesario usar make clean en esta etapa si usamos previamente el ya mencionado make mrproper.

make dep

Una vez que la configuración del núcleo está completa, es necesario transferir todas esas opciones a los subdirecotrio que código fuente del núcleo. Esto se realiza con el comando dep. Los archivos llamdos .depend que contienen rutas hacia los archivos de cabecera (*.h) presentes en /usr/src/linux/include, son generados de esta forma.

El núcleo en si mismo es compilado con alguno de estos comandos:

make zImage
make bzImage  

Cuando el comando termina sin ningún error, existirá un archivo llamado vmlinux dentro de /usr/src/linux/. Este es el núcleo descomprimido.

Los otros dos comandos crearan un archivo adicional en /usr/src/linux/arch/i386/boot/ llamados zImage y bzImage respectivamente. Estas son versiones del núcleos comprimidas con gzip y bzip2. A continuación se explica como usar estos archivos.

make modules

Los módulos son compilados mediante make modules.

make modules_install

Una vez que los módulos son compilados necesitan ser copiados al subdirecorio llamado /lib/modules. El comando make modules_install hará precisamente eso.

Comandos de la compilación del núcleo:

make dep
make clean
make bzImage
make modules
make modules_install

Instalando un nuevo núcleo

El nuevo núcleo puede ser encontrado en /usr/src/linux/arch/i386/boot/bzImage, dependiendo de la arquitectura de su sistema. Este archivo debe ser copiado al directorio /boot y renombrado a vmlinuz-<full-kernel-version>

cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-<full-kernel-version>

Luego es necesario editar el archivo de conffiguración de nuestro gestor de arranque: para LILO /etc/lilo.conf o para GRUB /boot/grub/grub.conf. Copia el núcleo compilado a la seccion "iamge" dentro de tu núcleo y agrega una nueva sección dentro del archivo de configuración de nuestro gestor de arranque:

Editando el archivo /etc/lilo.conf

prompt
timeout=50
message=/boot/message

image=/boot/vmlinuz
           label=linux
                 root=/dev/hda6                      Sección existente
                           read-only

image=/boot/vmlinuz-<full-kernel-version>
            label=linux-new                          Sección añadida
            root=/dev/hda6
            read-only

La tabla de simbolos para los procedimiento del núcleo puede ser copiada en el directorio /boot:

cp /usr/src/linux/System.map /boot/System.map-<full-kernel-version>

La versión completa del núcleo

En un sistema, la versión del núcleo en ejecución puede ser obtenida mediante

uname -r

La versión del núcleo puede ser tambien mostrada en las terminales virtuales usando la opcion \k dentro del archivo /etc/issue.

Ramdisks iniciales

Si cualquier módulo compilado dinámicamente es necesario en el momento de arranque (ej: un driver scsi, o el moculo l istema de archivos de la partición principal) seran cargado usando el ramdisk inicial.

El ramdisk inicial es creado con el comando mkinitrd el cual recibe solo dos parámetros el nombre del archivos y la versión de núcleo.

Si se usa un ramdisk inicial es necesario añadir la línea initrd= dentro de /etc/lilo.conf

mkinitrd /boot/initrd-full-version.img full-version

Optional

Es recomandable copiar el arhchivo /usr/src/linux/.config a /boot/config-<full-kernel-version>, solo para mantener un registro de las caracteristicas de los distintos núcleos que han sido compilados.

Re-instalando LILO

Finalmente LILO necesita ser ejecutado para actualizar el menu de arranque. Primero es recomendable ejecutarlo en modo de prueba para detectar cualquier error en el archivo de configuración:

NOTA: el comando lilo debe ser ejecutado luego de cualquier cambio efecutado sobre /etc/lilo.conf

3.8 Proceder con GRUB

Para actualizar el cargaor de arranque de GRUB tan solo ejecutamos grub <dispositivo>:

grub /dev/hda

Esto cargará las opciones almacenadas en el archivo de configuración en el cargador de arranque de nuestra PC.

Copyright © 2002-2010 Asociación Civil Gleducar
Todo los contenidos de este sitio se encuentran bajo una licencia libre del tipo Copyleft
Este sitio ha sido desarrollado usando Software Libre y respeta los estándares web.
Además ha sido diseñado para verse correctamente usando cualquier navegador, en cualquier resolución de pantalla.