InicioLinuxCompilar Nuevo Kernel en Ubuntu

Compilar Nuevo Kernel en Ubuntu

Linux6/2/2011
¿Que es el Kernel? El Kernel es el núcleo del sistema operativo. En el caso de Ubuntu el Kernel se llama Linux, y el sistema operativo lo componen el kernel y otras aplicaciones GNU. ¿Para qué Compilar el kernel? Entre una versión y otra hay mucha diferencia, el Kernel que viene en las distribuciones es un Kernel genérico, esto quiere decir que no tiene ningún tipo de optimización para nuestro hardware especifico, y lo mas probable es que tenga soporte innecesario para una gran cantidad de dispositivos, que no poseemos o no utilizamos. ¿Qué necesito? 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. Ahora hay que conseguir la última version y sin modificaciones del codigo fuente del Kernel. 1. Instalar paquetes necesarios. Para compilar un kernel a medida vamos a necesitar los paquetes build-essential, kernel-package y otros, por lo tanto: tuxisla@legolas:$ sudo aptitude install build-essential kernel-package libncurses5 libc6-dev dialog module-assistant 2. Instalar paquetes necesarios. El código fuente del kernel lo podemos obtener de muchos sitios. El oficial, es http://www.kernel.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 ejemplo 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 oficial, 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 vienen 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 install linux-source Con esto se descargará el archivo linux-source-2.6.version.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:/usr/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 ln -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 hace falta tener el entorno gráfico corriendo, y con make xconfig sí. Para utilizar make menuconfig necesitaremos el paquete libncurses5-dev (con todas sus dependencias) y para utilizar make xconfig necesitaremos el paquete libqt3-mt-dev y todas sus dependencias. Así que, según lo que queramos utilizar, tendremos que hacer: tuxisla@legolas:/usr/src$ sudo aptitude install libncurses5-dev o tuxisla@legolas:/usr/src$ sudo aptitude install libqt3-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-generic, 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: tuxisla@legolas:/usr/src$ cd linux/ tuxisla@legolas:/usr/src/linux$ sudo cp /boot/config-2.6.32-25-generic .config Pues ahora ya podemos hacer, situados en el directorio /usr/src/linux, un sudo make oldconfig menuconfig o un sudo make oldconfig xconfig y modificar las opciones que queramos del kernel, es decir, configurarlo a nuestro gusto: tipo de CPU, soporte de memoria, controladores WiFi; 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, lspci o lshw, este último nos brinda la posibilidad de obtener un archivo html con las especificaciones técnicas de nuestro hardware, ejemplo: sudo lshw -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 bzImage 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 kernel_image 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, controladores de discos y sistema de archivos de nuestro directorio raíz. Pero, y esto es sólo una experiencia personal, siempre que he intentado compilar un kernel sin esa opción, me he encontrado con un sistema que no arrancaba, así que yo la uso siempre. ¿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 kernel de 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 --revision=$(version) kernel_image 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 (linux-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 bzImage modules modules_install Para implementar opciones de seguridad adicionales al kernel, debemos descargar el parche correspondiente del sitio Web del proyecto grsecurity. Este proyecto, provee enfoque innovador para la seguridad global del sistema mediante la utilización de modelos de detección, prevención y contención multicapas. En nuestro caso utilizaremos el parche grsecurity-2.2.1-2.6.36.2- 201012121726.patch, correspondiente a la gama estable del kernel linux-2.6.36.2. Una vez descargado, parcheamos el código fuente en el directorio /usr/src, para ello: uxisla@legolas:/usr/src$ sudo patch -p0 < ./ 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 condiciones de ejecutar nuevamente: tuxisla@legolas:/usr/src/linux$ sudo make clean bzImage modules modules_install 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 kernel-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 imagen initrd generada y actualiza el gestor de arranque grub. Luego, y por seguridad, borramos el enlace que habíamos creado: tuxisla@legolas:/usr/src$ sudo rm -R linux 5. 5.1. Instalar desde el código fuente ( linux-2.6.36.2.tar.bz2). Para instalar el kernel basta con ejecutar sudo make install, pero si prefieren hacer todo manualmente 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 caso hemos utilizado x86: tuxisla@legolas:/usr/src/linux$ sudo cp arch/x86/boot/bzImage /boot/vmlinuz-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/modules/2.6.36.2-grsec/ Actualizamos los enlaces simbólicos de la versión del kernel: tuxisla@legolas:/boot$ ln -sf /boot/vmlinuz-2.6.36.2-grsec /vmlinuz && ln -sf /boot/initrd.img2.6.36.2-grsec /initrd.img Solo falta editar el fichero /boot/grub/grub.cfg (/boot/grub/menu.lst, en versiones anteriores a Lucid), 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-b21b-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 permiten al grub realizar automáticamente los cambios pertinentes en el menú de arranque del sistema: tuxisla@legolas:/usr/src/linux$ sudo update-initramfs -c -k 2.6.36.2-grsec && sudo update-grub reiniciamos el ordenador con el nuevo kernel y verificamos la versión en ejecución. tuxisla@legolas:~$ uname -a Linux legolas.linuxij.cu 2.6.32-25.151210 #1 SMP Wed Dec 15 10:29:45 UTC 2010 i686 GNU/Linux o(en el caso del kernel del sitio oficial) Linux legolas.linuxij.cu 2.6.36.2-grsec #1 SMP Wed Dec 15 10:29:45 UTC 2010 i686 GNU/Linux inf extraida de ----------------- gnulinux-es-.blogspot.com
Datos archivados del Taringa! original
0puntos
2,066visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

B
Blaner🇦🇷
Usuario
Puntos0
Posts1
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.