Skip to content

Instantly share code, notes, and snippets.

Last active Dec 2, 2021
What would you like to do?
GRUB2 Theme With grub-mkstandalone


grub-mkstandalone creates an image designed to be held in memory. grub-mkstandalone comes with a --themes flag that could be used to specify a theme, but depending on the modules installed, you may encounter this error like I did.

grub-mkstandalone: error: core image is too big (0x1d71b3 > 0x78000).

This means that the image generated by grub-mkstandalone was too large.

One Solution

Rather than try to embed the theme in the memdisk image generated by grub-mkstandalone, you can manually reference the theme in the grub.cfg file.

Note, your mileage may vary. Depending on the theme, you may need more modules or configuration than me.

For my example, I am using the stock starfield grub theme.


Note: This is a trival example. It will not actually boot, but it can (or should) show you the working theme at the boot prompt

mkdir -p $HOME/live
rsync -avr /usr/share/grub/themes/ $HOME/live/themes/
cat <<'EOF' >$HOME/live/grub.cfg

terminal_output gfxterm
insmod gfxmenu

search --set=root --file /DEBIAN_CUSTOM

insmod all_video
insmod vga

set default="0"
set timeout=30

loadfont /themes/starfield/dejavu_10.pf2
loadfont /themes/starfield/dejavu_12.pf2
loadfont /themes/starfield/dejavu_14.pf2
loadfont /themes/starfield/dejavu_16.pf2
loadfont /themes/starfield/dejavu_bold_14.pf2
insmod png
set theme=/themes/starfield/theme.txt
export theme

menuentry "Debian Live" {
    linux /vmlinuz boot=live quiet nomodeset
    initrd /initrd
grub-mkstandalone \
    --format=i386-pc \
    --output=$HOME/live/core.img \
    --install-modules="linux normal iso9660 biosdisk memdisk search tar ls png gfxmenu" \
    --modules="linux normal iso9660 biosdisk search png gfxmenu" \
    --locales="" \
    --fonts="" \
    --themes="" \
cat \
    /usr/lib/grub/i386-pc/cdboot.img \
    $HOME/live/core.img \
> $HOME/live/bios.img
rm -f $HOME/live/debian-custom.iso && \
xorriso \
    -as mkisofs \
    -iso-level 3 \
    -full-iso9660-filenames \
    -volid "DEBIAN_CUSTOM" \
    --grub2-boot-info \
    --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
    -eltorito-boot \
        boot/grub/bios.img \
        -no-emul-boot \
        -boot-load-size 4 \
        -boot-info-table \
        --eltorito-catalog boot/grub/ \
    -output "${HOME}/debian-custom.iso" \
    -graft-points \
        "${HOME}/live" \
Copy link

williamhaley commented Oct 2, 2018


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment