miércoles, 21 de febrero de 2024

¿Cómo iniciar una versión de kernel específica en Ubuntu?

¡Trabajadores!

No siempre todos los cambios dan los resultados que queremos. 

Sabemos que Ubuntu es un sistema operativo de tipo GNU, que actualmente cuenta con varias líneas de núcleos de sistema operativo de tipo Linux. Cualquiera de estas pueden servir, pero tienen el sentido de complacer a distintos tipos de afiliados. Por defecto se adjuntan versiones veteranas específicas para servidor, que suelen estar ampliamente probadas, bajo el nombre de linux-generic. Conforme las versiones del kernel genérico de Ubuntu van avanzando, estos núcleos también lo hacen. En el caso de Ubuntu 22.04LTS, esta rama representa a kernels de la línea 5.15.

En el caso de las versiones de Ubuntu para uso en escritorio, se puede decidir instalar kernels de una versión más nuevas, la cual sigue una política de mejoras para hardware ("HWE"). El sentido es contar con soporte para hardware de más moderno desarrollo como el que se suele incluir en las PC más modernas. En el caso particular del Ubuntu 22.04LTS, podremos recurrir a instalar la rama 6.5.xx del Kernel Linux. Ya he explicado que desde un tiempo a esta parte esto se hace realidad efectiva desde la terminal, simplemente ingresando el comando:

sudo apt install linux-generic-hwe-22.04

Y finalmente, también podríamos decidir utilizar una versión de kernel incluso más moderna, de carácter experimental de avanzada, o como se dice en la jerga, "bleeding edge". No suelo recomendarlos en aras de la estabilidad del sistema, pero  naturalmente en el caso de Ubuntu 22.04LTS, se podrían instalar versiones de la rama 6.7.xx del kernel Linux mediante:

sudo apt install linux-generic-hwe-22.04-edge

Aunque un sistema Linux sólo corre un único kernel, es indudable que teniendo en nuestro sistemas las imágenes de varias de estas versiones de kernel, las copias antiguas permanecen como resguardo y reaseguro: nunca es una mala política pues ante cualquier eventualidad con una compilación de kernel (que podría fácilmente inutilizar nuestro entorno), podremos recurrir a alguna de las varias versiones anteriores como remedio.

Pues bien señores, el problema de instalar estas ramas de kernels hwe y hwe-edge, radica en el hecho de que si bien son bastante más avanzados que linux-generic, pueden presentar problemas en algunos casos específicos (sobre todo la rama Edge). Por otro lado, una vez que instalamos un kernel de avanzada, no es tan sencillo retornar a una versión anterior ya que normalmente Ubuntu inicia la última versión de Kernel que esté instalada en el sistema. Esto complica la remoción de las versiones más nuevas del kernel del sistema, si por destino, esta fuese la actitud que nos vemos obligados a tomar. Para hacerlo debemos iniciar un kernel de versión anterior.

Iniciar un kernel instalado específico:

Si tenemos varias versiones de kernel instaladas, al presionar la tecla Mayúsculas durante el arranque del sistema, el arrancador Grub nos presentará un menú de inicio donde deberíamos poder seleccionar la opción de arranque deseada. Usualmente, nos dá algunos segundos para elegir una opción del menú y luego escoge automáticamente la primera opción, que es arrancar el sistema operativo Ubuntu cargando en memoria la versión de kernel más moderna disponible.

Si la versión más moderna del kernel falla o tiene algún inconveniente, lo lógico sería escoger la opción "Advanced" o Avanzadas, y elegir una versión de kernel mas antigua desde el submenú de versiones. Si Ubuntu cargó correctamente, procederíamos a desinstalar la imagen antigua y actualizar el Grub con el comando sudo update-grub.

Sin embargo, existen ocasiones donde esto podría no funcionar: si no tenemos teclado en el servidor, o si se trata de una máquina de acceso remoto, ¡no podríamos escoger la opción!. 

Sin embargo, existe un método podremos especificar la versión de arranque "a mano". Esto implica obligatoriamente editar el fichero de configuración del arrancador grub a mano.

Primero hemos de arrancar el sistema y utilizar la terminal (Ctrl+Alt+t o una conexión SSH), y mediante este enlace podremos obtener un listado de los kernels instalados en tal sistema que Grub reconoce. Esto lo haremos mediante el siguiente comando de organización:

