Anuncios

ANUNCIOS PATROCINADOS

compilando nuevo kernel en ubuntu

Leave a Comment

Antes de adentrarnos en los aspectos técnicos de la compilación del kernel Linux, conocer un poco de historia es necesario.Debemos comenzar por respondernos la pregunta ¿qué es el kernel? El kernel en sí es elcorazón o núcleo del Sistema Operativo. En nuestro caso, el kernel se llama Linux, y el SOlo componen el kernel junto con una serie de programas y aplicaciones del sistema GNU,es por ello que debemos llamar GNU/Linux alSO presente en las distribuciones que tan cotidianamente utilizamos.Una pregunta que a veces los usuarios principiantes se hacen, es justamente esta: ¿paraqué compilar el kernel?, si ya tienen su máqui-
na funcionando. La respuesta es simple, y esque entre una versión y otra de los distintos kernel se agregan características nuevas almismo, además de una serie de mejoras. Porotro 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 ¡386, y lo más proba-
ble es que contenga soporte innecesario para una gran cantidad de dispositivos, que no poseemos o no utilizamos.Por último, compilar el kernel es un paso altamente educativo y didáctico para comprender
en mayor profundidad el funcionamiento delSO GNU/Linux, y siempre es bueno saberlopor si alguien pregunta.Luego, ¿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 que se distribuye en el paquete binutils. Otros ensambladores disponibles para GNU/Linux son gasm o nasm. Una vez que confirmemos la existencia de todas estas herramientas en nuestro sistema, es necesario contar, obviamente, con el código fuente del kernel.

En la mayoría de las distribuciones se incluye el código fuente en los discos 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 incluyen código adicional en su kernel, que no forma parte del original.Si tenemos la seguridad que contamos con los fuentes 100% originales sin modificaciones, es posible actualizar a la última versión atravé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 método sobre todo si contamos con una conexión a Internet relativamente lenta, debido a que los parches son de muy pequeño tamaño.
Ahora que ya conocemos el por qué debemos compilar nuestro sistema con la última versión
posible del código tuente del kernel Linux, estamos en condiciones de, con mucha paciencia,
poner manos a la obra.
Este documento se basa en la traducción del artículo Kernel Howto, publicado en inglés en la
Wiki de Ubuntu; resumiendo algunos puntos, enriqueciendo y aclarando otros. Y por supuesto,
comprobando que funciona. La compilación del kernel se hace a la manera Debian, es decir,
con herramientas propias de esta distribución. Vale destacar que los pasos descritos en los pun-
tos 4.1. y 5.1., son aplicables a otras distribuciones como CentOS y RHEL.
Así que allá vamos, paso a paso:

1. Instalar paquetes necesarios.
Para compilar un kernel a medida vamos a necesitar los paquetes build-essential, kernel-packa-
ge y otros, por lo tanto:
tuxisla@legolas:$ sudo aptitude install build-essential kernel-package Iibncurses5 Iibc6-dev dia-
log module-assistant

2. Obtener código fuente del kernel.
El código tuente del kernel lo podemos obtener de muchos sitios. El oficial, es http://www.ker-
nel.org/. Pero también está en los repositorios de Ubuntu y a los efectos de este manual, se ha
utilizado el que aparece en el repositorio porque tiene algunas obvias ventajas, como por ejem-
plo el comando make-kpkg, que humaniza la construcción de paquetes .deb para núcleos a
partir de los fuentes. Sin embargo, si desea compilar el kernel utilizando los fuentes del sitio ofi-
cial, también aquí se detallan los pasos a seguir.
En los repositorios de Ubuntu encontraremos paquetes llamados kernel-source y linux-source.
Ambos son el código fuente del kernel. ¿Cuál es la diferencia?, pues que los kernel-source vie-
nen de Debian, y los linux-source vienen de Ubuntu. Por lo tanto para obtener el código fuente
del kernel que tenemos instalado y corriendo en nuestro sistema, sólo ejecutamos:

tuxisla@legolas:$ sudo aptitude ¡nstall linux-source
Con esto se descargará el archivo linux-source-2.6.versÍon.tar.bz2 en el directorio /usr/src. A
partir de ahora asumiremos que hemos descargado el linux-source-2.6.32-25, que es el último
disponible para Ubuntu Lucid Lynx. Nos movemos a ese directorio:
tuxisla@legolas:$ cd /usr/src
Si existe un enlace llamado linux a un kernel antiguo, lo borramos:
tuxisla@legolas:Aisr/src$ sudo rm -R linux

Ahora vamos a descomprimir el archivo del código fuente:
tuxisla@legolas:/usr/src$ sudo tar jxvf linux-source-2.6.32-25.tar.bz2
Esto creará un directorio llamado linux-source-2.6.32-25. Creamos un enlace simbólico llamado
linux a ese directorio:
tuxisla@legolas:/usr/src$ sudo In -s linux-source-2.6.32-25 linux
3. Configurar el kernel.
Hay varias formas de configurar el kernel. Probablemente la mayoría de la gente utiliza una de
estas dos: make menuconfig o make xconfig. La diferencia es que con make menuconfig no ha-
ce falta tener el entorno gráfico corriendo, y con make xconfig sí. Para utilizar make menuconfig
necesitaremos el paquete Iibncurses5-dev (con todas sus dependencias) y para utilizar make
xconfig necesitaremos el paquete Iibqt3-mt-dev y todas sus dependencias. Así que, según lo
que queramos utilizar, tendremos que hacer:
tuxisla@legolas:/usr/src$ sudo aptitude install Iibncurses5-dev
o bien:
tuxisla@legolas:/usr/src$ sudo aptitude install Iibqt3-mt-dev
Una duda que siempre surge para configurar el kernel, es que si se puede partir de una configuración conocida. La respuesta es sí. Si tenemos, por ejemplo, instalado el kernel que trae Ubuntu por defecto (2.6.32-25-generic en Lucid), en el directorio /boot nos encontraremos con un
archivo llamado config-2.6.32-25-generÍc, y ¿qué es ese archivo?, pues no es más que un archivo de texto con la configuración actual del kernel, por lo tanto, para partir de esa base y comenzar la configuración del nuevo kernel desde la actual, lo que tenemos que hacer es copiar dicho
archivo al directorio /usr/src/linux-source-2.6.32-25, pero llamándolo .config; lógicamente tendremos que cambiar los números de versión del kernel por los que se ajusten a cada caso particular, para ello:

Iuxisla@legolas:/usr/src$ cd linux/
tuxisla@legolas:/usr/src/linux$ sudo cp /boot/confÍg-2.6.32-25-generic .config
Pues ahora ya podemos hacer, situados en el directorio /usr/src/linux, un sudo make oldcontig
menuconfig o un sudo make oldcontig xconfig y modificar las opciones que queramos del kernel, es decir, configurarlo a nuestro gusto: tipo de CPU, soporte de memoria, controladores Wi-Fi; conociendo el hardware existente en nuestro ordenador, pero con mucho cuidado, eso sí,porque este es el paso crítico. Aquí es donde lo podemos arruinar todo si, por ejemplo, no incluimos algún módulo necesario para nuestro sistema. Para conocer sobre nuestro hardware podemos leer el manual del motherboard, o bien utilizar los comandos hardinfo, sysinfo, Ispci o Ishw,este último nos brinda la posibilidad de obtener un archivo html con las especificaciones técnicas de nuestro hardware, ejemplo: sudo Ishw -html > Escritorio/my_hardware.html

