Gentoo Logo

Renuncia de responsabilidad: La versión original de este artículo fue publicada por IBM developerWorks y es propiedad de Westtech Information Services. Este documento es una versión actualizada del artículo original y contiene mejoras introducidas por el Equipo de Documentación de Gentoo.
Este documento carece de soporte activo.


Compilar el núcleo Linux

Contenido:

1.  Introducción al núcleo

El núcleo es... ¡Linux!

¿Qué se piensa al oír la palabra "Linux"? Cuando la oigo, normalmente pienso en una distribución de Linux completa y en todos los programas que hacen funcionar esta distribución.

De todos modos, puede sorprendernos que, técnicamente, Linux sea un núcleo, y nada más que un núcleo. Mientras que las otras partes a las que comúnmente denominamos Linux (como el intérprete de comandos y el compilador) y que son partes esenciales de cualquier distribución, están separadas técnicamente de Linux (el núcleo). Mientras que mucha gente emplea el término "Linux" para referirse a una "distribución basada en Linux", al menos todo el mundo podría estar de acuerdo en que el núcleo Linux es el corazón de cada distribución.

Definición de la gestión del hardware

El rol primario del núcleo Linux es gestionar directamente el hardware en el sistema. El núcleo proporciona una capa de abstracción entre el hardware en sí mismo y los programas de aplicaciones. De este modo, los programas no necesitan saber los detalles acerca del conjunto de chips de la placa base o de la controladora del disco -- pueden operar en un nivel superior en el que leen y escriben archivos al disco en su lugar, por ejemplo.

Abstracción de la CPU

El núcleo Linux también proporciona un nivel de abstracción por encima de el (los) procesador(es) en el sistema -- permitiendo a múltiples programas aparentar ejecutarse al mismo tiempo. Linux hace esto permitiendo a varios procesos UNIX ejecutarse al mismo tiempo -- y el núcleo se encarga de proporcionar a cada uno un período de tiempo adecuado de el (los) procesador(es).

Un núcleo Linux puede soportar una única CPU o múltiples CPUs -- y el núcleo que estamos usando ahora está o bien capacitado para un solo procesador (UP-aware) o bien está capacitado para el multiprocesamiento simétrico (SMP-aware). Si tenemos una placa base con capacidad multiprocesador, pero estamos usando un núcleo monoprocesador, ¡Linux no reconocerá ninguno de los procesadores adicionales! Para resolver esto, tendríamos que compilar un núcleo SMP adecuado para nuestro hardware. En la actualidad, los núcleos SMP funcionan en sistemas con un solo procesador, aunque con una ligera pérdida de rendimiento.

Abstracción de Entradas/Salidas (I/O)

El núcleo también maneja la muy necesaria tarea de abstraer todas las formas de entrada y salida en ficheros. Imaginemos lo que ocurriría si cada programa tuviera que manejar el hardware directamente -- si hubiésemos cambiado la controladora de los discos, ¡todos los programas dejarían de funcionar! Afortunadamente, el núcleo Linux sigue el modelo UNIX de proporcionar una abstracción simple de entrada/salida al disco que todos los programas pueden usar. De este modo, nuestra base de datos favorita no tiene que preocuparse de si está almacenando los datos en un disco IDE, en una estructura RAID SCSI o en un sistema de ficheros montado en red.

Central de comunicaciones en red

Una de las cosas que han llevado Linux a la fama es su robusta comunicación en red, especialmente en el soporte TCP/IP. Si pensábamos que la pila de TCP/IP se encuentra en el núcleo, ¡estábamos en lo cierto!. El núcleo proporciona una buena interfaz de alto nivel para los programas que quieren enviar datos a través de la red. Tras todo ello, el núcleo Linux gestiona directamente la tarjeta de red o el módem, y maneja todos los detalles de bajo nivel de la comunicación por Internet.

Networking goodies

Una de las cosas más colosales acerca de Linux son todas las características tan útiles que se encuentran en el núcleo, especialmente aquellas relacionadas con las redes. Por ejemplo, se puede configurar un núcleo que permita a toda nuestra red doméstica acceder a Internet a través de nuestro módem Linux -- a esto se le denomina enmascaramiento IP o IP NAT (traducción de la dirección de red).

Adicionalmente, el núcleo Linux puede ser configurado para exportar o montar sistemas de ficheros basados en la red como NFS, permitiendo a otras máquinas UNIX de nuestra red de área local compartir datos con nuestro sistema Linux.

Arrancando. Primera parte

Cuando ponemos en funcionamiento nuestro sistema basado en Linux, el núcleo se carga desde el disco a la memoria por un gestor de arranque, como LILO. En este momento, el núcleo toma el control del sistema. Lo primero que hace es detectar e inicializar todo el hardware que encuentra -- y que ha sido compilado para soportar. Una vez que el hardware se inicializa adecuadamente, ya está listo para ejecutar procesos. El primer proceso que ejecuta se denomina init, que se encuentra en /sbin. Después, init comienza otros procesos adicionales, según lo especificado en /etc/inittab.

Arrancando. Segunda parte

init normalmente inicia varias copias de un programa llamado getty, que aguarda a que ingresen usuarios desde la consola. Después de que getty procese satisfactoriamente una solicitud de ingreso, se carga el intérprete de comandos por defecto (el cual suele ser bash). Una vez que nos encontramos en bash, tenemos el poder para lanzar cualquier programa que nos apetezca.

Mientras todos estos nuevos procesos se inician, el núcleo lleva todo el control, dividiendo cuidadosamente el tiempo de la CPU para que cada proceso disponga de una parte adecuada del mismo. Además, el núcleo sigue proporcionando la abstracción hardware y los servicios de red para todos los procesos en ejecución.

Presentando a... ¡los módulos!

Todos las versiones de Linux recientes soportan módulos del núcleo. Los módulos del núcleo son algo excelente -- son partes del núcleo que residen en el disco, hasta que se necesiten. Tan pronto como el núcleo necesite la funcionalidad de un determinado módulo, se carga desde el disco, se integra automáticamente en el núcleo y está disponible para su uso. Además, si un módulo del núcleo no se ha usado durante varios minutos, el núcleo puede voluntariamente descargarlo de la memoria -- algo que se denomina "autolimpieza".

Módulos. Segunda parte

Los módulos del núcleo se encuentran en /lib/modules, y cada módulo termina en .o ó .ko. Como es de suponer, cada módulo representa un componente particular de una funcionalidad en el núcleo -- un módulo puede proporcionar soporte para el sistema de ficheros FAT, mientras que otro puede proporcionar el soporte para una determinada tarjeta de red ISA.

Los módulos permiten que el núcleo ocupe muy poca memoria. Se puede crear un núcleo que únicamente contenga las características indispensables para iniciar nuestra computadora y que el resto de características se carguen bajo demanda como módulos. Debido a que el núcleo limpia automáticamente todos los módulos que carga, se puede poner bajo buen uso la memoria del sistema.

Módulos -- ¡cosas importantes!

No se puede poner todo en módulos. Debido a que los módulos se almacenan en el disco, la imagen de inicio del núcleo necesita tener integrado el soporte para la controladora de discos, así como para el sistema de ficheros nativo (normalmente el sistema de ficheros ext2). Si no se dispone de esos componentes esenciales integrados en la imagen del núcleo (y se encuentran compilados como módulos en su lugar), entonces el núcleo no estará capacitado para cargar esos módulos desde el disco -- creando el desagradable problema del huevo o la gallina.

2.  Localizar y descargar el código fuente

Versiones del núcleo

Para compilar un núcleo reciente, se necesita descargar el código fuente primero. Pero antes de descargar el código fuente del núcleo, necesitamos saber qué es lo que estamos buscando exactamente. La primera pregunta que hay que hacerse es -- ¿queremos usar un núcleo estable o experimental?

Los núcleos estables siempre tienen un segundo dígito par -- por ejemplo, 2.0.38, 2.2.15, 2.2.18, y 2.4.1 se consideran todos ellos núcleos "estables" (debido al 0, 2, 2 y el 4, respectivamente). Si se quieren hacer pruebas con un núcleo experimental, normalmente se buscará aquel cuyo número sea mayor y que tenga un segundo dígito impar. Por ejemplo, 2.3.99 y 2.1.38 son ambos núcleos experimentales (debido al 3 y al 1, respectivamente).

