domingo, 12 de marzo de 2017

Cómo compilo e instalo un kernel en Ubuntu Linux?

Los torneos juveniles Evita sirvieron como propuesta a la juventud con el objetivo de manifestar la solidaridad y respeto a través del deporte, tanto en los individuales como los de equipo Durante el discurso de inauguración de los Torneos de 1948, Juan Perón enseña cómo compilar un kernel Linux en Ubuntu.

¡Queridos niños!

Siento una enorme satisfacción al inaugurar estos Juegos Nacionales Evita, bajo cuya bandera competirá limpiamente la juventud de la Nación. Son ustedes dignos representantes de esta tierra, y la felicidad y bondad rebosa en sus sanos corazones. No hacen más que agraciar a este viejo soldado.

Nuestra República se constituye mediante un acto que engendra Justicia pero también una necesidad nacional: la de formar hombres de mentes sanas en cuerpos sanos. El cuerpo puede ser maleado y tornado, a fin de hacer de él una herramienta de creación. Sin embargo, la mente - que es el sujeto creativo - ha de ser libre, y hemos de proponer para ella toda funciones de aprendizaje. De esta manera - gracias a una cultura autóctona, sana y positiva - los niños de hoy se conviertan en los mejores hombres del mañana; tornarán finalmente en aquellos que puedan llevar al país en la senda de la grandeza.

La Nueva Argentina ha decidido para vosotros tal signo, de carácter eminentemente social. El deporte será aquello que permitirá atresar corazones y mentes.


Pues bien, el corazón de nuestro Movimiento, el Justicialismo, está en Evita, y su músculo son los hombres que trabajan. Por fiel reflejo, nuestro sistema informático consta de un corazón: su Kernel Linux, y su músculo son las aplicaciones GNU. La realidad efectiva es que - en mi carácter de Conductor del Movimiento - os proveo de Kernels que se actualizan automáticamente cada tantos días a través de los repositorios oficiales de Ubuntu. En particular, estos Kernels oficiales representan versiones probadas de hace unos meses atrás, yy como tal son muy adecuadas para Ubuntu.

Sin embargo, nada impedirá a vosotros mismos compilar un Kernel propio, de factura más moderna, afinada y experimental. Y si lo deseamos, también podremos instalarlo en nuestro sistema para evaluarlo.

Tal acción no es simple, pero si vuestra alma es pura y desean la aventura, os instruiré como Conductor didacta para llevarlos a un buen resultado deportivo.

Vean niños, para compilar un Kernel, primero debemos descargar el árbol completo de su código fuente desde la web oficial del Kernel Linux, y luego crear un archivo de configuración para el procedimiento particular que querramos. Confome el procedimiento esté finalizado, podremos instalarlo.

En este caso utilizaré una versión del Kernel Linux estable, la 4.9.11, de muy reciente liberación. Es natural que salgan iteraciones nuevas cada pocos días, de modo que será poco deportivo correr "detrás del último Kernel". Mas bien consideren tal versión como un ejemplo avanzado al momento de este discurso. Pues bien, os enseñaré cómo compilar dicho kernel para Ubuntu, y crear a partir de la compilación un paquete .deb instalable.

¿Porqué compilar un kernel personalizado?

Compilar nuestro propio Kernel tiene sus ventajas y desventajas. Para cambiar el comportamiento del Kernel, uno debe compilarlo y luego reiniciar el equipo para que se cargue esta versión diferente de Linux. Ahora bien, la mayoría de las funcionalidades del Kernel Linux están contenidas en módulos opcionales. Algunos de los beneficios de contar con un Kernel personalizado son:
  1. Soporte de mayor variedad de hardware, incluyendo el de reciente aparición.
  2. Remoción de controladores y módulos no deseados/requeridos del Kernel, para agilizar su operatoria.
  3. Inicio más veloz, debido a tratarse de un Kernel "deportivo".
  4. Seguridad incrementada, debido a características/módulos/controladores adicionales agregadas o removidos.
  5. Aprenderán acerca del Kernel y su uso avanzado.
  6. Siempre correrán un Kernel de última factura.
  7. Menor empleo de memoria RAM.
Nota: Estas instrucciones son a modo de ejemplo, y fueron evaluadas tanto en Ubuntu Linux v14.04.4/16.04.2 LTS.