4. Construir el paquete del kernel.
Para construir el paquete con el que instalaremos el nuevo kernel vamos a usar el comando make-kpkg. Mediante el cual básicamente sustituimos los clásicos make dep, make clean, make
bzlmage y make modules (utilizados cuando compilábamos para Red Hat y sus derivados). Admite numerosas opciones y modificadores; ya saben: man make-kpkg, pero para lo que nos ocupa ahora, sólo necesitaremos hacer lo siguiente: make-kpkg clean y make-kpkg
•-append-to-version=.#### -initrd kerneljmage kernel_headers.
Como se puede apreciar, tenemos que modificar ".####", que representa una secuencia alfanumérica a decisión propia, y que se añadirá al número de versión del kernel para diferenciar el
kernel que estamos compilando de cualquier otro que ya esté instalado en el sistema. Por lo tanto .#### lo deberemos sustituir por lo que queramos, intentando no utilizar el guión de subrayado bajo (_) ni expresiones como "-386", "-686", "-K7", "-sparc", etc., porque expresiones
similares son las usadas por los kernel precompilados de Debian y podrían inducir a error. Personalmente yo uso la fecha en la que compilo el kernel, de forma que si lo compilase hoy, 15 de
diciembre de 2010, quedaría así: version=.151210.
Ahora, hay que hablar un poco sobre la opción -initrd. Esta opción lo que hace es crear una imagen initrd en el directorio /boot. Realmente no es imprescindible utilizarla siempre que a la hora de configurar el kernel hayamos incluido de forma estática y no como módulos, los controladores para al menos nuestro bus, consoladores de discos y sistema de archivos de nuestrodirectorio raíz. Pero, y esto es sólo una experiencia personal, siempre que he intentado compilarun kernel sin esa opción, me he encontrado con un sistema que no arrancaba, así que yo la usosiempre. ¿Qué problema tiene?, pues que para que funcione correctamente la opción -initrd,hay que aplicar al código fuente del kernel el parche cramfs. Tranquilos, porque todos los kernelde Debian y por supuesto también los de Ubuntu, tienen ese parche ya aplicado. Pero es algo a
tener en cuenta si decidieron obtener el código fuente del kernel del sitio oficial.
Bien, como he dicho antes, los comandos que tenemos que ejecutar son:

tuxisla@legolas:/usr/src/linux$ sudo make-kpkg clean
tuxisla@legolas:/usr/src/linux$ sudo make-kpkg -initrd -append-to-version=.151210 -revi-
sion=$(version) kerneljmage kernel_headers

Tras ejecutar el segundo, nos saldrá un mensaje de aviso diciéndonos que la opción -initrd puede no funcionar como nosotros esperamos, y preguntándonos si queremos abortar el proceso.
Como ya sabemos que a nosotros nos va a funcionar correctamente, contestamos que no.

4. 4.1. Recompilar desde código fuente del sitio oficial (Iinux-2.6.36.2.tar.bz2).

Con las opciones necesarias para nuestro sistema ya guardadas en el fichero .config y de regreso en la consola, hacemos una limpieza de la configuración actual usando sudo make mrproper,
y posteriormente ejecutamos:
tuxisla@legolas:/usr/src/linux$ sudo make clean bzlmage modules modulesjnstall

Para ¡mplementar opciones de seguridad adicionales al kernel, debemos descargar el parche
correspondiente del sitio Web del proyecto grsecurity. Este proyecto, provee entoque innovador
para la seguridad global del sistema mediante la utilización de modelos de detección, preven-
ción y contención multicapas. En nuestro caso utilizaremos el parche grsecuhty-2.2.1-2.6.36.2-
201012121726.patch, correspondiente a la gama estable del kernel linux-2.6.36.2. Una vez des-
cargado, parcheamos el código tuente en el directorio /usr/src, para ello:
tuxisla@legolas:/usr/src$ sudo patch -pO < ./grsecurity-2.2.1-2.6.36.2-201012121726.patch
Volvemos a editar la configuración del kernel ejecutando sudo make mrproper xconfig o sudo
make mrproper menuconfig; salvamos los cambios en el fichero .config y estaríamos en condi-
ciones de ejecutar nuevamente:
tuxisla@legolas:/usr/src/linux$ sudo make clean bzlmage modules modulesjnstall
Y ahora a esperar, porque el proceso de compilación puede durar mucho, dependiendo del
CPU y memoria RAM disponibles.

