Bootear kernel alternativo remotamente

2017/06/29

El presente artículo busca responder la pregunta: ¿como se hace para iniciar un PC de usuario con un kernel distinto al por defecto de forma remota en debian o derivados?.

O sea, si estamos frente al PC nos alcanza con presionar la tecla shift cuando la PC bootea y elegir en el menú de grub el kernel deseado, ¿pero como lo hacemos remotamente?

Una vez logueados al sistema de forma remota (utilizando ssh) lo que se debe hacerse es modificar las opciones de grub para que al reiniciar el sistema la PC se utilice el kernel deseado.

Para elegir el kernel a utilizar vale la pena mirar la wiki de ubuntu para entender como se debe modificar el parámetro GRUB_DEFAULT en el archivo /etc/default/grub.

Puede ser útil el siguiente comando que muestra las entradas y submenues de grub:

$ grep -P 'menuentry |submenu ' /boot/grub/grub.cfg | cut -d\' -f-2

Como ejemplo, si en una PC el comando devuelve la siguiente salida:

menuentry 'Ubuntu
submenu 'Opciones avanzadas para Ubuntu
	menuentry 'Ubuntu, con Linux 4.4.0-59-generic
	menuentry 'Ubuntu, with Linux 4.4.0-59-generic (recovery mode)
	menuentry 'Ubuntu, con Linux 3.13.0-107-generic
	menuentry 'Ubuntu, with Linux 3.13.0-107-generic (recovery mode)
	menuentry 'Ubuntu, con Linux 3.13.0-76-generic
	menuentry 'Ubuntu, with Linux 3.13.0-76-generic (recovery mode)
	menuentry 'Ubuntu, con Linux 3.13.0-74-generic
	menuentry 'Ubuntu, with Linux 3.13.0-74-generic (recovery mode)
menuentry 'Memory test (memtest86+)
menuentry 'Memory test (memtest86+, serial console 115200)

y deseamos loguearnos con el kernel 3.13.0-107-generic (la tercer entrada del segundo menú) se debe establecer el valor de la variable GRUB_DEFAULT a 1>2:

$ sudo sed -i.bak-$(date -uIs) 's/GRUB_DEFAULT=.*/GRUB_DEFAULT="1>2"/' /etc/default/grub

Se prefiere el uso de números en lugar de strings para indicar el kernel a utilizar ya que el cambio del kernel por defecto será una medida temporal que luego será revertida. En caso de que sea un cambio permanente se sugiere utilizar strings.

Luego de haber actualizado la opción por defecto de grub se debe actualizar la configuración.

$ sudo update-grub

Resta reiniciar y ya nos podremos conectar remotamente al sistema utilizando el kernel elegido.


Si se quiere bootear otro kernel solo la siguente vez que reinicie el PC, se puede utilizar el comando grub-reboot utilizando como parámetro la entrada del menú deseada. En el caso de ejemplo anterior se utilizaría:

$ sudo grub-reboot '1>2'

para loguearnos con el kernel 3.13.0-107-generic.

El script anterior por defecto modifica el archivo /boot/grub/grubenv, agregando la variable next_entry que luego será leída por grub al iniciar el sistema. Los detalles se encuentran en el archivo /etc/grub.d/00_header.