grep -Ei 'submenu|menuentry ' /boot/grub/grub.cfg | sed -re "s/(.? )'([^']+)'.*/\1 \2/"

Este nos devolverá como resultado un listado de Kernels instalados, que ilustran sus números de versión y el lugar que ocupan en el menú de Grub, por ejemplo:

menuentry  Ubuntu
submenu  Advanced options for Ubuntu
    menuentry  Ubuntu, with Linux 6.7.0-15-generic
    menuentry  Ubuntu, with Linux 6.7.0-15-generic (recovery mode)

    menuentry  Ubuntu, with Linux 5.15.0-94-generic
    menuentry  Ubuntu, with Linux 5.15.0-94-generic (recovery mode)
    menuentry  Ubuntu, with Linux 5.15.0-92-generic
    menuentry  Ubuntu, with Linux 5.15.0-92-generic (recovery mode)
menuentry  Memory test (memtest86+.elf)
menuentry  Memory test (memtest86+.bin, serial console)
menuentry  MS-DOS 5.x/6.x/Win3.1 (on /dev/sdf1)

Como vemos, esto nos devuelve las opciones del menú de arranque de Grub. Como es consabido, la primera opción suele ser siempre arrancar Ubuntu con el último kernel instalado. Si quisiéramos arrancar una versión específica más antigua de entre los kernels instalados para nuestro Ubuntu (por ejemplo la que dice "Ubuntu, with Linux 5.15.0-94-generic"), en el menú de Grub deberíamos ir a "Advanced" y elegir la tercera opción de la lista, específicamente "Ubuntu, with Linux 5.15.0-94-generic".

Primero lo respaldamos por precaución:

sudo cp /etc/default/grub /etc/default/grub.bak

...y luego lo editamos para arrancar una versión específica:

sudo nano /etc/default/grub

y cambiar la opción por defecto que elije el Ubuntu (la opción "0"), por otra que elija la opción Advanced y elija la tercera opción de la lista. En este caso, se debe indicar de la siguiente manera:

GRUB_DEFAULT="1>3"

Una vez guardado el fichero, actualizamos Grub para que surta efecto:

sudo update-grub

Esto indica "advanced/5ta opción de la lista de kernels". Tengamos en cuenta que si contamos con las opciones de Recovery mode, estas siempre reciben números pares, y las opciones sin recovery mode reciben números impares (como el 3 en este caso).

Luego podremos reiniciar el sistema con:

sudo reboot

y debería ejecutar el kernel solicitado, el 5.15.0-94-generic. Podríamos comprobarlo con el comando:

uname -a

Desinstalar líneas de kernels hwe

Ahora bien, una vez instalado el Kernel antiguo, en este caso podremos desinstalar ya los kernels mas modernos de las ramas hwe o hwe-edge, según nos planteamos. Para ello podríamos indicar:

sudo apt purge linux-generic-hwe-22.04*

...y una vez desinstalados, podremos también remover las imágenes de núcleos Linux modernas que nos nos interesan ya, por ejemplo, en este caso:

sudo apt purge linux-image-6*

(lo cual borrará todos los kernels superiores a 6). 

Ante estos menesteres jamás debemos olvidar volver a actualizamos el Grub, para que deje de hacer caso a kernels que ya han sido desinstalados:

sudo update grub

Si hicimos bien las cosas, no hemos desinstalado aquellos kernels de la rama 5.x (o la que corresponda a nuestra rama linux-generic de la versión de Ubuntu que estemos utilizando). Para asegurarnos de contar al menos con esta rama linux-generic - pues de lo contrario el sistema no arrancaría - ingresamos el comando de instalación que le corresponde:

sudo apt install linux-generic

Este debería indicar que ya está instalado, pues lo hemos hecho para asegurandos, por supuesto.

Finalmente volvemos a editar el fichero /etc/default/grub con

sudo nano /etc/default/grub

...y volvemos a modificar la línea GRUB_DEFAULT a su valor por defecto, para que quede:

GRUB_DEFAULT="0"

Y tras guardar los cambios del fichero de configuración con Ctrl+o y salir del editor GNU Nano con Ctrl+x, actualizamos Grub para que arranque la versión 5.x del kernel:

sudo update-grub

Si todo va bien, podremos reiniciar el sistema con:

sudo reboot

El sistema debería arrancar el último kernel de la línea linux-generic y habernos deshecho de aquellas líneas partidarias no deseadas.

No hay comentarios:

Publicar un comentario