How to get to the GRUB menu at boot-time using serial console?

It is always a struggle to show the grub menu, and a lot of answered questions on that. The answer seems to be holding shift, but that doesn't work on serial console (actually serial over lan)

I have tried spamming space and escape to no avail.

This is a server which takes quite a long time to pass bios, and it makes it even more difficult and time consuming.

Is there a good solution to enter grub reliably?

Obviously editing /etc/default/grub would help, but now it is too late.


Solution 1:

Not a perfect solution, but editing the configuration using a live USB fixed the problem.

To avoid this problem in the future, the grub configuration is fixed to display the boot menu.

The boot time for servers are so long anyways, so adding 10 seconds of grub menu is worth it when things are not working.

Here is the fixed /etc/default/grub config:

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT_QUIET=false
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

GRUB_CMDLINE_LINUX_DEFAULT="splash quiet"
# Kernel console on both serial and kvm/local console
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 rootdelay=60"
# Show grub menu on both serial and kvm/local console
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"

Solution 2:

Ubuntu 18.04 desktop minimal change

Here is the minimal change to /etc/default/grub I needed to do on Ubuntu 18.04 desktop image to get things working nicely:

# Show the menu by default. Otherwise, you have to press ESC to see GRUB:
# https://askubuntu.com/questions/16042/how-to-get-to-the-grub-menu-at-boot-time/1091821#1091821
-GRUB_TIMEOUT_STYLE=hidden
+#GRUB_TIMEOUT_STYLE=hidden

# Optional kernel options that you very likely want. Don't affect GRUB itself.
# Remove quiet to show the boot logs on terminal. Otherwise, you see just init onwards.
# Add console=ttyS0, or else kernel does not output anything to terminal.
-GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
-GRUB_CMDLINE_LINUX=""
+GRUB_CMDLINE_LINUX_DEFAULT=""
+GRUB_CMDLINE_LINUX="console=ttyS0"

# Show grub on both serial and on display.
-#GRUB_TERMINAL=console
+GRUB_TERMINAL="console serial"

and then:

sudo update-grub

Tested with this QEMU setup: https://askubuntu.com/revisions/1046792/24

First I logged in once with the GUI, edited those configs, and then re-booted the VM.

Ubuntu 18.04 cloud image

Keep in mind that this image also has a file:

/etc/default/grub.d/50-cloudimg-settings.cfg

which overrides settings from /etc/default/grub.

Besides the desktop settings, you also need to set:

GRUB_TIMEOUT=10

since the default is 0 and gives you no time to access the GRUB menu.

Tested with this setup: Is there any prebuilt QEMU Ubuntu image(32bit) online?