5. Instalar el nuevo kernel.
Si todo lo anterior ha ido bien, en el directorio /usr/src se deben haber creado los archivos ker-
nel-image-2.6.32-25.151210_2.6.32-25.151210_i386.deb y kernel-headers-2.6.32-
25.151210_2.6.32-25.151210_i386.deb. Los cuales contienen los módulos, las cabeceras y el
kernel compilado listo para instalar, lo que haremos con:
tuxisla@legolas^usr/src$ sudo dpkg -i kernel-*.151210_i386.deb
Estos comandos son equivalentes al clásico make install, que a su vez coloca en su sitio la ima-
gen initrd generada y actualiza el gestor de arranque grub. Luego, y por seguridad, borramos el
enlace que habíamos creado:
tuxisla@legolas:Aisr/src$ sudo rm -R linux

5. 5.1. Instalar desde el código fuente (Iinux-2.6.36.2.tar.bz2).

Para instalar el kernel basta con ejecutar sudo make install, pero si prefieren hacer todo manual-
mente y entender un poco mejor cómo funciona el proceso, entonces sigan las instrucciones
que se dan a continuación; en caso contrario y asumiendo que el comando anterior funcionó,
pueden ir directamente al final del documento.
Primero debemos copiar la imagen generada y los archivos .config y System.map al directorio
/boot del sistema. La ubicación original de la imagen depende de la arquitectura. En nuestro ca-
so hemos utilizado x86:
tuxisla@legolas:Aisr/src/linux$ sudo cp arch/x86/boot/bzlmage /boot/vmünuz-2.6.36.2-grsec &&
sudo cp System.map /boot/System.map-2.6.36.2-grsec && sudo cp .config /boot/config-2.6.36.2-
grsec

Creamos la imagen de inicio del kernel:

tuxisla@legolas:/usr/src/linux$ sudo mkinitramfs -o /boot/initrd.img-2.6.36.2-grsec/lib/modu-
les/2.6.36.2-grsec/
Actualizamos los enlaces simbólicos de la versión del kernel:
tuxisla@legolas:/boot$ In -st /boot/vml¡nuz-2.6.36.2-grsec /vmlinuz && In -sf /boot/initrd.img-
2.6.36.2-grsec /initrd.img
Solo falta editar el fichero /boot/grub/grub.cfg (/boot/grub/menu.lst, en versiones anteriores a Lu-
cid), para que nuestro nuevo kernel esté disponible en la lista de inicialización del grub:
tuxisla@legolas:/boot$ sudo vi grub/grub.cfg
title   Ubuntu 10.04, kernel 2.6.36.2-grsec
uuid   bb504ec2-2672-494f-b21 b-d3cb4710737e
kernel /vmlinuz-2.6.36.2-grsec root=UUID=a8931008-33c6-4310-a452-45f4f1cda209 ro splash
initrd /initrd.img-2.6.36.2-grsec
quiet
O simplemente ejecutamos los comandos sudo update-initramfs y sudo update-grub que permi-
ten al grub realizar automáticamente los cambios pertinentes en el menú de arranque del siste-
ma:
tuxisla@legolas:/usr/src/linux$ sudo update-initramfs -c -k 2.6.36.2-grsec && sudo update-grub
Y ¡voilá! Finalmente reiniciamos el ordenador con el nuevo kernel y verificamos la versión en eje-
cución.
tuxisla@legolas:-$ úname -a
Linux legolas.linuxij.cu 2.6.32-25.151210 #1 SMP Wed Dec 15 10:29:45 UTC 2010 ¡686 GNU/Li-
nux
o (en el caso del kernel del sitio oficial)

0 comentarios :

Publicar un comentario

Por favor deje su comentario de acuerdo al tema tratado,no se permite polemica,spam,insultos o armar debates fuera de tono.

Related Posts Plugin for WordPress, Blogger...
Mi perfil de Google +