Historia de las versiones del núcleo

La serie 2.2 se considera una versión moderna y estable del núcleo. Si "moderna" y "estable" son cosas que nos suenan bien, hay que buscar el núcleo 2.2 con el tercer número lo más elevado posible (2.2.16 es la versión más reciente en este momento).

Mientras se estaba desarrollando la serie 2.2 del núcleo, se comenzó a trabajar en la serie 2.3. Esta serie se creó como campo de pruebas para nuevas y avanzadas características que posiblemente aparecerían en la serie 2.4 estable. En este momento, la serie 2.3 ha alcanzado la versión 2.3.99 y el desarrollo de la serie 2.3 se ha detenido. Estos días, los desarrolladores están trabajando en obtener la serie test de los núcleos 2.4.0. Si nos gusta vivir al límite deberíamos probar la versión 2.4.0-test más reciente que podamos obtener.

Aviso con respecto al núcleo 2.4

Una vez que se libere un núcleo 2.4 real (como el 2.4.0), no hay que asumir que dicho núcleo se encuentre listo para sistemas con una misión crítica como los servidores. A pesar de que la serie 2.4 se supone que será estable, es muy probable que los primeros núcleos 2.4 necesiten aún algo de depuración. Como suele ocurrir en informática, la primera versión de algo puede contener errores muy importantes. Mientras que esto no tiene porqué suponer ningún problema si estamos probando un núcleo en nuestra estación de trabajo doméstica, es un riesgo que se debe evitar cuando nuestra máquina proporciona servicios valiosos para otros.

Descargar el núcleo

Si solamente se desea compilar una nueva versión del núcleo que ya tenemos instalado (para habilitar el soporte SMP, por ejemplo), entonces la descarga no es necesaria -- se puede evitar esta sección y la siguiente si es el caso.

Se pueden encontrar núcleos en http://www.kernel.org/pub/linux/kernel . Cuando accedemos a este sitio, encontraremos el código fuente del núcleo organizado en diferentes directorios, basados en la versión del núcleo (v2.2, v2.3, etc.) Dentro de cada directorio encontraremos archivos con la etiqueta "linux-x.y.z.tar.gz". Éstos son los de código fuente del núcleo. También pueden verse archivos etiquetados como "patch-x.y.z.gz" y "patch-x.y.z.bz2". Estos archivos son parches que pueden usarse para actualizar la versión anterior del código fuente del núcleo. Si se quiere compilar una nueva versión del núcleo, será necesario descargar uno de los archivos "linux".

Desempaquetar el núcleo

Si se ha descargado un nuevo núcleo desde kernel.org, ha llegado el momento de descomprimirlo. Para ello, hacemos un cd a /usr/src. Si encontramos ahí un directorio con el nombre linux, entonces lo movemos a linux.old (mv linux linux.old, como superusuario o administrador).

Ahora es el momento de extraer el nuevo núcleo. Mientras seguimos en /usr/src, tecleamos:

Listado de Código 2.1: Extracción con gzip

# tar -xzvf /path/to/my/kernel-x.y.z.tar.gz

o

Listado de Código 2.2: Extracción con bzip2

# tar -xvjf /path/to/my/kernel-x.y.z.tar.bz2

Dependiendo de si el código fuente se encuentra comprimido con gzip o bzip2. Después de teclear ésto, nuestro nuevo código fuente del núcleo se encontrará en el nuevo directorio linux. Hay que tener cuidado: ¡Todo el código fuente del núcleo ocupa más de 50 megabytes en el disco!

3.  Configuración del núcleo

Hablemos acerca de la configuración

Antes de compilar el núcleo, es necesario configurarlo. La configuración nos proporciona la oportunidad de controlar exactamente las características que queremos habilitar (y deshabilitar) en nuestro nuevo núcleo. También podemos controlar las partes que se compilan integradas en la imagen binaria del núcleo (que se carga al inicio), y las partes que se cargan bajo demanda en módulos del núcleo.

