next up previous contents
Next: LILO Up: Personalización y compilación del Previous: Actualización del núcleo   Índice General

Compilación del núcleo

Habiendo enumerado los pasos para la actualización del núcleo en el sistema, vamos a abocarnos a una de las etapas quizás mas complicadas del proceso.

Un detalle muy importante a tener en cuenta a la hora de compilar un núcleo, es que se deben tener instalados en el sistema los paquetes de desarrollo. El núcleo Linux está programado en casi su totalidad en C, por lo tanto se debe tener instalados la biblioteca C de desarrollo y el compilador de dicho lenguaje.

Dependiendo de la distribución que se utiliza, el método de instalación de los paquetes difiere un poco. Dejando de lado el formato de paquetes y la distribución, se debe revisar si los paquetes gcc y libc6-dev se encuentran instalados, estos paquetes siempre tienen un nombre similar en cualquier distribución.

Existen 3 formas de configurar las opciones y características a incluir en el núcleo, una es usando un programa de línea de comandos, que línea a línea va preguntando las diferentes opciones, este método era el que se utilizaba hace algunos años, los demás métodos son mas agradables. El segundo método es mediante el uso de una interfaz de texto, pero a pantalla completa, con uso de la biblioteca ncurses, si se quiere utilizar este método, se deben tener instalados en el sistema dicha biblioteca (normalmente se instala por defecto), cuyo paquete generalmente se denomina libncurses. El tercer y último método es mediante el uso de una interfaz gráfica en las X; este método utiliza las bibliotecas Tcl/Tk, que también normalmente se instalan por defecto en el sistema.

El primer método es el que se utilizaba con las primeras versiones del núcleo, como se puede observar en la figura 11.1, no es muy amigable pero a veces puede resultar útil cuando no se tiene disponible una interfaz gráfica ni las bibliotecas ncurses. Estando en el directorio del código fuente del núcleo, se ejecuta el siguiente comando:

root@maquina:/usr/src/linux# make config

Figura 11.1: Configurando el núcleo con la interfaz de línea de comandos
\includegraphics[scale=0.5]{imagenes/eps/CompilandoNucleo-MakeConfig.eps}

Siempre hay que tener en cuenta el usuario que se está utilizando en esta tarea, si bien el compilar un núcleo no requiere de utilizar el usuario administrador, dependiendo del directorio donde esté alojado el árbol de fuentes será o no necesario usar la cuenta root. Como generalmente el directorio donde se aloja el código fuente del núcleo es /usr/src, se necesitará usar la cuenta de administrador, a menos que dicho directorio posea permisos especiales para algún otro usuario del sistema.

El segundo método mencionado corresponde al uso de la interfaz de texto a pantalla completa, como se ve en la figura 11.2. Este método se usará en el resto del curso.

Esto se obtiene ejecutando el siguiente comando:

root@maquina:/usr/src/linux# make menuconfig

Figura 11.2: Interfaz de texto a pantalla completa
\includegraphics[scale=0.5]{imagenes/eps/CompilandoNucleo-MakeMenuConfig.eps}

El tercer método utiliza una interfaz gráfica en las X (figura 11.3). Es el método mas práctico, siempre y cuando se disponga de las X, claro está. Por esa razón hemos seleccionado el anterior método para las demás figuras, aunque se debe saber que los tres métodos poseen los mismos contenidos, solo cambia la manera de desplegar la información.

Este tercer método se obtiene ejecutando desde una terminal X lo siguiente:

root@maquina:/usr/src/linux# make xconfig

Figura 11.3: Interfaz gráfica para configurar el núcleo
\includegraphics[scale=0.5]{imagenes/eps/CompilandoNucleo-MakeXConfig.eps}

