With GRUB_TERMINAL_INPUT="usb_keyboard0 serial_usb0 console" GRUB_TERMINAL_OUTPUT="serial_usb0 console" GRUB_SERIAL_COMMAND="sleep --verbose --interruptible 1; serial --speed=115200 usb0" GRUB_PRELOAD_MODULES="nativedisk ehci ohci uhci usb usbserial_ftdi" in /etc/default/grub you get: # grub2-mkconfig -o /boot/grub/grub.cfg Invalid output terminal "serial_usb0 console" This can be fixed by changing /usr/sbin/grub2-mkconfig from for x in ${GRUB_TERMINAL_OUTPUT}; do case "x${x}" in xgfxterm) ;; xconsole | xserial | xofconsole | xvga_text) # make sure all our children behave in conformance with ascii.. export LANG=C;; *) echo "Invalid output terminal \"${GRUB_TERMINAL_OUTPUT}\"" >&2 ; exit 1 ;; esac done to (note the appended * after xserial) for x in ${GRUB_TERMINAL_OUTPUT}; do case "x${x}" in xgfxterm) ;; xconsole | xserial* | xofconsole | xvga_text) # make sure all our children behave in conformance with ascii.. export LANG=C;; *) echo "Invalid output terminal \"${GRUB_TERMINAL_OUTPUT}\"" >&2 ; exit 1 ;; esac done But now the GRUB_SERIAL_COMMAND isn't added to grub.cfg because of the following lines in /etc/grub.d/00_header for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do if [ xserial = "x$x" ]; then serial=1; fi if [ xgfxterm = "x$x" ]; then gfxterm=1; fi done After changing these lines to for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do case "x${x}" in xgfxterm) gfxterm=1;; xserial*) serial=1;; esac done now # grub2-mkconfig -o /boot/grub/grub.cfg creates a valid and working config.
Please report this issue upstream. https://www.gnu.org/software/grub/grub-bugs.html
Upstream bug is https://savannah.gnu.org/bugs/index.php?48102