Requisitos

Daré por sentado que contamos la revisación médica, que vuestros padres poseen el carnet del Partido. Además, necesitaremos unos 10 GB de espacio libre en disco, amén de tiempo (idealmente un par de horas).

Instalar los paquetes requeridos

Abrimos una terminal y ingresamos el siguiente Comando de Organización para instalar las dependencias necesarias para la compilación del kernel:

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc

...el sistema nos devolverá algo como:

Fig.01: Instalando el compilador gcc y sus muchachos peronistas

Acto seguido instalaremos el paquete kernel-package. Tendremos dos opciones, una instalarlo con toda la paquetería requerida (lo que rondará 1 GB de descargas)

sudo apt-get install kernel-package

...pero también podríamos usar el siguiente comando, que prescinde instalar paquetes adicionales relativamente innecesarios en ciertas condiciones. Si tienen dudas, ingresarán el comando anterior.

sudo apt-get --no-install-recommends install kernel-package

...el sistema devolverá algo como:
Fig.02: Instalando las utilidades necesarias para compilar el Kernel Linux.

Descargar el código fuente del kernel Linux

Ingresamos los siguientes comandos para descargarnos tanto el código fuente como las llaves PGP del mismo usaremos el comando wget, de la siguiente manera (naturalmente, modificaremos la URL correspondiente a la versión que deseemos):

cd ~ ;
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.14.tar.sign
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.14.tar.xz

...el sistema nos devolverá algo como:
Fig.03: Usando wget para bajarnos un árbol completo de código fuente de una versión reciente del Kernel Linux, desde la web oficial kernel.org

El acto de descargar el árbol de código fuente termina aquí. Sin embargo, os recomiendo realizar una verificación de autenticidad de la firma del mismo, para asegurarnos que no exista una descarga fallada o - mucho peor - una suplantación de Kernels por uno falso hackeado.

Para ello utilizaremos las herramientas de GnuPG para verificar la autenticidad de la afiliación al Partido Justicialista, es decir, confirmar la validez las firmas del Kernel. Para ello en este caso ingresamos:

unxz linux-4.9.14.tar.xz
gpg --verify linux-4.9.14.tar.sign

Tras unos segundos, Ubuntu verificará y nos devolverá algo como:

gpg: asumiendo que hay datos firmados en «linux-4.9.14.tar»
gpg: Firmado el dom 12 mar 2017 02:42:41 ART usando clave RSA ID 6092693E
gpg: Imposible comprobar la firma: clave pública no encontrada

Normalmente indicará que no podremos comprobar la firma, pues no la tendremos cargada en nuestro criptosistema. Para ver de quién es, debemos obtener las llaves del servidor público de llaves PGP a fin de verificar esta firma (en el ejemplo, la firma RSA key ID 6092693E). Ello lo haremos con:

gpg --keyserver hkp://keys.gnupg.net --recv-keys 6092693E

...y el sistema mostrará en pantalla:

gpg: solicitando clave 6092693E de hkp servidor keys.gnupg.net
gpg: clave 6092693E: clave pública "Greg Kroah-Hartman (Linux kernel stable release signing key) " importada
gpg: clave 6092693E: clave pública "Greg Kroah-Hartman (Linux kernel stable release signing key) " importada
gpg: 3 dudosa(s) necesaria(s), 1 completa(s) necesaria(s),
modelo de confianza PGP
gpg: nivel: 0  validez:   1  firmada:   1  confianza: 0-, 0q, 0n, 0m, 0f, 1u
gpg: nivel: 1  validez:   1  firmada:   0  confianza: 0-, 0q, 0n, 0m, 1f, 0u
gpg: Cantidad total procesada: 2
gpg:               importadas: 2  (RSA: 2)


Ahora que bajamos la firma digital de quien mantiene el Kernel Linux, comprobamos que el árbol comprimido esté firmado y no esté modificado por extraños:

gpg --verify linux-4.9.14.tar.sign

...el sistema nos indicará:

