Test Foro de elhacker.net SMF 2.1

Informática => Tutoriales - Documentación => Mensaje iniciado por: ip en 7 Julio 2003, 15:50 PM

Título: Compilación del kernel paso a paso
Publicado por: ip en 7 Julio 2003, 15:50 PM
Sacado de http://www.linux-chile.org
----------------------------------

Configuración y Compilación del Kernel
Versión: 0.1
Autor: PinkX

Introducción
La intención de este documento es orientar a quienes quieren, por primera vez, compilar ellos mismos el kernel de su máquina. Comenzaré por explicar conceptos básicos como qué es el kernel, y describiré algunas de las características más comunes e importantes.

En ningún caso pretendo describir la funcionalidad de cada una de las opciones que forman parte del kernel, sino únicamente servir de guía en este importante paso.

¿Qué es el Kernel?
Debemos comenzar por respondernos esta pregunta. El Kernel en sí es el corazón o núcleo del Sistema Operativo. En nuestro caso, el kernel se llama Linux, y el Sistema Operativo en sí lo compone el kernel junto con una serie de programas y aplicaciones.

¿Para qué compilar el Kernel?
Una pregunta que a veces los usuarios principiantes se hacen es justamente esta: para qué compilar el kernel si ya tienen su máquina funcionando. La respuesta es simple, y es que entre una versión y otra de los distintos kernel se agregan caracterísitcas nuevas al mismo además de una serie de mejoras. Por otro lado, el kernel que acompaña a las distribuciones es un kernel genérico, esto quiere decir que no tiene ningún tipo de optimización para nuestro hardware específico, viene por defecto para procesadores i386, y lo más probable que tenga soporte para una gran cantidad de dispositivos que es innecesaria puesto que no los poseemos.

Por último, el compilar el kernel es un paso altamente educativo y didáctico para comprender en mayor profundidad el funcionamiento del sistema, y siempre es bueno saberlo por si alguien lo pregunta  

¿Qué necesito para poder compilar el kernel?
En primer lugar, un compilador (gcc). Necesitamos además las librerías de desarrollo correspondientes al sistema (glibc), y en algunos casos requeriremos también del ensamblador as que se distribuye en el paquete binutils. Otros ensambladores disponibles para Linux son gasm o nasm.

Una vez que confirmemos la existencia de todas estas herramientas en nuestro sistema, es necesario contar, obviamente, con las fuentes del kernel.

En la mayoría de las distribuciones estas se incluyen en el disco de instalación, pero no se instalan por defecto. De todas maneras es recomendable bajar siempre la última versión puesto que la mayoría de los fabricantes de distribuciones incluye código adicional en su kernel que no forma parte del original.

Si tienes la seguridad que cuentas con los fuentes 100% originales sin modificaciones, es posible que te actualices a la última versión a través de parches.

Los parches son archivos que contienen las diferencias entre un árbol de fuentes y otro. Por ende, es mucho más conveniente actualizar nuestro kernel a través de este metodo sobre todo si contamos con una conexión a internet relativamente lenta, puesto que los parches son de muy pequeño tamaño.

Parchando el kernel
Si tienes una versión completa del kernel, no es necesario que leas esta sección, aunque puedes hacerlo para fines educativos.

Los parches se aplican en forma consecutiva. Esto quiere decir que, si por ejemplo, tu versión actual del kernel es la 2.2.13 y deseas actualizarte a la 2.2.16, necesitas los parches 2.2.14, 2.2.15 y 2.2.16. Estos deben ser aplicados en ese orden, uno después del otro, y no es necesario realizar una compilación en cada paso. Es necesario remarcar que no es posible parchar una versión mayor del kernel: del 2.0.36 no se puede parchar al 2.2.

Siguiendo el ejemplo anterior en que actualizaremos el kernel 2.2.13 al 2.2.16, supondremos que los parches se encuentran en nuestro directorio home para el usuario usuario, en formato gzip. El árbol de nuestro kernel actual se encuentra en /usr/src/linux, que a su vez debe ser un link simbólico a /usr/src/linux-2.2.13. Dentro de ese directorio, llamamos el siguiente comando:

localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.14.gz | patch -p0
localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.15.gz | patch -p0
localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.16.gz | patch -p0

Esta serie de comandos puede ser reemplazada por el siguiente, siempre y cuando tengamos solo aquellos parches en dicha ubicación:

localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.1* | patch -p0

Si después de lo anterior no obtenemos ningún mensaje de error (y espero que así sea), todo está bien y ahora contamos con un árbol actualizado con la última versión del kernel. Entonces actualizamos el link simbólico, renombrando el directorio primero:

localhost:/usr/src# mv linux-2.2.13 linux-2.2.16
localhost:/usr/src# ln -sf linux-2.2.16 linux

Finalmente tenemos todo listo para configurar y compilar.

El proceso de configuración
Como mencioné en un principio, una de las razones por la cual compilar el kernel es para ajustarlo y optimizarlo a nuestro hardware. Esto se hace por medio de la configuración, un proceso con una gran cantidad de opciones. Acá trataré de describir solo aquellas más comunes e importantes.

Antes de comenzar, es necesario tomar en cuenta lo siguiente: muchas de las características propias del kernel pueden ser compiladas dentro del mismo o como módulos. La diferencia radica principalmente en que, mientras más modularizado sea nuestro kernel, más pequeño será el tamaño de su imagen, lo que por ende nos lleva a una mejor utilización de la memoria.

Por otro lado, la utilización de módulos tiene otra gran ventaja: un kernel dinámico hace más facil la tarea de agregar o eliminar hardware, puesto que solamente es necesario compilar e instalar o eliminar el módulo correspondiente, respectivamente, y no reconfigurar todas las opciones del sistema y compilar un nuevo kernel. Además, los módulos son cargados en memoria y eliminados de ella en demanda, haciendo nuevamente un manejo más eficiente de los recursos.

Por último, cabe decir que hay quienes ven en la existencia de módulos un gran riesgo de seguridad: un módulo malicioso puede ser capaz de esconder procesos, usuarios, etc. (por ejemplo el módulo heroine). Por supuesto, los módulos requieren de privilegios root para ser instalados, por lo que la máquina debe tener un compromiso de seguridad previo para que esto suceda (cosa que un buen administrador no permitirá ).

Dicho todo esto, vamos a lo nuestro. La configuración del kernel se lleva a cabo a través de un programa interactivo que muestra todas las posibles opciones. En este sentido, existen tres posibilidades: un sencillo programa de consola que consta en una serie de preguntas (no recomendado, es muy tedioso y no da la posibilidad de retroceder), otro es un programa al igual de consola pero con una interfaz basada en ncurses lo que lo hace mucho más amigable para el usuario (definitivamente la mejor alternativa), y por último un programa similar pero para X11 (no recomendado puesto que puede presentar problemas de estabilidad). Estos programas se ejecutan, respectivamente, de la siguiente manera:

localhost:/usr/src/linux# make config

localhost:/usr/src/linux# make menuconfig

localhost:/usr/src/linux# make xconfig

Todos estos cuentan con pantallas de ayuda para la gran mayoría de cada una de las opciones de configuración. Como mencioné más arriba, la segunda alternativa es la más segura, y es según la cual me guiaré en el resto de este documento.

Al ejecutar este comando, nos encontraremos luego de un instante frente a una pantalla con una serie de opciones.

¿Qué elegir?
Las opciones a elegir pueden presentarse de la siguiente manera: