Compilación
del
kernel de linux 3.2.2 12I, enero 2012 |
Antecedentes ¿Por qué o para qué es
necesario compilar el kernel de linux?...
|
Objetivo Construir un kernel que
tenga soporte del sistema de archivos ext4 en un
sistema GNU/Linux Debian.
|
Sistema de archivos ext4 El kernel de linux puede soportar varios sistemas de archivos: FAT12, FAT16, FAT32, ext2, ext3, ext4 etc. El sopote de los distintos sistemas de archivos se pueden construir directamente en el kernel o pueden ser enlazados en tiempo de ejecución como módulos. Por defecto el sistema de archivos ext4 es enlazado como módulo: $/sbin/lsmod Module size Used by ... ext4 257862 1 .. Compilaremos el kernel de linux para que el sistema de archivos ext4 sea soportado directamente el kernel. |
Fuentes Las fuentes de todas las
versiones del kernel del linux que se han
desarrollados se pueden obtener en el sitio oficial del
kernel. Podemos utilizar el comando wget:
$wget -c http://www.kernel.org/pub/linux/kernel/\ v3.x/linux-3.2.2.tar.bz2 Se puede compilar el kernel como usuario, sin embargo, es recomendable descomprimir y desempaquetar las fuentes en la ruta creada para ese propósito: /usr/src $su - Passwd: <password de root> #cp linux-3.2.2.tar.bz2 /usr/src #cd /usr/src #tar -jxvf linux-3.2.2.tar.bz2
Se creará el árbol de directorios del kernel. Debido a que algunas aplicaciones podrían hacer referencia a las fuentes del nuevo kernel, se crea una enlace simbólico: #ln -s linux-3.2.2 linux #cd linux A partir de ahora las rutas que se presentan son relativas a /usr/src/linux. |
Configuración basada en el kernel que está en ejecución Se podría configurar totalmente un kernel desde cero, pero es una tarea muy elaborada. Es común partir de una configuración base y hacer solamente los cambios necesarios. Para ello es conveniente basarnos en la configuración del kernel que está en ejecución. Para averiguar qué versión de kernel está en ejecución: #uname -a Linux drmoriarti 2.6.32-5-686 #1 SMP Thu Nov 3 04:23:54 UTC 2011 i686 Dicha configuración se encuentra en el archivo /boot/config-2.6.32-5-686, el cual deberá de ser copiado en con el nombre .config en la ruta donde se encuantran las fuentes: #cp /boot/config-2.6.32-5-686 .config Si compilaramos las fuentes sin cambiar nada del archivo .config, obtendríamos una copia exacta del kernel que está en ejecución. El archivo .config contiene las directivas para la creación de los archivos construcción del kernel: CONFIG_x86_32=y ... CONFIG_MMU=y Hacer algún cambio en el archivo .config sigue siendo una tarea complicada. Podemos utilizar una herramienta basada en ncurses (libncurses5-dev) para la visualización de todas las opciones de compilación. Es muy probable que la biblioteca no esté instalada: #apt-get install libncurses5-dev una vez instalada lanzamos el menú de configuración: #make menuconfig otra herramienta más cómoda basada en tk 2.4 y libqt en 2.6 es: $make xmenuconfig Con la opción "Load an alternate configuration file" seleccionamos el archivo .config. En la sección de "File Systems" se tiene lo siguiente: <M> The Extended 4 (ext4) filesystem lo que indica que el soporte para el ext3 se construirá como módulo. Con la tecla Y cambiamos a: <*> The Extended 4 (ext4) filesystem Seleccionando la opción "exit" varias veces salimos al menú principal y guadamos la canfiguración. Se ha creado los archivos de reglas y dependencias para la compilación de códigos: Makefiles. Si editamos el Makefile principal podemos agregar una cadena para reconocer nuestra versión del kernel: ... EXTRAVERSION = -som12I NAME = Oscar Alvarado ... |
Compilación del kernel y módulos Actualmente los Makefiles creados realizan varias funciones de forma automática, como resolver dependencias entre códigos y sistemas. Así, solo será necesario ejecutar el siguiente comando para compilar el kernel y los módulos: $make Sip, así de fácil!. El tiempo de compilación dependerá de los recursos del sistema en el que se está compilando: Core 2 Duo 2.0Ghz, 2G en RAM toma aproximadamente 100 min, suficiente para ir a tomar un cafecito illy. |
Instalación Los scripts creados también ayudan a la instalación tanto del kernel como de los módulos dependientes del mismo, bastará con ejecutar los siguientes comandos como super usuario: #make install el comando anterior instalará tres archivos al directorio /boot
Para instalar los módulos en la ruta /lib/modules/3.2.2-som12I,
se ejecuta:
#make modules_install |
RAM File System Los sistemas Linux necesitan de un sistema de archivos para funcionar, incluso es necesario tener acceso a un sistema de archivos desde el arranque del sistema. Una vez arrancado el kernel, el sistema necesita acceder a archivos de configuración y archivos binarios para el arranque del sistema. Si el kernel no accede a un sistema de archivos de arranque, se detiene y muestra el error: "Kernel panic:VFS:Unable to mount root fs..." Uno de los archivos a los que necesita acceder el kernel de manera incial es el /etc/inittab, en el cual se encuentran los parámetros para iniciar el único proceso que crea el kernel, el init. Si el archivo se encuentra en algún dispositivo de almacenamiento, el sistema se hace dependiente del mismo para su arranque. Para evitar dicha dependiencia se puede crear un sistema de archivos pequeño el cual será parte de la imagen de arranque, evitando la dependencia con el dispositivo. Además de los archivos de arranque, se agregan un shell para poder ejecutar los comandos de los scripts de arranque /etc/rc.NIVEL, para realizar un arranque más complejo. Para crear un sistema de archivos en RAM para el inicio del sistema, ejecutamos el siguiente comando: #mkinitramfs -k -o /boot/initramfs-3.2.2-som12I 3.2.2-som12I |
Configuración
del grub2
En el directorio /boot se encuentra todo lo relativo al
arranque de linux. En ese mismo directorio encontramos el
directorio /boot/grub, el cual contiene los
archivos para que el GRUB v2 (GRand Unified
Bootloader) funcione. El archivo /boot/grub/grub.cfg, es en realidad un
script que se ejecuta en el momento de inicio del sistema.
Cuando lo editas con vi o vim, la primera línea te
advierte que no lo edites, es decir, que no cambies nada,
ya que este archivo es generado de manera automática por
herramientas del mismo GRUB. Puedes leerlo y verás que
está todo lo realtivo a la selección y arranque de los
sistemas operativos que tiene tu chompu. Con el GRUB v2 agregar un nuevo kernel al menú de arranque es muy sencillo y se puede hacer de dos formas. En ambas es necesario copiar el nuevo kernel al directorio /boot, lo cual es muy probable que ya se haya realizado con el comando de la sección anterior make install. En la primera forma ejecutamos el comando: #grub-mkconfig > grub.config.NEW el comando anterior explorará los dispositivos, particiones y el sistemas de archivos en busca de sistemas, creando una configuración y almacenandola en el archivo grub.config.NEW, el nuevo archivo deberá suplantar al archivo de configuración: #mv /boot/grub/grub.config /boot/grub/grub.config.OLD #cp /boot/grub/grub.config.NEW /boot/grub/ Para el segundo método que es mucho más sencillo pues realiza lo anterior, basta con ejecutar el comando: #update-grub Found linux image /boot/vmlinuz-3.2.2-som12I Found initrd image /boot/initrd.img-3.2.2-som12I Found linux image /boot/vmlinuz-2.6.32-5-686 Found initrd image /boot/initrd-2.6.32-5-686 |
Configuración del kernel por defecto Cuando hemos compilado
y probado varios kernels, el menú de inicio puede
extenderse de manera no muy adecuada. Si deseamos
eliminar algún kernel del menú de inicio, basta con
eliminarlo del directorio /boot y ejecutar de nuevo el
comando update-grub.
#rm /boot/vmlinuz-3.2.2-som12I /boot/initrd.img-3.2.2-som12I #update-grub Si lo que deseamos es solamente cambiar el kernel que es seleccionado por defecto, editamos el archivo de configuración de grub. #vim /etc/default/grub modificamos la variable GRUB_DEFAULT, la cual originalmente tiene el valor de 0. El 0 indica que la primera entrada en la lista del menú será la que se carge por defecto. Así, será necesario ubicar en la lista del menú, el número de entrada del kernel que deseamos que se carge, por ejemplo, si de la siguiente lista deseamos que el kernel versión 2.6.32-5-686 sea el kernel que arranque por defecto, hacemos: Debian GNU/Linux, with Linux 3.2.3 Debian GNU/Linux, with Linux 3.2.3 (recovery mode) Debian GNU/Linux, with Linux 3.2.2-som12I Debian GNU/Linux, with Linux 3.2.2-som12I (recovery mode) Debian GNU/Linux, with Linux 3.2.2-som12Ihack Debian GNU/Linux, with Linux 3.2.2-som12Ihack (recovery mode) Debian GNU/Linux, with Linux 2.6.32-5-686 Debian GNU/Linux, with Linux 2.6.32-5-686 (recovery mode) Microsoft Windows XP Profesional (on /dev/sda1) Windows Recovery Environment (loader) (on /dev/sda2) cambiamos el valor de la variable de la siguiente forma: GRUB_DEFAULT=6 finalmente ejecuatmos de nuevo el comando: #update-grub |
Verificación #reboot Evidentemente si hubo algún error, el mismo sistema de arranque nos lo hará saber no iniciando la chompu =-) Si inició normalmente el sistema entonces la compilación funcionó adecuadamente. Podemos verificar que el kernel que creamos realmente está en ejecución: #uname -a Linux drmoriarti 3.2.2-som12I #1 SMP Fri Jan 27 07:12:85 i686 GNU/Linux Finalmente comprobamos que el sistema de archivos ext4 ya se encuentra construido en el kernel, por lo cual NO deberá listarse en los módulos enlazados. $/sbin/lsmod Module size Used by ... ... |