gpg: asumiendo que hay datos firmados en «linux-4.9.14.tar»
gpg: Firmado el dom 12 mar 2017 02:42:41 ART usando clave RSA ID 6092693E
gpg: Firma correcta de «Greg Kroah-Hartman (Linux kernel stable release signing key) »
gpg: AVISO: ¡Esta clave no está certificada por una firma de confianza!
gpg:          No hay indicios de que la firma pertenezca al propietario.
Huellas digitales de la clave primaria: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

Esto nos indica una firma pública exustente de Greg Kroah-Hartman y nos otorga la verificación por huella digital. Las personas que usualmente publican los Kernels Linux son su creador Linus Torvalds y Greg Kroah-Hartman, En el ejemplo tenemos la firma del segundo, y si bien no tenemos certificada su firma en nuestro propio criptosistema, bien podremos corroborar sus huellas digitales de la clave primaria. Al coincidir con las que ellos proveen públicamente. En este caso es la del compañero Greg, de modo que está todo OK.

Linus TorvaldsABAF 11C6 5A29 70B1 30AB  E3C4 79BE 3E43 0041 1886
Greg Kroah-Hartman 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E

En cambio, si recibiésemos la advertencia de “BAD signature” ("firma MALA") por parte del comando “gpg --verify”, y la huella digital no coincidiese con la de estos compañeros, significaría que la copia del árbol del Kernel que hemos descargado fue creada y publicada por otra persona, y podríamos definir que no es auténtica y podría tener infiltrados al Movimiento.

Una vez cumplimentada esta rutina de seguridad, podremos con tranquilidaddescomprimir el árbol del Kernel en nuestro equipo con el programa tar. Acto seguido verificaremos su contenido. Ello lo haremos con los siguientes Comandos de Organización:

cd ~
tar xvf linux-4.9.14.tar ;

cd ~/linux-4.9.14/ ;
ls


...la devolución en pantalla será intensa, pero reflejará algo como:

linux-4.9.14/
linux-4.9.14/.cocciconfig
linux-4.9.14/.get_maintainer.ignore
linux-4.9.14/.gitattributes
linux-4.9.14/.gitignore
linux-4.9.14/.mailmap
linux-4.9.14/COPYING
linux-4.9.14/CREDITS
linux-4.9.14/Documentation/
linux-4.9.14/Documentation/.gitignore
linux-4.9.14/Documentation/00-INDEX
linux-4.9.14/Documentation/ABI/
linux-4.9.14/Documentation/ABI/README
linux-4.9.14/Documentation/ABI/obsolete/
linux-4.9.14/Documentation/ABI/obsolete/proc-sys-vm-nr_pdflush_threads
linux-4.9.14/Documentation/ABI/obsolete/sysfs-block-zram
linux-4.9.14/Documentation/ABI/obsolete/sysfs-bus-usb
linux-4.9.14/Documentation/ABI/obsolete/sysfs-driver-hid-roccat-arvo
linux-4.9.14/Documentation/ABI/obsolete/sysfs-driver-hid-roccat-isku
linux-4.9.14/Documentation/ABI/obsolete/sysfs-driver-hid-roccat-koneplus
...etc
...etc
linux-4.9.14/virt/kvm/kvm_main.c
linux-4.9.14/virt/kvm/vfio.c
linux-4.9.14/virt/kvm/vfio.h
linux-4.9.14/virt/lib/
linux-4.9.14/virt/lib/Kconfig
linux-4.9.14/virt/lib/Makefile
linux-4.9.14/virt/lib/irqbypass.c


linux-4.9.14

arch   COPYING Documentation  fs ipc  kernel       Makefile README  scripts   tools
block  CREDITS drivers        include Kbuild  lib       mm REPORTING-BUGS security  usr
certs  crypto firmware       init Kconfig  MAINTAINERS  net samples  sound   virt

Configurar el Kernel Linux

Primero, copiamos el archivo .config existente de nuestro Kernel Linux actual para que el nuevo lo replique:

cd ~/linux-4.9.14
cp -v /boot/config-$(uname -r) .config


...el sistema nos devolverá algo como:

'/boot/config-4.4.0-62-generic' -> '.config'

Esto hará que el Kernel nuevo ya esté configurado como el que tenemos, salvo los componentes nuevos que se le hayan incorporado. Para configurar el Kernel nuevo, ejecutamos el siguiente comando:

make menuconfig

...la devolución en pantalla:
 Fig.04: Iniciando menuconfig
