How to change grub command-line (grub shell) keyboard layout?

When I boot in GRUB2 and press c, I have access to GRUB shell.

How to change the keyboard layout (language) of this GRUB shell?

Note that I'm booting an Ubuntu VM inside Virtualbox.


Solution 1:

First, check that you're using GRUB 2 (GRUB 0.x works differently).

grub-install --version

Generate a GRUB keyboard layout file. Below is the command for a french keyboard. For other languages, check /usr/share/X11/xkb/symbols/. Filename choice is not important (you can change bepo).

sudo grub-kbdcomp -o /boot/grub/bepo.gkb fr

Edit /etc/default/grub with root rights to have:

#GRUB_HIDDEN_TIMEOUT=0
GRUB_TERMINAL_INPUT="at_keyboard"

Edit /etc/grub.d/40_custom with root rights to have:

#!/bin/sh
exec tail -n +3 $0

insmod keylayouts
keymap /boot/grub/bepo.gkb

Finally:

sudo update-grub

Note: Forget immediately about using the Shift key to display GRUB menu! It may be normal that terminal_input at_keyboard make this key not work anymore. So make sure #GRUB_HIDDEN_TIMEOUT=0 is properly commented.

Solution 2:

Fine-tuning my grub (2.02-2ubuntu8.3), on an old fully functional Asus N73JF (multiboot Windows 7, Windows recovery, Ubuntu 15.10, Ubuntu 18.04...) a custom menu was not an option for me.

sudo grub-kbdcomp -o /boot/grub/layouts/laptop.gkb fr

(Ubuntu's grub2 uses /boot/grub/layouts from 15.10).

Next, I don't open /etc/default/grub nor /etc/grub.d/40_custom: I edit /etc/grub.d/00_header where I replace

    cat << EOF
  set gfxmode=${GRUB_GFXMODE}
  load_video
  insmod gfxterm
EOF

with

    cat << EOF
  set gfxmode=${GRUB_GFXMODE}
  load_video
  insmod gfxterm
  insmod terminal
  terminal_output gfxterm
  insmod keylayouts
  insmod at_keyboard
  terminal_input at_keyboard
  keymap laptop
EOF

Thanks to KrisWebDev for his question-answer: I learn a lot looking inside /boot/grub/i386-pc/.