Una vez presentados los métodos de configuración del núcleo, nos toca seleccionar las opciones y características que el nuevo núcleo incluirá. Lo que siempre se recomienda al agregar opciones en el núcleo, es que aquellas opciones que tengan la posibilidad de ir como módulos, que lo hagan. Con esto, obtendremos un núcleo mas pequeño, y los módulos que se han compilado se irán cargando y descargando automáticamente, a medida que se necesiten activar ciertas funcionalidades, y luego ya no se necesiten. Al tener menos cantidad de código en memoria, no sólo se produce un ahorro de RAM (que es prácticamente insignificante en estos días ahorrar unos 100k de RAM), sino que lo mas importante es el tener menos posibilidades que algo falle. El sentido común dice que un núcleo de 400Kb en memoria mas 200Kb de módulos no cargados tendrá menos posibilidades de falla que el mismo núcleo, pero con sus 600Kb completos en memoria.

Cómo saber cual función debería ir en módulo y cual en el núcleo? Lo que se recomienda es tener en cuenta la necesidad del uso de cada funcionalidad del núcleo para realizar esta decisión. Por ejemplo, una máquina que posee discos rígidos IDE, los va a necesitar usar en todo el tiempo que esté encendido el equipo (salvo raras ocasiones), entonces el soporte para discos IDE debería ir en el núcleo y no como un módulo, ya que de ir como módulo, estaría siempre cargado. Un servidor de red necesitará el manejador de la tarjeta de red siempre activo, entonces conviene compilarlo en el núcleo, pero el uso del módem de dicho equipo es muy esporádico, en este caso el manejador del módem o los puertos serie podría ir como módulos. También hay que tener en cuenta algo importante: el núcleo necesita saber como manejar un disco rígido para poder iniciar todo el sistema (si el sistema está almacenado en un disco rígido, como normalmente ocurre), si se compila el soporte de discos rígidos (cualquiera sea el tipo) como módulo, el núcleo necesitará poder manejar el disco rígido al iniciar el equipo para poder cargar el módulo para poder manejar el disco rígido11.7, y obviamente este tipo de casos causan problemas.

Resumiendo, hay dos casos en los cuales una funcionalidad del núcleo no debería ser compilada como núcleo:

Para los demás casos es conveniente compilar como módulo. El sistema se encargará de cargar el módulo cuando se necesite, y cuando ya no se use, se descargará para liberar memoria.

Cuando se ejecuta el comando make menuconfig se presenta una serie de secciones donde se agrupan las diferentes capacidades del núcleo, esta lista que sigue proporciona una breve explicación de los contenidos de cada una de estas secciones11.8:

