Ilustrados comunidad mundial educativa
Inicio | Escribenos
User: Pass: Recordar ó (Registrate!)

| !Publicar Articulo¡

Compilación del kernel de linux

Resumen: Algunas se desea compilar el kernel para personalizarlo y que se acople mejor a necesidades específicas en vez de trabajar con el kernel que viene predeterminado en una distribución Linux en particular.
2,875 visitas
Rating: 0
Tell a Friend
Autor: Jaime Montoya

RESUMEN
Algunas se desea compilar el kernel para personalizarlo y que se acople mejor a necesidades específicas en vez de trabajar con el kernel que viene predeterminado en una distribución Linux en particular. La idea básica de compilar un kernel es aumentar las capacidades del kernel y reducirlo para hacerlo más ligero o más rápido, adaptándolo a las necesidades que se tengan en un momento dado. A continuación se describen los pasos para compilar el kernel, lo cual se ha hecho en Linux Debian Etch.

DESARROLLO
Primeramente se debe descargar el kernel a instalar desde www.kernel.org, que en este caso será la versión 2.6.22.9 full source desde www.kernel.org/pub/linux/kernel/v2.6/linux-2.6/linux-2.6.22.9.tar.bz2. El nombre del archivo es "linux-2.6.22.9.tar.bz2" y su tamaño es de 43 MB.

Para la compilación del kernel, algunos de los paquetes que se deben tener instalados son: gcc, ncurses y make. Para la instalación de estos paquetes se hace lo siguiente:

Se necesita instalar el GNU Compiler Collection, que es un conjunto de compiladores creados por el proyecto GNU. GCC es software libre y lo distribuye la Free Software Foundation bajo la General Public License. Estos compiladores se consideran estándar para los sistemas operativos derivados de UNIX, de código abierto o también de propietarios, como Mac OS X. GCC requiere el conjunto de aplicaciones conocido como binutils para realizar tareas como identificar archivos objeto u obtener su tamaño para copiarlos, traducirlos o crear listas, enlazarlos, o quitarles símbolos innecesarios. Originalmente GCC significaba GNU C Compiler (compilador GNU para C), porque sólo compilaba el lenguaje C. Posteriormente se extendió para compilar C++, Fortran, Ada y otros. El objetivo de GCC es mejorar el compilador usado en los sistemas GNU incluyendo la variante GNU/Linux. El desarrollo de GCC usa un entorno de desarrollo abierto y soporta muchas otras plataformas con el fin de fomentar el uso de un compilador-optimizador de clase global, para atraer muchos equipos de desarrollo, para asegurar que GCC y los sistemas GNU funcionen en diferentes arquitecturas y diferentes entornos. La instalación de GCC se hace así:

# apt-get install gcc-*
Need to get 83.3MB of archives.
After unpacking 196MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://ftp.debian.org etch/main gcc272 2.7.2.3-19 [650kB]
Get:2 http://ftp.debian.org etch/main cpp-2.95 1:2.95.4-27 [116kB]
Get:3 http://ftp.debian.org etch/main gcc-3.3-base 1:3.3.6-15 [151kB]
Get:4 http://ftp.debian.org etch/main cpp-3.3 1:3.3.6-15 [1375kB]
Get:5 http://ftp.debian.org etch/main gcc-3.4-base 3.4.6-5 [164kB]
Get:6 http://ftp.debian.org etch/main cpp-3.4 3.4.6-5 [1735kB]
Get:7 http://ftp.debian.org etch/main libstdc++6-4.1-dev 4.1.1-21 [1634kB]
Get:8 http://ftp.debian.org etch/main g++-4.1 4.1.1-21 [2615kB]
Get:9 http://ftp.debian.org etch/main g++ 4:4.1.1-15 [1360B]
Get:10 http://ftp.debian.org etch/main gcc-2.95 1:2.95.4-27 [949kB]
Get:11 http://ftp.debian.org etch/main gcc-2.95-doc 1:2.95.4-27 [448kB]
Get:12 http://ftp.debian.org etch/main gcc-3.3 1:3.3.6-15 [1425kB]
Get:13 http://ftp.debian.org etch/main gcc-3.4 3.4.6-5 [1409kB]
Get:14 http://ftp.debian.org etch/main gcc-4.1-locales 4.1.1-21 [1458kB]
Get:15 http://ftp.debian.org etch/main gcc-4.1-source 4.1.1-21 [43.9MB]
Get:16 http://ftp.debian.org etch/main gccxml 0.7.0+cvs20060311-2 [2252kB]
Get:17 http://ftp.debian.org etch/main libc6-amd64 2.3.6.ds1-13etch2 [3327kB]
Get:18 http://ftp.debian.org etch/main lib64gcc1 1:4.1.1-21 [24.5kB]
Get:19 http://ftp.debian.org etch/main pocketpc-binutils 2.15-2 [2251kB]
Get:20 http://ftp.debian.org etch/main pocketpc-gas 2.13.2.1-1 [431kB]
Get:21 http://ftp.debian.org etch/main pocketpc-sdk 1.0.0-4 [60.0kB]
Get:22 http://ftp.debian.org etch/main pocketpc-gcc 3.4.2-2 [3278kB]
Get:23 http://ftp.debian.org etch/main binutils-avr 2.16.1-1 [2513kB]
Get: 24..........