La antigua forma de configurar el núcleo era tremendamente costosa, consistía en entrar en /usr/src/linux y teclear make config. A pesar de que make config todavía funciona, por favor, no utilice este método para configurar el núcleo -- a menos que nos guste responder a cientos (sí, sí, ¡cientos!) de preguntas sí/no en la línea de comandos.

La nueva forma de configurar

Nosotros, que somos algo más actuales, en lugar de teclear make config, o bien tecleamos make menuconfig o make xconfig. Si se desea configurar el núcleo, tecleamos una de estas dos opciones. Si tecleamos make menuconfig obtendremos un bonito sistema por menús basado en texto que podremos usar para configurar el núcleo, mientras que si tecleamos make xconfig obtendremos una hermosa interfaz gráfica de usuario basada en X para configurar las características del núcleo. He aquí una captura de make menuconfig:


Ilustración 3.1: menuconfig en acción

Fig. 1

Cuando se usa make menuconfig, las opciones que tienen un < > a su izquierda pueden ser compiladas como módulos. Cuando la opción se encuentra resaltada, presionar la barra espaciadora para elegir si la opción no está seleccionada (< >), seleccionada para estar integrada en la imagen del núcleo (<*>) o seleccionada para ser compilada como módulo (<M>).

Trucos de configuración

Hay muchísimas opciones en el núcleo, y no disponemos del lugar suficiente para explicarlas aquí -- por lo que, por favor, recomiendo leer la ayuda proporcionada por el propio núcleo. Todas las opciones están explicadas con mayor o menor detalle y cada una, normalmente, incluye la frase "If you don't know what this means, type Y (or N)." (si no se sabe lo que ésto significa, teclear Sí (o No)). Estos consejos nos ayudan a evitar problemas en caso de no saber lo que una opción hace en concreto. Para acceder a la ayuda, resaltamos la opción sobre la que tenemos dudas y presionamos la tecla "?".

4.  Compilar e instalar el núcleo

make dep; make clean

A una vez que hemos configurado el núcleo, llega el momento de compilarlo. Antes de que podamos compilarlo, necesitamos generar la información de las dependencias y limpiar cualquier "vestigio de compilación" antiguo. Lo cual se consigue tras teclear make dep; make clean mientras nos encontramos en /usr/src/linux.

Make bzImage

Ahora es el momento de compilar la imagen binaria del núcleo. Tecleamos make bzImage. Después de varios minutos, la compilación habrá culminado y encontraremos el archivo bzImage en /usr/src/linux/arch/i386/boot (para un núcleo x86 PC). Mostraremos cómo instalar la nueva imagen del núcleo en un momento, pero ahora es el momento de los módulos.

Compilar los módulos

Ahora que hemos creado la bzImage, es el momento de compilar los módulos. Aunque no se haya habilitado ni un solo módulo cuando se configuró el núcleo, este paso no debe evitarse -- es bueno adquirir el hábito de compilar los módulos inmediatamente después de una bzImage. Dado que si realmente no se tiene ningún módulo que compilar, este paso se lleva a cabo rápidamente. Tecleamos make modules; make modules_install. Lo cual da lugar a que los módulos se compilen y se instalen en /usr/lib/<kernelversion>.

¡Enhorabuena! Nuestro núcleo se encuentra compilado por completo y los módulos están compilados e instalados. Ahora es el momento de reconfigurar LILO para que pueda iniciar el nuevo núcleo.

5.  Configuración del inicio

Introducción a LILO

Ha llegado, finalmente el momento de reconfigurar LILO para que pueda cargar el nuevo núcleo. LILO es el gestor de arranque Linux más extendido, y se usa en todas las distribuciones Linux. Lo primero que debemos hacer es echar un vistazo al archivo /etc/lilo.conf. Contendrá una línea que incluya image=/vmlinuz. Esta línea le indica a LILO dónde encontrar el núcleo.

Configuración del inicio. Segunda parte

Para configurar LILO para que inicie el nuevo núcleo, tenemos dos opciones. La primera es sobreescribir el núcleo que estamos usando -- lo cual es muy arriesgado si no se dispone de ningún método de inicio de emergencia, como un disco de inicio con dicho núcleo en el mismo.

La opción más segura es configurar LILO para que pueda iniciar tanto la versión nueva como la antigua del núcleo. LILO puede configurarse para que inicie el nuevo núcleo por defecto, pero proporcionando una forma de seleccionar el antiguo en caso de encontrar problemas. Esta es la opción recomendada y la que mostraré cómo realizar.

Configuración del inicio. Tercera parte

Nuestro lilo.conf puede ser similar a este:

Listado de Código 5.1: /etc/lilo.conf

boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only

image=/vmlinuz
label=linux

Para añadir una nueva entrada de inicio a lilo.conf, hacemos lo siguiente. Primero, copiamos /usr/src/linux/arch/i386/boot/bzImage a un archivo en nuestra partición raíz, como /vmlinuz2. Una vez allí, duplicamos las tres últimas líneas de nuestro lilo.conf y las añadimos de nuevo al final del archivo... Casi hemos llegado...

Configuración del inicio. Cuarta parte

Ahora, nuestro lilo.conf debería ser semejante a este:

Listado de Código 5.2: el nuevo lilo.conf

boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only

image=/vmlinuz
label=linux

image=/vmlinuz
label=linux

Ahora, cambiamos la primera línea image= para que indique image=/vmlinuz2. Después cambiamos la segunda línea label= para que indique label=oldlinux. También es necesario asegurarse de que hay una línea delay=20 al comienzo del archivo -- de no haberla, se añade una. De haberla hay que confirmar que el número es 20 por lo menos.

Configuración del inicio. Quinta parte

El archivo lilo.conf definitivo será muy semejante a éste:

Listado de Código 5.3: El lilo.conf final

boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only

image=/vmlinuz2
label=linux

image=/vmlinuz
label=oldlinux

Después de hacer todo esto, necesitaremos ejecutar lilo como superusuario. ¡Lo cual es muy importante! Si no lo hacemos el proceso de inicio no funcionará. Ejecutando lilo damos la oportunidad de que actualice su mapa de inicio.

Explicación de la configuración de inicio

Expliquemos ahora todos nuestros cambios. El archivo lilo.conf fue configurado para permitirnos iniciar dos núcleos diferentes. Nos permite iniciar nuestro núcleo original, localizado en /vmlinuz. También nos permitirá iniciar nuestro nuevo núcleo, localizado en /vmlinuz2 . Por defecto, intentará iniciar el nuevo núcleo (debido a que las líneas image/label para el nuevo núcleo aparecen primero en el archivo de configuración).

Si, por cualquier circunstancia, se necesita iniciar el núcleo anterior, sencillamente reiniciamos la computadora y presionamos la tecla de mayúsculas. LILO lo detectará y nos permitirá teclear la etiqueta de la imagen que deseamos iniciar. Para iniciar nuestro viejo núcleo teclearíamos oldlinux y pulsaríamos intro. Para ver una lista con todas las posibles etiquetas, hay que pulsar TAB.

6.  Recursos

¡Enhorabuena por la compilación de nuestro propio núcleo! Espero que todo funcionase bien. He aquí algunos recursos donde se puede aprender más acerca de la compilación del núcleo:

  • www.kernel.org, el sitio que contiene los archivos del núcleo Linux.
  • The Kernel Newbies FAQs. Kernel Newbies es un excelente recurso par aprender cómo compilar el núcleo, así como aprender cómo funcionan las diferentes partes. El sitio también ofrece una visión detallada aunque fácil de leer de los cambios entre cada versión nueva del núcleo.


Imprimir

Página actualizada 10 de diciembre, 2010

Sumario: Daniel Robbins presenta el núcleo Linux, después nos guía en el proceso de localizar y descargar el código fuente, configurar el núcleo, compilar e instalar el núcleo y la configuración para iniciarlo.

Daniel Robbins
Autor

LinuxBlues
Traductor

José María Alonso
Traductor

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.