Code maturity level options
Se presenta una única opción, al activarla, será posible activar aquellas funcionalidades experimentales que tenga el núcleo, generalmente esto no es recomendable cuando se está compilando un núcleo para algún servidor de producción, a menos que se tenga la certeza de que tal o cual opción es estable y funciona bien (o sea imprescindible).
Loadable module support
Las opciones que se incluyen en esta sección tienen que ver con el manejo de los módulos del núcleo. En algunos casos no será necesario o no se podrá tener módulos, entonces se pueden desactivar. En este método de configuración del núcleo, aquellas opciones del mismo que sea posible compilar como módulo tendrán la casilla de selección a la izquierda de esta forma: < >, cuando se llega a alguna opción con este tipo de casilla de selección, oprimiendo \fbox{\tt Y} se la selecciona para compilarse dentro del núcleo, si se presiona \fbox{\tt M} se la seleccionará para compilarse como un módulo.
Processor type and features
Dentro de esta sección encontraremos opciones de optimización del núcleo para el tipo de procesador que se posea. Con cada nueva serie de procesadores, características nuevas van siendo disponibles para ciertas funciones, lo que aprovecharlas es interesante para aumentar el desempeño general del sistema. El núcleo Linux soporta también equipos con mas de un procesador, en caso de estar compilando el núcleo para un equipo de este tipo, en esta sección se debe activar la opción Symmetric multi-processing support para sacar el máximo provecho.
General setup
Como su nombre lo indica, esta sección contiene opciones de configuración general del núcleo, entre ellas se encuentran opciones especificando la marca y el modelo del chipset de la placa madre del equipo, así como también si el núcleo utilizará el sistema de administración de energía que provee el BIOS, el formato en el cual el núcleo será compilado, si se soportarán dispositivos PCMCIA, etc.
Memory Technology Devices (MTD)
Esta sección en nueva de los núcleos de la serie 2.4.x, posee una opción para dar soporte a los dispositivos de discos en memoria, para poder manejar sistemas de archivos de estado sólido en dispositivos embebidos. Normalmente esta opción no se utilizará.
Parallel port support
Dentro de esta sección se encuentra la opción que activa el soporte para el puerto paralelo. Generalmente utilizaremos el puerto paralelo si en la máquina se tendrá alguna impresora de puerto paralelo instalada, alguna unidad de disco Zip, o cualquier otra unidad de disco por puerto paralelo (grabadoras de CD-R, por ejemplo) o en el caso de utilizar un cable paralelo para conectarse con otra máquina. Se debe tener en cuenta que esta opción se refiere solamente al soporte de base para todos aquellos dispositivos que utilicen el puerto paralelo, en otras secciones se debe después confirmar el soporte individual para aquellos dispositivos específicos.
Plug and Play configuration
Hace unos años se ha impuesto como estándar una norma para periféricos de tal modo que no tengan que ser configurados sus parámetros (IRQs, direcciones de E/S, etc.) manualmente, sino que el sistema lo pueda manejar lo mas convenientemente posible, de esta forma, el sistema operativo podría lidiar con los conflictos y solucionar los problemas que puedan surgir, liberando al usuario de estas tareas que a veces suelen ser complicadas de solucionar. Este estándar se conoce como Plug&Play (o abreviado, PnP), y aunque inicialmente los dispositivos PnP no funcionaban muy bien, hoy en día es mas común ver este tipo de periféricos que los otros. El núcleo Linux tiene soporte para estos dispositivos mediante la opción dentro de esta sección. Además, se cuenta con un paquete de software llamado isapnptools que es muy útil para configurar los antiguos dispositivos PnP ISA (normalmente, los módems).
Block devices
En esta sección se presentan opciones para dar soporte a varios tipos dispositivos de bloques, incluyendo unidades de discos flexibles, discos IDE por puerto paralelo, discos en memoria RAM, y otros mas.
Multi-device support (RAID and LVM)
Esta sección contiene opciones de configuración que muchas veces se utilizan en equipos servidores. RAID es una norma que sirve para generar arreglos de múltiples discos de manera de obtener redundancia de información y evitar problemas de corrupción de datos en el caso de que algún disco del arreglo tenga una falla. RAID tiene varios modos de funcionamiento, generalmente en los servidores se utilizan placas controladoras de discos RAID (soporte de hardware) que funcionan en forma transparente y el sistema operativo no se da cuenta, sin embargo el núcleo Linux da la posibilidad de poder utiliza discos comunes como discos RAID (soporte por software) teniendo de esta manera un elemento mas de seguridad a bajo costo. LVM es otro método de combinación de discos, pero para la generación de volúmenes o grupos de volúmenes de lógicos, cuyo tamaño puede variar en tiempo de corrida del sistema, sin tener que reiniciar ni parar servicios. LVM no se utiliza para dar redundancia de datos, sino para combinar varios discos (de distintos tipos) y utilizarlos como si fuera un gran disco grande.
Networking options
En esta sección se encuentran las opciones de soporte base de redes. Se podrán activar los soportes de varios protocolos, con sus opciones específicas, el mas común en estos días es el protocolo TCP/IP, uno de los protocolos que se utiliza en Internet. Otra opción bastante novedosa en los núcleos, es la opción QoS (Quality of Service) la cual se utiliza para definir los algoritmos de planificación de paquetes de red, pudiendo partir un enlace en varios sub-canales por decirlo de alguna manera, y de esta forma poder asignar cierto ancho de banda a diferentes clientes. Tener en cuenta que esta sección no se trata acerca de soporte a periféricos de red, sino a protocolos, para tener soporte de una placa de red en especial, se debe activar en otra sección.
Telephony Support
En esta sección se da soporte a los dispositivos VoIP (Voice over IP), que se utilizan para hablar por teléfono a través de redes de datos, en vez de redes de telefonía. Estos dispositivos cada vez se están viendo con mas frecuencia, quien sabe, en unos años quizás podremos hablar al otro lado del mundo sin tener que pagar altísimos costos.
ATA/IDE/MFM/RLL support
Aquí se da soporte a los discos IDE, sean discos rígidos, flexibles, CD-ROMs, etc. También hay varias opciones para especificar la marca de controladora de disco que se posee, y otros detalles para mejorar la performance. El núcleo Linux puede manejar sin problemas los nuevos discos con UDMA.
SCSI support
También existe soporte para los dispositivos SCSI, en esta sección están las opciones para definir los tipos de dispositivos SCSI que se dará soporte, mas otras opciones de control. Un ejemplo común para esta sección es el soporte para las unidades de discos Zip por puerto paralelo, En realidad estas unidades trabajan con la norma SCSI, y es por eso que parte de las opciones que se necesitan para poder hacer funcionar estos periféricos, se encuentran en esta sección.
IEEE 1394 (FireWire) support
FireWire es una nueva clase de bus de datos, de alta velocidad que normalmente se utiliza para transmitir vídeo. Originariamente en las Macintosh, esta clase de conexiones se las utiliza para conectar una cámara de vídeo al equipo y capturar vídeo sin problemas de lentitud. Actualmente existen placas con puertos FireWire para PCs compatibles con IBM.
I2O device support
La arquitectura I2O se ha pensado para dividir los manejadores de dispositivos I2O en dos partes: una dependiente del sistema operativo y otra no, de manera de que el fabricante del dispositivo en cuestión solamente deba hacer un solo manejador (la parte no dependiente del sistema operativo) y de esta forma poder utilizarlo en cualquier sistema operativo compatible con I2O. El autor11.9 no conoce actualmente ningún dispositivo de esta clase, seguramente con el tiempo irán siendo mas comunes.
Network device support
Esta sección engloba a todas las opciones de soporte de interfaces de red, desde ethernet de 10, 100 y 1000 Mbps, pasando por SLIP, PPP, PLIP, hasta interfaces WAN, Token Ring y otras. Normalmente se deberán activar las opciones de soporte para placas ethernet e interfaces PPP (si es que se utilizará módem).
Amateur Radio support
Los aficionados a las comunicaciones radiales no quedan de lado en lo que respecta a soporte en el núcleo. Linux tiene soporte para varios TNCs, o para simular un TNC usando una placa de sonido, de tal forma de poder conectarse con otros equipos mediante el protocolo AX.25.
IrDA (infrared) support
Esta sección generalmente es para las notebooks, que poseen un puerto infrarrojo. IrDA es un protocolo de transferencia de datos vía infrarrojo que se encuentra normalmente en PDAs (como las Palm) permitiendo así sincronizar los datos de la PDA en una notebook sin necesidad de conectarla con un cable serie o USB.
ISDN subsystem
ISDN (o RDSI, como se lo llama en España) es un tipo especial de servicios digitales de telefonía. Normalmente se lo utiliza para conectarse a Internet, teniendo una velocidad mucho mayor que conectando se con módem. Actualmente se está dejando de lado ISDN en favor de ADSL, en Argentina por ejemplo, ISDN no se ha visto, por su alto costo.
Old CD-ROM drivers (not SCSI, not IDE)
En esta sección se da soporte a aquellas unidades de CD-ROMs antiguas que no eran compatibles con las normas IDE ni SCSI. Generalmente eran unidades que había que conectar a placas de sonido, actualmente no se ven esta clase de unidades de CD-ROM.
Input core support
Las opciones que esta sección provee, permiten la configuración de dispositivos de entrada del tipo USB, tales como teclados, mouses, etc.
Multimedia devices
Esta sección contiene las opciones necesarias para dar soporte a dispositivos de captura de vídeo y tarjetas de radio.
File systems
Los sistemas de archivos son los formatos que se le dan a las particiones para poder almacenar archivos, administrar los atributos de cada archivo, etc. Esta sección posee las opciones de soporte de sistemas de archivos tanto nativos de GNU/Linux como de otros sistemas operativos, como por ejemplo FAT32. Es importante tener en cuenta que el soporte para el sistema de archivo que se esté utilizando en el sistema debe estar compilado dentro del núcleo y no como módulo, normalmente este sistema es el Second extended filesystem (e2fs). En los últimos núcleos se puede configurar el soporte para un nuevo sistema de archivos nativo de GNU/Linux: el Reiser filesystem (reiserfs), el cual es un sistema de archivos jornalizado, que provee ciertas características que lo hacen mas seguro que el e2fs. Además se provee opciones para dar soporte a varios sistemas de archivos de red, que permiten utilizar discos remotos como si fueran locales al equipo, como por ejemplo NFS (generalmente se utiliza en los UN*X), SMB (plataformas Windows) y NCP (volúmenes NetWare).
Console drivers
Aquí se encuentran las opciones para configurar el tipo de consola que se usará en el sistema. Dependiendo de la tarjeta de vídeo que se posea, se puede configurar para que la consola tenga el típico formato de 80x25 caracteres, o mas resolución. También se puede configurar el núcleo para soportar mas de una placa de vídeo, pudiendo tener dos monitores, uno como consola de texto y otro como consola gráfica.
Sound
Esta sección contiene las opciones de sonido, pudiendo configurar una gama de tarjetas de sonido bastante amplia.
USB support
Esta sección provee soporte para distintos dispositivos USB, desde escáneres, dispositivos de almacenamiento de datos, reproductores de MP3, módems, impresoras hasta adaptadores de red.
Kernel hacking
Esta sección contiene una opción que se utiliza cuando se prueban núcleos en desarrollo, generalmente no se necesitará (ni tampoco será muy seguro) activar esta opción, a menos que se esté colaborando con el desarrollo del núcleo.