Ahora instalar Ncurses:

# apt-get install ncurses-*
Need to get 14.0MB of archives.
After unpacking 54.3MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://ftp.debian.org etch/main ncurses-term 5.5-5 [331kB]
Get:2 http://ftp.debian.org etch/main libruby1.8 1.8.5-4 [1529kB]
Get:3 http://ftp.debian.org etch/main ruby1.8 1.8.5-4 [217kB]
Get:4 http://ftp.debian.org etch/main libreadline-ruby1.8 1.8.5-4 [197kB]
Get:5 http://ftp.debian.org etch/main irb1.8 1.8.5-4 [235kB]
Get:6 http://ftp.debian.org etch/main libruby1.9 1.9.0+20060609-1 [1748kB]
Get:7..........

Probablemente "make" ya se encuentre instalado, sin embargo para mayor seguridad se debe probar así:

# apt-get install make

Luego realizar esta instalación:

# apt-get install libqt3-*
Need to get 19.1MB of archives.
After unpacking 61.6MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://ftp.debian.org etch/main firebird2-common 1.5.3.4870-12 [235kB]
Get:2 http://security.debian.org etch/updates/main libpq4 8.1.9-0etch1 [270kB]
Get:3 http://ftp.debian.org etch/main gcj-4.1-base 4.1.1-20 [91.5kB]
Get:4 http://ftp.debian.org etch/main libgcj-common 1:4.1.1-21 [11.3kB]
Get:5 http://ftp.debian.org etch/main libgcj7-0 4.1.1-20 [9031kB]
Get:6 http://ftp.debian.org etch/main libgcj-bc 4.1.1-21 [1120B]
Get:7 http://ftp.debian.org etch/main gij-4.1 4.1.1-20 [21.1kB]
Get:8 http://ftp.debian.org etch/main gij 4:4.1.1-15 [1280B]
Get:9 http://ftp.debian.org etch/main libaudio-dev 1.8-4 [1103kB]
Get:10 http://ftp.debian.org etch/main libgpg-error-dev 1.4-1 [33.6kB]
Get:11 http://ftp.debian.org etch/main libgcrypt11-dev 1.2.3-2 [251kB]
Get:12 http://ftp.debian.org etch/main libtasn1-3-dev 0.3.6-2 [308kB]
Get:13 http://ftp.debian.org etch/main libpopt-dev 1.10-3 [38.1kB]
Get:14 http://ftp.debian.org etch/main libopencdk8-dev 0.5.9-2 [122kB]
Get:15 http://ftp.debian.org etch/main liblzo-dev 1.08-3 [111kB]
Get:16 http://ftp.debian.org etch/main libgnutls-dev 1.4.4-3 [359kB]
Get:17 http://ftp.debian.org etch/main libcupsys2-dev 1.2.7-4 [138kB]
Get:18 http://ftp.debian.org etch/main libfbclient1 1.5.3.4870-12 [382kB]
Get:19..........


A continuación hacer la siguiente instalación:

# apt-get install initrd-*
Need to get 140kB of archives.
After unpacking 492kB of additional disk space will be used.
Do you want to continue [Y/n]? Y


Aunque la instalación anterior quizá no sea necesaria por haberse hecho ya antes. Con "# apt-get install initrd-*" se busca instalar el initial ramdisk o initrd, que es un sistema de archivos temporal usado por el kernel de Linux durante el inicio del sistema.

El * indica que se instalarán todos los paquetes que inician con las letras establecidas antes del asterisco.

El código fuente con extensión tar.bz2 que se descargó debe copiarse al directorio /usr/src. Recuérdese que para realizar esta acción deben haber permisos de escritura para el directorio /usr/src, lo cual se puede hacer con "# chmod 777 /usr/src". La dirección completa del código fuente del kernel comprimido será entonces /usr/src/linux-2.6.22.9.tar.bz2.