ADVERTENCIA: Si no trabajamos con conocimiento o cuidado, podríamos retirar el controlador o soporte de un dispositivo imprescindible y resultarnos en un Kernel "muerto" o no funcional. Por ejemplo, si se quita soporte EXT4 (el sistema de archivos genérico de Linux) , el sistema directamente podría no arrancar. Si estamos en duda, simplemente dejemos el componente activado como lo está, por defecto.

Nos aseguramos de guardar los cambios antes de salir de menuconfig.

Compilar el Kernel Linux

Necesitamos limpiar el árbol de código fuente y resetear los parámetros de kernel-package, y para ello ingresamos:

make-kpkg clean

Los resultados serán similares a:
Fig.06: Ejecutando el comando make-kpkg

Finalmente podremos compilar el Kernel personalizado. Para ello podríamos ingresar:

fakeroot make-kpkg --initrd --revision=1.0.peronista kernel_image kernel_headers

Para acelerar el proceso de compilación podremos hacer uso de la opción -j  (-j 7 significa que empleamos todos los 8 núcleos de nuestro procesador para la tarea computacional de compilar el Kernel Linux):

fakeroot make-kpkg --initrd --revision=1.0.peronista kernel_image kernel_headers -j 7

Ejemplo de devolución:

Fig.07: Comenzando a compilar el Kernel personalizado.

El programa fakeroot ejecutará el comando llamado make-kpkg en un entorno donde simula tener privilegios de administrador a fin de hacer la manipulación de archivos. Esto es útil pues nos permitir que la masa, en forma de usuarios simples sin privilegios, creen archivos contenedores (tar, ar, .deb etc.) mientras que los archivos contenidos en ellos sean creados con permisos pasavantes de administración. El comando make-kpkg - en tanto - compila paquetes de kernel a partir del código fuente del kernel linux. Las opciones que le hemos provisto son:
  • --initrd : Crea una imagen initrd.
  • --revision=1.0.peronista : Establece una revisión específica que se nos ocurra para nuestro kernel, como por ejemplo 1.0.montoto, etc.
  • kernel_image : Este indicador de destino le ordena producir un empaquetado Debian de la imagen del código fuente del kernel Linux, y cualquier módulo que hayamos configurado previamente en el archivo de configuración del kernel .config.
  • kernel_headers : Este indicador de destino le ordena producir un paquete Debian de la imagen del encabezado del kernel.
Tengamos en cuenta que la compilación del kernel puede llevar un tiempo, dependiendo de la potencia del equipo. Por ejemplo, en un equipo i5 de cuatro núcleos con 4 GB de memoria RAM llevó una hora. Al final, deberíamos ver algo como lo siguiente:

test ! -e debian/control~ || rm -f debian/control~
dpkg-gencontrol -isp -DArchitecture=amd64 -plinux-headers-4.9.14 \
                                          -P/tmp/linux-4.9.14/debian/linux-headers-4.9.14/
dpkg-gencontrol: warning: -isp is deprecated; it is without effect
create_md5sums_fn () { cd $1 ; find . -type f ! -regex './DEBIAN/.*' ! -regex './var/.*'      -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums ; if [ -z "DEBIAN/md5sums" ] ; then rm -f "DEBIAN/md5sums" ; fi ; } ; create_md5sums_fn                   /tmp/linux-4.9.11/debian/linux-headers-4.9.11
chown -R root:root                  /tmp/linux-4.9.14/debian/linux-headers-4.9.14
chmod -R og=rX                      /tmp/linux-4.9.14/debian/linux-headers-4.9.14
dpkg --build                        /tmp/linux-4.9.14/debian/linux-headers-4.9.14 ..
dpkg-deb: building package `linux-headers-4.9.14' in `../linux-headers-4.9.14_1.0.peronista_amd64.deb'.
cp -pf debian/control.dist          debian/control
make[2]: Leaving directory '/tmp/linux-4.9.14'
make[1]: Leaving directory '/tmp/linux-4.9.14'

Finalmente verificamos la exisencia de los archivos .deb de los paquetes del kernel:

