By removing GRUB_TIMEOUT_STYLE=hidden and giving GRUB_TIMEOUT=2,
GRUB menu appears on boot.
GRUB menu
Even with GRUB_TIMEOUT_STYLE=hidden, you can show this menu by pressing
Escape key if GRUB_TIMEOUT is not zero
(ref.).
With GRUB_TERMINAL="console serial", GRUB menu appears in both
VGA console and serial terminal.
GRUB menu in both VGA console and serial terminal
If you can’t see the serial output, consult the
manual
and adjust
GRUB_SERIAL_COMMAND="serial --speed=115200" to your hardware.
Finally, GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200" is
Linux kernel’s command-line parameter.
Like GRUB_TERMINAL="console serial", this enables tty in/out on both VGA
console (tty1) and serial console (ttyS0).
tty output on both tty1 and ttyS0
You can change the command-line parameter at boot time in GRUB menu.
Modify command-line parameter in GRUB menu
After editing /etc/default/grub, execute sudo update-grub.
This will execute grub-mkconfig -o /boot/grub/grub.cfg internally
and modifies /boot/grub/grub.cfg, which is actually loaded on the boot.
After reboot, we can see dmesg and login prompt on the serial console!
Appendix: Original, modified, and diff of /etc/default/grub
Original /etc/default/grub (may differ from yours depending on the environment, it’s QEMU’s one):
# If you change this file, run 'update-grub' afterwards to update# /boot/grub/grub.cfg.# For full documentation of the options in this file, see:# info -f grub -n 'Simple configuration'GRUB_DEFAULT=0GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null ||echo Debian`GRUB_CMDLINE_LINUX_DEFAULT=""GRUB_CMDLINE_LINUX=""# Uncomment to enable BadRAM filtering, modify to suit your needs# This works with Linux (no patch required) and with any kernel that obtains# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"# Uncomment to disable graphical terminal (grub-pc only)#GRUB_TERMINAL=console# The resolution used on graphical terminal# note that you can use only modes which your graphic card supports via VBE# you can see them in real GRUB with the command `vbeinfo'#GRUB_GFXMODE=640x480# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux#GRUB_DISABLE_LINUX_UUID=true# Uncomment to disable generation of recovery mode menu entries#GRUB_DISABLE_RECOVERY="true"# Uncomment to get a beep at grub start#GRUB_INIT_TUNE="480 440 1"
# If you change this file, run 'update-grub' afterwards to update# /boot/grub/grub.cfg.# For full documentation of the options in this file, see:# info -f grub -n 'Simple configuration'GRUB_DEFAULT=0GRUB_TIMEOUT=2GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null ||echo Debian`GRUB_CMDLINE_LINUX_DEFAULT=""GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200"# Uncomment to enable BadRAM filtering, modify to suit your needs# This works with Linux (no patch required) and with any kernel that obtains# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"# Uncomment to disable graphical terminal (grub-pc only)#GRUB_TERMINAL=console#GRUB_TERMINAL="console serial"GRUB_TERMINAL="console serial"GRUB_SERIAL_COMMAND="serial --speed=115200"# The resolution used on graphical terminal# note that you can use only modes which your graphic card supports via VBE# you can see them in real GRUB with the command `vbeinfo'#GRUB_GFXMODE=640x480# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux#GRUB_DISABLE_LINUX_UUID=true# Uncomment to disable generation of recovery mode menu entries#GRUB_DISABLE_RECOVERY="true"# Uncomment to get a beep at grub start#GRUB_INIT_TUNE="480 440 1"