Compilación
del
kernel de linux 3.7.1 13I, enero 2013 |
Antecedentes Cuando hablamos de Linux es frecuente
que nos referamos a una distribución: Debian,
Ubuntu, Red Hat, Fedora, SuSe, etc., es decir, al
sistema operativo y sus aplicaciones y no al kernel del
sistema. La realidad es que Linux es solamente
el kernel o núcleo del sistema, el cual es un
programa de gran tamaño y complejidad que opera
nuestra computadora. Entre las funciones más
importantes del kernel:
Aunque no son las únicas, si son las de
más relevancia. El kernel de Linux se
caracteriza por estar en constante desarrollo para
corregir algún problema o agregar una nueva
característica, generando gran cantidad de
actualizaciones en poco tiempo. Dichas actualizaciones
comúnmente contienen nuevos módulos,
mejoras de seguridad, administración de
recursos y muchas otras características. ¿Cómo averiguar
que innovaciones incorpora determinado kernel?
Observando un archivo incorporado en el mismo llamado
ChangLog. Asimismo es factible descargar y
observar el archivo de texto plano Changelog desde la
página oficial del
proyecto. Muchas veces surgen dudas acerca de la necesidad de compilar el kernel cuando liberan una nueva versión: no debemos dudar, solamente se compila una nueva versión de kernel cuando tenemos dispositivos de hardware muy recientes y nos vemos forzados a migrar hacia una versión que incluya módulos para el soporte de este. Otra razón se basa en que poseemos una versión muy antigua y optamos por actualizarlo para tener mejoras en la administración de memoria, procesos, recursos, etc. Actualmente ocurre esto con la rama 2.4 y 2.6 del kernel Linux; algunos servidores poseen la 2.4 y compilan la versión de la rama (2.6.x) con el objetivo de mejorar la administración de recursos, ya que esta última es más eficaz. El kernel NO se actualiza, si deseas una nueva versión debes descargar las fuentes de la página oficial del proyecto y compilarla. También puedes buscar un paquete (por ejemplo en los repositorios de Debian) con una versión ya compilada para la arquitectura del CPU; evitando la tarea de compilar y desaprovechando la optimización del sistema. |
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.7.1.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.7.1.tar.bz2 /usr/src #cd /usr/src #tar -jxvf linux-3.7.1.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.7.1 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 encuentran 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 ext4 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 = -som13I 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.7.1-som13I,
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.7.1-som13I 3.7.1-som13I |
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 almacenándola 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.7.1-som13I Found initrd image /boot/initrd.img-3.7.1-som13I 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-2.6.32-5-686 /boot/initrd.img-2.6.32-5-686 #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.7.1-som13I Debian GNU/Linux, with Linux 3.7.1-som13I (recovery mode) Debian GNU/Linux, with Linux 3.7.1-som12Ihack Debian GNU/Linux, with Linux 3.7.1-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.7.1-som13I #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 ... ... |