ls ../*.deb 

...y debería indicarnos los dos paquetes, el encabezado y la imagen del Kernel peronista:

 
../linux-headers-4.9.14_1.0.peronista_amd64.deb  ../linux-image-4.9.14_1.0.peronista_amd64.deb 

Instalar el kernel personalizado

Una vez que se han generado los paquetes con los encabezados y la imagen del kernel personalizado, podremos instalarlo. Para ello tipeamos el siguiente comando dkpg para instalar el kernel personalizado en nuestro sistema:

cd ..
sudo dpkg -i linux-headers-4.9.14_1.0.peronista_amd64.deb
sudo dpkg -i linux-image-4.9.14_1.0.peronista_amd64.deb


La instalación de ambos debería suceder sin incidentes:

Selecting previously unselected package linux-headers-4.9.14.
(Reading database ... 96175 files and directories currently installed.)
Preparing to unpack linux-headers-4.9.14_1.0.peronista_amd64.deb ...
Unpacking linux-headers-4.9.14 (1.0.peronista) ...
Setting up linux-headers-4.9.14 (1.0.peronista) ...
Examining /etc/kernel/header_postinst.d.
Selecting previously unselected package linux-image-4.9.11.
(Reading database ... 110487 files and directories currently installed.)
Preparing to unpack linux-image-4.9.14_1.0.peronista_amd64.deb ...
Done.
Unpacking linux-image-4.9.14 (1.0.peronista) ...
Setting up linux-image-4.9.14 (1.0.peronista) ...
 
 Hmm. There is a symbolic link /lib/modules/4.9.14/build
 However, I can not read it: No such file or directory
 Therefore, I am deleting /lib/modules/4.9.14/build
 
 
 Hmm. The package shipped with a symbolic link /lib/modules/4.9.14/source
 However, I can not read the target: No such file or directory
 Therefore, I am deleting /lib/modules/4.9.11/source
 
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.9.11 /boot/vmlinuz-4.9.14
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.9.11 /boot/vmlinuz-4.9.14
update-initramfs: Generating /boot/initrd.img-4.9.14
W: mdadm: /etc/mdadm/mdadm.conf defines no arrays.
run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 4.9.14 /boot/vmlinuz-4.9.14
run-parts: executing /etc/kernel/postinst.d/update-notifier 4.9.14 /boot/vmlinuz-4.9.14
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.9.14 /boot/vmlinuz-4.9.14
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.9.14
Found initrd image: /boot/initrd.img-4.9.14
Found linux image: /boot/vmlinuz-4.4.0-62-generic
Found initrd image: /boot/initrd.img-4.4.0-62-generic
Found linux image: /boot/vmlinuz-4.4.0-21-generic
Found initrd image: /boot/initrd.img-4.4.0-21-generic
done

Reiniciamos el equipo

Ingresamos el siguiente comando:

sudo reboot

Verificamos que todo funcione correctamente

Tipeamos el siguiente comando para verificar que el Kernel nuevo esté cargado y funcionando correctamente. Debería iniciar correctamente, y en tal caso deberíamos probar los siguientes comandos para revisar que no tenga errores indicados.

uname -a
uname -r
uname -mrs

dmesg | more
dmesg | egrep -i --color 'error|critical|failed'


Por ejemplo:

Linux ubuntu-pj 4.9.14 #1 SMP Sun Mar 12 21:10:55 GMT 2017 x86_64 x86_64 x86_64 GNU/Linux

Y aquí lo tenemos, el Linux Kernel en su versión 4.9.14 peronista, instalado y operando correctamente.

Desinstalación de un Kernel Personalizado


Si por algún motivo deseamos desinstalar el Kernel que hemos instalado, sólo hemos de iniciar uno de los anteriores durante el menú de inicio de Ubuntu. En el caso de Grub, podremos iniciar Ubuntu con las opciones avanzadas y escoger arrancar un Kernel anterior. Una vez iniciado el sistema abrimos una terminal con Ctrl+Alt+T e ingresamos:

sudo apt purge linux-image-4.9.14_1.0.peronista_amd64.deb
sudo apt purge linux-headers-4.9.14_1.0.peronista_amd64.deb

sudo update-grub

Naturalmente, también podríamos eliminar el directorio temporal creado con:

sudo rm -r ~/linux-4.9.14/


Finalmente, reiniciamos el sistema:

sudo reboot 

No hay comentarios:

Publicar un comentario en la entrada