Una vez seleccionadas todas las opciones, se debe salir del sistema de configuración del núcleo y salvar los cambios. Las opciones seleccionadas del núcleo se guardarán en el un archivo llamado .config dentro del árbol de fuentes del núcleo. Esto es interesante saberlo para poder copiarlo en algún sitio como respaldo y no perder las configuraciones del núcleo si necesitamos alguna vez borrar todos los archivos (por cuestión de espacio, por ejemplo).

Una vez que se ha salido del sistema de configuración del núcleo, antes de compilar se deben generar las dependencias con el siguiente comando:

root@maquina:/usr/src/linux# make dep

Luego se compila el núcleo:

root@maquina:/usr/src/linux# make bzImage

Esto puede tardar algunos minutos, dependiendo de la potencia del procesador y la cantidad de memoria RAM del equipo.

La opción bzImage (tener en cuenta las mayúsculas) le dice al compilador que genere el archivo del núcleo y lo comprima con bzip2. Antes se utilizaba la opción zImage que generaba un núcleo comprimido con gzip, pero tenía un límite de tamaño que actualmente se ha sobrepasado por la cantidad de opciones que posee el núcleo. bzip2 comprime mejor que gzip.

Luego de generar el núcleo, se deben generar los módulos, con el comando:

root@maquina:/usr/src/linux# make modules

Esta etapa quizás tome mas tiempo que la anterior, dependiendo de la cantidad de opciones que se hayan elegido como módulos.

Una vez finalizado, se deben instalar los módulos de la siguiente manera:

root@maquina:/usr/src/linux# make modules_install

Y por último, se debe copiar el archivo del núcleo a algún sitio donde estén alojados normalmente los núcleos, como por ejemplo el directorio /boot. El archivo del núcleo, suponiendo que el conjunto de archivos fuente del núcleo se haya almacenado en el directorio /usr/src/linux, se encuentra en /usr/src/linux/arch/i386/boot/bzImage.

Como último paso, se debe configurar el LILO para poder probar el nuevo núcleo, pero esto se verá en la sección 11.2.5.

A modo de información, es conveniente comentar el uso de una utilidad bastante práctica. El comando dmesg imprime en pantalla los diferentes mensajes de inicio que el núcleo muestra cuando se arranca el sistema. Esto puede ser muy útil cuando se necesita chequear mensajes de error que no se han podido leer bien en el arranque.


next up previous contents
Next: LILO Up: Personalización y compilación del Previous: Actualización del núcleo   Índice General
Proyecto Cursos - LuCAS - http://lucas.hispalinux.es/htmls/cursos.html