Ahora se creará un directorio de trabajo en el directorio home del usuario (en este caso el nombre de usuario es "jaimemontoya") con el que se está trabajando (se deben asignar permisos de escritura para el directorio en el que se va a escribir), así:

# chmod 777 /home/jaimemontoya
# cd /home/jaimemontoya
# exit
$ mkdir -p $HOME/build/kernel-2.6.22.9


"$HOME/build/kernel-2.6.22.9" equivale a "/home/build/kernel-2.6.22.9". "# exit" se ha utilizado para dejar de ser superusuario y poder crear el directorio como usuario normal, no como superusuario. El parámetro -p se usa para crear el directorio build, si no existiese, para poder luego crear el directorio kernel-2.6.22.9.

Posteriormente se debe descomprimir el archivo de código fuente del kernel:
$ su
Password:
# cd /usr/src
# pwd
# tar -jxvf /usr/src/linux-2.6.22.9.tar.bz2


Esto último como superusuario, para lo cual se ha utilizado el comando "$ su". Antes de descomprimir es necesario ubicarse en /usr/src, lo cual se consigue con "# cd /usr/src" y luego con "# pwd" se puede verificar que ya se está en la ubicación deseada.

Si existiese el enlace simbólico /usr/src/linux, eliminarlo así (asumiendo que la ubicación actual es /usr/src):
# rm linux

Ahora crear el enlace simbólico /usr/src/linux, apuntando a la carpeta recién descomprimida:
# ln -s linux-2.6.22.9 linux

Todo esto se debe hacer estando en el directorio /usr/src.

Ahora moverse al enlace simbólico /usr/src/linux que se creó anteriormente:
# cd linux

Verificar que todo hasta el momento va bien:
# make mrproper

Si no aparece ningún error, todo hasta el momento va bien y ya se puede iniciar la compilación del kernel.

Se comienza por configurar el kernel con el fín de adaptarlo a las necesidades que se tengan. En este momento se podrán eliminar o aplicar secciones del kernel al antojo del usuario. La mayoría de secciones son intuitivas en el sentido de que se puede comprender sin demasiada complicación qué parte del kernel se manipula. Para llevar a cabo esta configuración se deberá hacer de la siguiente forma (considerando que en este caso el usuario se llama "jaimemontoya"):

# make O=/home/jaimemontoya/build/kernel-2.6.22.9 menuconfig

El caracter que aparece antes del signo = es la letra O mayúscula. Con esto se creará una estructura de archivos en el directorio especificado, donde se almacenará todo el contenido del kernel compilado. Este paso debe ser hecho cuidadosamente para que se logre conocer mejor todo lo que el kernel de Linux proporcionar. Para que este paso se concluya con éxito, se deberán guardar todos los cambios que se deseen hacer, de manera que al momento de salir aparecerá la pregunta de si se desean guardar los cambios, a lo cual se deberá responder que sí.

NOTA: es necesario que al utilizar "# make O=/home/jaimemontoya/build/kernel-2.6.22.9 menuconfig", la ubicación actual sea el enlace simbólico que se creó, es decir "/usr/src/linux". Para confirmar que se ha llegado a dicha ubicación, utilizar "# pwd". Si no se hiciera asín, aparecerá el siguiente mensaje:

make: *** No rule to make target `menuconfig'. Stop.


Si todo se ha hecho correctamente, luego de utilizar "# make O=/home/jaimemontoya/build/kernel-2.6.22.9 menuconfig" y aparecerá una pantalla azul donde se deberán elegir las opciones personalizadas que se le quieren dar al kernel. Esto se puede hacer al antojo de cada usuario, de acuerdo a lo que quiera hacer o el objetivo que se persiga con el uso del kernel.

NOTA: para que aparezca esa pantalla azul de configuración, la ventana de la consola se debe tener completamente maximizada o en un tamaño suficientemente grande, pues de lo contrario aparecerán estos errores:

Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make[2]: *** [menuconfig] Error 1
make[1]: *** [menuconfig] Error 2
make: *** [menuconfig] Error 2


El contenido del menú principal para configurar lo que tendrá o no el kernel que se va a compilar, es el siguiente:
.config - Linux Kernel v2.6.22.9 Configuration
Linux Kernel Configuration
Arrow keys navigate the menu. selects submenus --->. Highlighted letters are hotkeys. Pressing includes, excludes, modularizes features. Press to exit, for Help, for Search. Legend: [*] built-in [ ] excluded module < > module capable

Code maturity level options --->
General setup --->
Loadable module support --->
Block layer --->
Processor type and features --->
Power management options (ACPI, APM) --->
Bus options (PCI, PCMCIA, EISA, MCA, ISA) --->
Executable file formats --->
Networking --->
Device Drivers --->
File systems --->
Instrumentation Support --->
Kernel hacking --->
Security options --->
Cryptographic options --->
Library routines --->
---
Load an Alternate Configuration File
Save an Alternate Configuration File


Habiendo hecho el paso anterior y guardado los cambios que se eligieron, se necesita ahora crear la imagen, así:
# make O=/home/jaimemontoya/build/kernel-2.6.22.9 bzImage

Con lo anterior se proporcionará en sí el kernel, que se llamará al momento del arranque y que estará encargado de administrar todos los módulos que se compilarán con él en los pasos que se describirán posteriormente. Cuando este proceso finaliza, aparece al final un mensaje como este:
Root device is (3, 2)
Boot sector 512 bytes.
Setup is 7537 bytes.
System is 1358 kB
Kernel: arch/i386/boot/bzImage is ready (#1)


Un kernel modular, para fines prácticos, será más pequeño que uno con todo incluido; por lo tanto, el tipo modular se vuelve propicio por muchas razones. Para crear los módulos del kernel, se deberá realizar la siguiente acción:
# make O=/home/jaimemontoya/build/kernel-2.6.22.9 modules

Con eso se crearán la mayoría de opciones contenidas en el kernel, como módulos que serán cargados de manera dinámica cuando sea necesarios utilizarlos. Esto también facilita agregar nuevos módulos.

Si la acción anterior se llevó a cabo de manera correcta, entonces se vuelve necesario instalar los módulos en el sistema para que el kernel los pueda usar de forma dinámica. Para esto se deberá realizar la siguiente acción:
# make O=/home/jaimemontoya/build/kernel-2.6.22.9 modules_install

Si el paso anterior se realiza de forma correcta, se creará una carpeta en el directorio /lib/modules/, la cual tendrá por nombre la numeración con la que finaliza el kernel, que en este caso será la versión 22.6.22.9. El directorio o carpeta que se habrá creado es entonces "/lib/modules/2.6.22.9". Para confirmar que se acaba de crear, se puede ver la fecha y hora de modificación de dicho directorio y se confirmará que ha sido recién creado mediante "# make O=/home/jaimemontoya/build/kernel-2.6.22.9 modules_install". Esto indica que los módulos han sido colocados correctamente en el sistema Linux. Esta carpeta se utilizará más adelante para crear un archivo de ram disk y levantar el kernel al momento de arranque.

Lo único que falta ahora es instalar el kernel, lo cual se puede realizar de dos formas. La primera forma es mediante la ejecución de la siguiente instrucción:
# make O=/home/jaimemontoya/build/kernel-2.6.22.9 install

Este primer método genera todas la configuraciones necesarias. Dichas configuraciones (que se encuentran en el GRUB), serán sobreescritas, lo cual no da garantías porque si el kernel recién compilado no corre, no habrá forma de acceder al sistema.

La segunda forma de realizar la instalación del kernel es larga pero más segura, lo cual garantiza tener el kernel actual funcionando y crear una nueva configuración para el kernel recién compilado. Para ello se deberá realizar lo siguiente:

Copiar la imagen creada anteriormente (/home/jaimemontoya/build/kernel-2.6.22.9/arch/i386/boot/bzImage) al directorio /boot y ponerle un nombre que haga referencia a toda la configuración de GRUB para el kernel:

# cp /home/jaimemontoya/build/kernel-2.6.22.9/arch/i386/boot/bzImage /boot/vmlinuz-2.6.22.9-jaimemontoya

Luego se tiene que copiar el archivo de configuración:

# cp /home/jaimemontoya/build/kernel-2.6.22.9/.config /boot/config-2.6.22.9-jaimemontoya

Respecto al archivo /home/jaimemontoya/build/kernel-2.6.22.9/.config, si se quiere ver de forma gráfica con el navegador Konqueror por ejemplo (presionando F9 desde el navegador y luego en la pestaña Root Folder navegando en los directorios), se deberá activar la opción "Show Hidden Files" o "Mostrar Archivos Ocultos" en el menú View o Ver del navegador Konqueror.

Ahora se tiene que copiar el archivo System.map:
# cp /home/jaimemontoya/build/kernel-2.6.22.9/System.map /boot/System.map-2.6.22.9-jaimemontoya

En este momento se tiene que crear el archivo initrd o randisk para el arranque del kernel. Como se mencionó anteriormente, si los módulos se instalaron correctamente, se tuvo que generar una carpeta en el directorio /lib/modules/, la cual debe corresponder con los últimos números del kernel. En este caso se generó la carpeta /lib/modules/2.6.22.9, la cual contiene los módulos del kernel recién compilado. Para mayor seguridad se debe verificar la fecha de creación. Teniendo la carpeta /lib/modules/2.6.22.9, se debe realizar la siguiente acción:
# mkinitrd -o /boot/initrd.img-2.6.22.9-jaimemontoya /lib/modules/2.6.22.9

Esto creará el archivo de ramdisk /boot/initrd.img-2.6.22.9-jaimemontoya, el cual levantará el kernel en el arranque, es decir que cargará el kernel en memoria.

En este momento se tiene que verificar que todos los archivos copiados se encuentren en la carpeta /boot, lo cual se puede hacer con "# ls -la /boot" o de manera gráfica con el navegador Konqueror por ejemplo, como se dijo anteriormente.

Finalmente se tiene que crear una nueva sección de GRUB en el archivo /boot/grub/menu.lst, similar a la que levanta el kernel inicial Linux, pero haciendo referencia a los archivos que se acaban de crear.

Por ejemplo si se tuviera una sección como esta:


Se debe copiar y reemplazar luego con los datos del nuevo kernel compilado, así:


Luego se le deben asignar permisos de escritura a /boot/grub/menu.lst para poder guardar las modificaciones en este archivo. El permiso de escritura se puede asignar con "# chmod 777 /boot/grub/menu.lst".

Finalmente se tiene que reiniciar la computadora y ya se podrá trabajar en el nuevo kernel instalado. Para confirmar que realmente se está trabajando en el kernel que se compiló e instaló, se puede utilizar "$ uname -a" o "$ cat /proc/version" y se verá que ya se tiene la nueva versión 2.6.22.9. También aparece la fecha en que se generó esta actualización, de manera que no quedará duda alguna de que realmente ya se tiene el nuevo kernel y que el proceso se realizó satisfactoriamente, pues al utilizar "$ uname -a" el resultado es:

Linux jaimemontoya 2.6.22.9 #1 Thu Sep 27 17:42:06 CST 2007 i686 GNU/Linux

Ahora ya se puede disfrutar del nuevo kernel instalado y el proceso se puede repetir las veces que se desee para instalar en el futuro nuevas versiones de los kernel que se desee ya sea por gusto o necesidad específica. Frecuentemente son liberadas nuevas versiones, que siempre se encuentran en http://www.kernel.org y se adquieren por supuesto de forma gratuita.

AUTOR
Jaime Montoya
jaimemontoya@jaimemontoya.com
www.jaimemontoya.com
Santa Ana, 29 de septiembre de 2007
El Salvador

Articulos relacionados:
Linux: Instalación y Primeros Pasos
Resumen:
Prefacio. Audiencia. Organización del Libro. Reconocimientos. Distribuciones de Linux. Conseguir Linux desde Internet. Conseguir Linux desde otras fuentes online. Consegu...
Administración de procesos - Sistemas operativos
Resumen:
Procesos. Implantación de los procesos. Comunicación entre procesos. Instrucción TSL. Planificación de procesos. Colas múltiples. Procesos ligeros. Señales. El siguiente ...
Ciclo de Vida del Sistema Operativo LINUX
Resumen:
LINUX es un sistema operativo, compatible Unix. Dos características muy peculiares lo diferencian del resto de los sistemas que podemos encontrar en el mercado, la prime...
Asignación de permisos en linux
Resumen:
Cualquier persona acostumbrada a utilizar el sistema operativo Windows que comienza a trabajar en un ambiente Linux, seguramente se ha enfrentado o se enfrentará a proble...
Análisis y diseño e implementación de un sistema académico para el centro educativo de desarrollo infantil bilingüe Angelitos de Luz, utilizando el lenguaje de programación visual FOX PRO 8.0 (pdf)
Resumen:
El objetivo del trabajo es el de implementar un sistema de informatico en el centro educativo de desarrollo infantil bilingüe Angelitos de Luz y contribuir al surgimient...
Copyright © 2011 ilustrados.com, Monografias, tesis, bibliografias, educacion. Tofos los temas y publicaciones son propiedad de sus respectivos autores ©