Compilación del Kernel Linux Debian
En este post vamos a compilar un Kernel de Linux. Es probable que necesitemos modificar la versión de nuestro kernel para lograr compatibilidad de nuevos dispositivos de hardware o quizas aplicar un parche a nuestro núcleo. En mi caso simplemente quiero tener la última versión del kernel a modo POC.
Descargar el Kernel de Linux
Desde el siguiente enlace podremos descargar la versión del Kernel que deseamos asi como también la última versión del Kernel.
Paquetes requeridos
Axel : Acelerador de descargas que soporta multiconexiones. Cuando iniciamos una descarga se abren varios sockets y el archivo se divide entre estas conexiones donde cada una descargará su parte.
Build-essential: Build-essential instala una serie de paquetes y dependencias requeridas para compilar source.
Ncurses: Consiste en una serie de paquetes, y compiladores necesarios para utilizar make. Por default make no viene instalado en las distribuciones por cuestiones de seguridad, ya que facilitariamos la tarea de compilar un exploit en caso de ser atacados.
Kernel-package: Este paquete es necesario para generar dos paquetes:
1- Un paquete con extensión .deb con los headers del Kernel
2- Un paquete con extensión .deb con la imagen del Kernel
Utilizare la distribución Debian Squeeze corriendo la versión 2.6 del kernel en una arquitectura de 32 bits.
Descarga del Kernel
Descargar el paquete con la versión del kernel deseada desde www.kernel.org
#cd /usr/src
En mi caso voy a compilar la versión 3.7.1 del Núcleo.
#axel -a -n 8 http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.7.1.tar.bz2
Descomprimimos el archivo:
#tar xvf linux-3.7.1.tar.bz2
#cd /linux-3.7.1
Ahora necesitamos ver las opciones que podemos darle a make
#make help
Nos vamos a encontrar con dos configuraciones escenciales:
i386_defconfig -Build for i386 (Configuración para 32 bits)
x86_64_defconfig -Build for x86_64 (Configuración para 64 bits)
En mi caso, por que la realidad es que llevaría unas cuantas horas seleccionar los módulos que necesitamos para nuestro kernel, voy a realizar una copia del archivo de configuración de mi kernel 2.6 que actualmente tengo instalado.
#cp /boot/config-2.6.32-5-686 /usr/src/linux-3.7.1/.config
Si quisieramos crear una configuración desde el principio deberiamos crear un archivo de configuración con el siguiente comando y luego mediante menuconfig seleccionar los módulos que nuestro kernel debiese cargar.
#make i386_defconfig
Una vez generado/copiado el archivo de configuración podremos manipular los módulos o drivers particulares a travez de la configuración del kernel utilizando menuconfig (hay que tener ncurses)
Para utilizar el menú de configuración necesitamos tener ncurses instalados, ncurses nos posibilita utilizar el modo gráfico.
Si no tenemos ncurses -> apt-get install ncurses*
Si queremos seleccionar algún driver o módulo en partilar tanto dentro del kernel o bien como módulo ejecutamos lo siguiente:
#make menuconfig
Si realizamos cambios debemos salvarlos para alterar el archivo de configuración.
Luego ejecutamos el comando make para que genere la imagen del kernel, esto va a llevar algunos minutos.
#make -j3
Una vez finalizado el make de la imagen, nos avisara por la standard output que la imagen ha sido generada. Claro, paciencia, puede llevar 2 hs aproximadamente.
Luego de generada la imagen, vamos a compilar los módulos con el siguiente comando:
#make modules
Una vez compilados los módulos necesitaremos instalar los módulos dentro del directorio /lib/modules/3.7.1
#make modules_install
Ya tenemos nuestros módulos instalados y nuestra imágen de kernel compilado. Ahora debemos mover nuestra imagen al directorio /boot.
#cp /usr/src/linux-3.7.1/arch/x86/boot/bzImage /boot/vmlinuz-3.0.4
#cp /usr/src/linux-3.7.1/.config /boot/config-3.7.1
#cp /usr/src/linux-3.7.1/System.map /boot/System.map-3.7.1
Copiamos la documentación de esta versión del Kernel
#install -d /usr/share/doc/linux-3.7.1
#cp -r /usr/src/linux-3.7.1/Documentation/* /usr/share/doc/linux-3.7.1
Una vez instalada la documentación del nuevo Kernel vamos a actualizar el gestor de arranque en mi caso Grub para incorporar la nueva versión del kernel.
#update-grub2
Esto automaticamente recorre el directorio /boot y agrega los kernel al grub.cfg
Si esto llegase a fallar con un error tal como: no such disk, necesitamos eliminar el archivo device.map y re-ejecutar el update-grub2.
Ahora necesitamos crear initrd. Initrd es utilizado para crear un filesystem temporal que utilizara el kernel mucho antes de que el directorio raíz sea creado.
#mkinitramfs -o initramfs-3.7.1 -k 3.7.1
Construir el paquete .deb kernel
Ahora debemos empaquetar nuestro kernel, sin necesidad de copiar nada en Debian. Para esto requerimos del paquete kernel-package que instalamos al principio. Vamos a generar dos paquetes, uno contendra el kernel y el otro los kernel-headers.
#make-kpkg clean
#make-kpkg --initrd kernel_image kernel_headers
Si el empaquetado falla arrojando un problema intentando encontrar Documentation/lguest la manera de solucionarlo es:
#mkdir Documentation/lguest
#echo all: >> Documentation/lguest/Makefile
Luego ejecutamos nuevamente los comandos make-kpkg.
Instalación de los paquetes con el nuevo Kernel
Una vez finalizado el empaquetado, nos vamos al directorio /usr/src/ y vamos a encontrar los paquetes del header y de la imagén del kernel listos para ser instalado.
Primero instalamos el paquete de headers y luego el de la imagén del Kernel.
Cuando instalemos la imagén nos preguntara si el Kernel ya fue instalado anteriormente a lo cual le contestaremos que no y finalizara la instalación.
Reiniciamos nuestro Debian:
#init 6
Esta vez el gestor de arranque grub nos dejara seleccionar entre los dos Kernels que tenemos instalado, claro si no necesitamos el anterior podriamos eliminarlo y quedarnos con la versión más reciente del Kernel.
Esto fue todo. Aprendimos como descargar el fuente de un Kernel, configurar nuestros módulos e instalar una versión específica del kernel. Además nos topamos con problemas típicos durante la instalación y compilación del kernel. Proximamente estarémos jugando un poco con Hurd, como sabemos, este es el microkernel que GNU esta desarrollando y aún se encuentra en su etapa Alfa. Pero esto ya es otra historia.
Saludos.
Hugo Marcelo Del Negro.
Descargar el Kernel de Linux
Desde el siguiente enlace podremos descargar la versión del Kernel que deseamos asi como también la última versión del Kernel.
Paquetes requeridos
Axel : Acelerador de descargas que soporta multiconexiones. Cuando iniciamos una descarga se abren varios sockets y el archivo se divide entre estas conexiones donde cada una descargará su parte.
Build-essential: Build-essential instala una serie de paquetes y dependencias requeridas para compilar source.
Ncurses: Consiste en una serie de paquetes, y compiladores necesarios para utilizar make. Por default make no viene instalado en las distribuciones por cuestiones de seguridad, ya que facilitariamos la tarea de compilar un exploit en caso de ser atacados.
Kernel-package: Este paquete es necesario para generar dos paquetes:
1- Un paquete con extensión .deb con los headers del Kernel
2- Un paquete con extensión .deb con la imagen del Kernel
Utilizare la distribución Debian Squeeze corriendo la versión 2.6 del kernel en una arquitectura de 32 bits.
Descarga del Kernel
Descargar el paquete con la versión del kernel deseada desde www.kernel.org
#cd /usr/src
En mi caso voy a compilar la versión 3.7.1 del Núcleo.
#axel -a -n 8 http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.7.1.tar.bz2
Descomprimimos el archivo:
#tar xvf linux-3.7.1.tar.bz2
#cd /linux-3.7.1
Ahora necesitamos ver las opciones que podemos darle a make
#make help
Nos vamos a encontrar con dos configuraciones escenciales:
i386_defconfig -Build for i386 (Configuración para 32 bits)
x86_64_defconfig -Build for x86_64 (Configuración para 64 bits)
En mi caso, por que la realidad es que llevaría unas cuantas horas seleccionar los módulos que necesitamos para nuestro kernel, voy a realizar una copia del archivo de configuración de mi kernel 2.6 que actualmente tengo instalado.
#cp /boot/config-2.6.32-5-686 /usr/src/linux-3.7.1/.config
Si quisieramos crear una configuración desde el principio deberiamos crear un archivo de configuración con el siguiente comando y luego mediante menuconfig seleccionar los módulos que nuestro kernel debiese cargar.
#make i386_defconfig
Una vez generado/copiado el archivo de configuración podremos manipular los módulos o drivers particulares a travez de la configuración del kernel utilizando menuconfig (hay que tener ncurses)
Para utilizar el menú de configuración necesitamos tener ncurses instalados, ncurses nos posibilita utilizar el modo gráfico.
Si no tenemos ncurses -> apt-get install ncurses*
Si queremos seleccionar algún driver o módulo en partilar tanto dentro del kernel o bien como módulo ejecutamos lo siguiente:
#make menuconfig
Si realizamos cambios debemos salvarlos para alterar el archivo de configuración.
Luego ejecutamos el comando make para que genere la imagen del kernel, esto va a llevar algunos minutos.
#make -j3
Una vez finalizado el make de la imagen, nos avisara por la standard output que la imagen ha sido generada. Claro, paciencia, puede llevar 2 hs aproximadamente.
Luego de generada la imagen, vamos a compilar los módulos con el siguiente comando:
#make modules
Una vez compilados los módulos necesitaremos instalar los módulos dentro del directorio /lib/modules/3.7.1
#make modules_install
Ya tenemos nuestros módulos instalados y nuestra imágen de kernel compilado. Ahora debemos mover nuestra imagen al directorio /boot.
#cp /usr/src/linux-3.7.1/arch/x86/boot/bzImage /boot/vmlinuz-3.0.4
#cp /usr/src/linux-3.7.1/.config /boot/config-3.7.1
#cp /usr/src/linux-3.7.1/System.map /boot/System.map-3.7.1
Copiamos la documentación de esta versión del Kernel
#install -d /usr/share/doc/linux-3.7.1
#cp -r /usr/src/linux-3.7.1/Documentation/* /usr/share/doc/linux-3.7.1
Una vez instalada la documentación del nuevo Kernel vamos a actualizar el gestor de arranque en mi caso Grub para incorporar la nueva versión del kernel.
#update-grub2
Esto automaticamente recorre el directorio /boot y agrega los kernel al grub.cfg
Si esto llegase a fallar con un error tal como: no such disk, necesitamos eliminar el archivo device.map y re-ejecutar el update-grub2.
Ahora necesitamos crear initrd. Initrd es utilizado para crear un filesystem temporal que utilizara el kernel mucho antes de que el directorio raíz sea creado.
#mkinitramfs -o initramfs-3.7.1 -k 3.7.1
Construir el paquete .deb kernel
Ahora debemos empaquetar nuestro kernel, sin necesidad de copiar nada en Debian. Para esto requerimos del paquete kernel-package que instalamos al principio. Vamos a generar dos paquetes, uno contendra el kernel y el otro los kernel-headers.
#make-kpkg clean
#make-kpkg --initrd kernel_image kernel_headers
Si el empaquetado falla arrojando un problema intentando encontrar Documentation/lguest la manera de solucionarlo es:
#mkdir Documentation/lguest
#echo all: >> Documentation/lguest/Makefile
Luego ejecutamos nuevamente los comandos make-kpkg.
Instalación de los paquetes con el nuevo Kernel
Una vez finalizado el empaquetado, nos vamos al directorio /usr/src/ y vamos a encontrar los paquetes del header y de la imagén del kernel listos para ser instalado.
Primero instalamos el paquete de headers y luego el de la imagén del Kernel.
Cuando instalemos la imagén nos preguntara si el Kernel ya fue instalado anteriormente a lo cual le contestaremos que no y finalizara la instalación.
Reiniciamos nuestro Debian:
#init 6
Esta vez el gestor de arranque grub nos dejara seleccionar entre los dos Kernels que tenemos instalado, claro si no necesitamos el anterior podriamos eliminarlo y quedarnos con la versión más reciente del Kernel.
Esto fue todo. Aprendimos como descargar el fuente de un Kernel, configurar nuestros módulos e instalar una versión específica del kernel. Además nos topamos con problemas típicos durante la instalación y compilación del kernel. Proximamente estarémos jugando un poco con Hurd, como sabemos, este es el microkernel que GNU esta desarrollando y aún se encuentra en su etapa Alfa. Pero esto ya es otra historia.
Saludos.
Hugo Marcelo Del Negro.














Comentarios
Publicar un comentario