Results 1 to 10 of 34

Thread: A Beginner's Guide to Theming GRUB2

Hybrid View

  1. #1
    Join Date
    Dec 2009
    Beans
    286

    A Beginner's Guide to Theming GRUB2

    Would you like to learn to theme GRUB2? Now, when I say theme GRUB2, I don't mean to simply add a wallpaper and change the text's colors. I'm talking about adding graphics, different fonts, scrollbar, progress bar etc. Check out the attached file for a screenshot of what's possible.

    Interested? Well it's all explained in my latest tutorial 'A Beginner's Guide to Theming GRUB2'. It's a 37 page PDF document that explains it all. Of course, 37 pages complete with screenshots and a sample theme is quite a lot to post. So it's all in my tutorial available here:

    http://www.mediafire.com/?amub1vfdyfhj7v2 (This is obsolete, but is still there)

    Edit: Apparently, 4shared.com now requires you to login or register before downloading files. For this reason, I have moved the file from there and have published it from my Ubuntu One account.

    The 2nd and 3rd editions are now available for download here:
    http://ubuntuone.com/2EslXTLj5s2zzbeYKx17wJ

    This now covers GRUB v1.99 for the following distros:
    • Arch Linux 2011.08.19 using GRUB 1.99-5
    • Debian Squeeze using GRUB 1.99-14 from Debian Wheezy
    • Debian Wheezy using GRUB 1.99-14
    • Fedora 14 (Laughlin) and Fedora 15 (Lovelock) using GRUB 1.99-13.fc16 from Fedora 16
    • Fedora 16 (Verne) using GRUB 1.99-13.fc16
    • LinuxMint 10 (Julia) using GRUB 1.99-12ubuntu5-1linuxmint1 from LinuxMint 12
    • LinuxMint 12 (Lisa) using GRUB 1.99-12ubuntu5-1linuxmint1
    • Mandriva 2011.0 (Turtle) using GRUB 1.99
    • openSUSE 11.3 (Teal) and openSUSE 11.4 (Celadon) using GRUB 1.99-8.7.2 from openSUSE 12.1
    • openSUSE 12.1 (Asparagus) using GRUB 1.99-8.7.2
    • Sabayon 7 using GRUB 1.99
    • Slackware Linux 13.37 using GRUB 1.99
    • Ubuntu 10.04 (Lucid), 10.10 (Maverick) and 11.04 (Natty) using GRUB 1.99-12ubuntu3 from Ubuntu 11.10
    • Ubuntu 11.10 (Oneiric) using GRUB 1.99-12ubuntu5
    • VectorLinux 7.0 using GRUB 1.99

    It includes instructions to upgrade to GRUB 1.99 from the repos of the respective distros.

    I have left the 2nd edition, which covers GRUB 1.98, in the tar archive.

    Please feel free to post any comments or questions about it in this thread.

    You may post your themes here:
    http://ubuntuforums.org/showthread.php?t=1823915

    Happy GRUB2 Theming.:
    Attached Images Attached Images
    Last edited by towheedm; April 9th, 2012 at 05:01 PM.

  2. #2

    Re: A Beginner's Guide to Theming GRUB2

    Moved to General Help.
    Ubuntu user #7247 :: Linux user #409907
    inconsolation.wordpress.com

  3. #3
    Join Date
    Jun 2008
    Location
    Vancouver Canada
    Beans
    3,139
    Distro
    Xubuntu 14.04 Trusty Tahr

    Re: A Beginner's Guide to Theming GRUB2

    Thanks, towheedm.

    This looks interesting.
    I learn something ubuntu everyday.
    dell precision T7500 1Tb hdd x 2
    2.67 Ghz intel xeon X5550 cpu
    nvidia quadro fx 4800-1.5 Gb video card

  4. #4
    Join Date
    Dec 2009
    Beans
    286

    Re: A Beginner's Guide to Theming GRUB2

    Quote Originally Posted by hansdown View Post
    Thanks, towheedm.

    This looks interesting.
    Most welcome. Please let me know how it works out for you, any bugs etc.

  5. #5
    Join Date
    Dec 2009
    Beans
    286

    Re: A Beginner's Guide to Theming GRUB2

    The 2nd edition is now available for download at:
    http://www.4shared.com/file/lFCl6wxL/grub_guidetar.html

    It now includes Ubuntu and Variants (Karmic, Lucid and Maverick), Debian 6.0, Sabayon 5.5, openSUSE 11.3, Fedora 14 and LinuxMint 10.

    It also includes many other customization to the boot menu.
    The Definitive Guide to Theming GRUB2 is here.

  6. #6
    Join Date
    Dec 2009
    Beans
    286

    Re: A Beginner's Guide to Theming GRUB2

    For those using a separate /boot partition and having problems getting their themes to display, here is a very simple/quick fix:

    Copy the unicode font to /boot/grub:
    Code:
    sudo cp /usr/share/grub/unicode.pf2 /boot/grub/
    You may also need to add the following line to /etc/default/grub:
    Code:
    GRUB_FONT_PATH=/boot/grub
    Finally, update GRUB's configuration file.
    The Definitive Guide to Theming GRUB2 is here.

  7. #7
    Join Date
    Aug 2007
    Beans
    18

    Re: A Beginner's Guide to Theming GRUB2

    Hi Towheed,

    I am new to Ubuntu. This is my first Ubuntu installation.

    I am trying to get the grub theme to work on my newly installed Ubuntu Gnome 13.04 and the terminal windows keep popping up after selection. I did try to patch the 00_header but not successful.


    Please help me to get rid of the terminal windows after selection is being made.

    Below is my grub file from /etc/default/grub :
    # For full documentation of the options in this file, see:
    # info -f grub -n 'Simple configuration'

    GRUB_DEFAULT="Ubuntu"
    #GRUB_HIDDEN_TIMEOUT="0"
    GRUB_HIDDEN_TIMEOUT_QUIET="true"
    GRUB_TIMEOUT="2"
    GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`"
    GRUB_CMDLINE_LINUX_DEFAULT="quiet"
    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,0xe fefefef"

    # 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=1024x768
    GRUB_THEME=/boot/grub/themes/demo/theme.txt

    # 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"

    #GRUB_SAVEDEFAULT="false"

    GRUB_BACKGROUND=/boot/grub/themes/demo/terminal-background-workaround.png

    Below is my 00_header file :
    #! /bin/sh
    set -e

    # grub-mkconfig helper script.
    # Copyright (C) 2006,2007,2008,2009,2010 Free Software Foundation, Inc.
    #
    # GRUB is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # GRUB is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with GRUB. If not, see <http://www.gnu.org/licenses/>.

    transform="s,x,x,"

    prefix="/usr"
    exec_prefix="${prefix}"
    datarootdir="${prefix}/share"
    grub_lang=`echo $LANG | cut -d . -f 1`

    export TEXTDOMAIN=grub
    export TEXTDOMAINDIR="${datarootdir}/locale"

    . "${datarootdir}/grub/grub-mkconfig_lib"

    # Do this as early as possible, since other commands might depend on it.
    # (e.g. the `loadfont' command might need lvm or raid modules)
    for i in ${GRUB_PRELOAD_MODULES} ; do
    echo "insmod $i"
    done

    if [ "x${GRUB_DEFAULT}" = "x" ] ; then GRUB_DEFAULT=0 ; fi
    if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then GRUB_DEFAULT='${saved_entry}' ; fi
    if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi
    if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=auto ; fi

    if [ "x${GRUB_DEFAULT_BUTTON}" = "x" ] ; then GRUB_DEFAULT_BUTTON="$GRUB_DEFAULT" ; fi
    if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved" ] ; then GRUB_DEFAULT_BUTTON='${saved_entry}' ; fi
    if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi

    cat << EOF
    if [ -s \$prefix/grubenv ]; then
    set have_grubenv=true
    load_env
    fi
    EOF
    if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
    cat <<EOF
    if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
    set default="${GRUB_DEFAULT_BUTTON}"
    else
    set default="${GRUB_DEFAULT}"
    fi
    EOF
    else
    cat <<EOF
    set default="${GRUB_DEFAULT}"
    EOF
    fi
    cat <<EOF

    if [ x"\${feature_menuentry_id}" = xy ]; then
    menuentry_id_option="--id"
    else
    menuentry_id_option=""
    fi

    export menuentry_id_option

    if [ "\${prev_saved_entry}" ]; then
    set saved_entry="\${prev_saved_entry}"
    save_env saved_entry
    set prev_saved_entry=
    save_env prev_saved_entry
    set boot_once=true
    fi

    function savedefault {
    if [ -z "\${boot_once}" ]; then
    saved_entry="\${chosen}"
    save_env saved_entry
    fi
    }

    function recordfail {
    set recordfail=1
    if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi
    }

    function load_video {
    EOF
    if [ -n "${GRUB_VIDEO_BACKEND}" ]; then
    cat <<EOF
    insmod ${GRUB_VIDEO_BACKEND}
    EOF
    else
    # If all_video.mod isn't available load all modules available
    # with versions prior to introduction of all_video.mod
    cat <<EOF
    if [ x\$feature_all_video_module = xy ]; then
    insmod all_video
    else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
    fi
    EOF
    fi
    cat <<EOF
    }

    EOF

    serial=0;
    gfxterm=0;
    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

    if [ "x$serial" = x1 ]; then
    if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then
    grub_warn "$(gettext "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used.")"
    GRUB_SERIAL_COMMAND=serial
    fi
    echo "${GRUB_SERIAL_COMMAND}"
    fi

    if [ "x$gfxterm" = x1 ]; then
    if [ -n "$GRUB_FONT" ] ; then
    # Make the font accessible
    prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT}"`
    cat << EOF
    if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT}"` ; then
    EOF
    else
    for dir in "${pkgdatadir}" "`echo '/boot/grub' | sed "s,//*,/,g"`" /usr/share/grub ; do
    for basename in unicode unifont ascii; do
    path="${dir}/${basename}.pf2"
    if is_path_readable_by_grub "${path}" > /dev/null ; then
    font_path="${path}"
    else
    continue
    fi
    break 2
    done
    done
    if [ -n "${font_path}" ] ; then
    cat << EOF
    if [ x\$feature_default_font_path = xy ] ; then
    font=unicode
    else
    EOF
    # Make the font accessible
    prepare_grub_to_access_device `${grub_probe} --target=device "${font_path}"`
    cat << EOF
    font="`make_system_path_relative_to_its_root "${font_path}"`"
    fi

    if loadfont \$font ; then
    EOF
    else
    cat << EOF
    if loadfont unicode ; then
    EOF
    fi
    fi

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

    # Gettext variables and module
    if [ "x${LANG}" != "xC" ] ; then
    cat << EOF
    set locale_dir=\$prefix/locale
    set lang=${grub_lang}
    insmod gettext
    EOF
    fi

    cat <<EOF
    fi
    EOF
    fi

    case x${GRUB_TERMINAL_INPUT} in
    x)
    # Just use the native terminal
    ;;
    x*)
    cat << EOF
    terminal_input ${GRUB_TERMINAL_INPUT}
    EOF
    ;;
    esac

    case x${GRUB_TERMINAL_OUTPUT} in
    x)
    # Just use the native terminal
    ;;
    x*)
    cat << EOF
    terminal_output ${GRUB_TERMINAL_OUTPUT}
    EOF
    ;;
    esac

    if [ "x$gfxterm" = x1 ]; then
    if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \
    && is_path_readable_by_grub "$GRUB_THEME"; then
    gettext_printf "Found theme: %s\n" "$GRUB_THEME" >&2

    prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_THEME"`
    cat << EOF
    insmod gfxmenu
    EOF
    themedir="`dirname "$GRUB_THEME"`"
    for x in "$themedir"/*.pf2 "$themedir"/f/*.pf2; do
    if [ -f "$x" ]; then
    cat << EOF
    loadfont (\$root)`make_system_path_relative_to_its_root $x`
    EOF
    fi
    done
    if [ x"`echo "$themedir"/*.jpg`" != x"$themedir/*.jpg" ] || [ x"`echo "$themedir"/*.jpeg`" != x"$themedir/*.jpeg" ]; then
    cat << EOF
    insmod jpeg
    EOF
    fi
    if [ x"`echo "$themedir"/*.png`" != x"$themedir/*.png" ]; then
    cat << EOF
    insmod png
    EOF
    fi
    if [ x"`echo "$themedir"/*.tga`" != x"$themedir/*.tga" ]; then
    cat << EOF
    insmod tga
    EOF
    fi

    cat << EOF
    set theme=(\$root)`make_system_path_relative_to_its_ro ot $GRUB_THEME`
    export theme
    EOF
    elif [ "x$GRUB_BACKGROUND" != x ] && [ -f "$GRUB_BACKGROUND" ] \
    && is_path_readable_by_grub "$GRUB_BACKGROUND"; then
    gettext_printf "Found background: %s\n" "$GRUB_BACKGROUND" >&2
    case "$GRUB_BACKGROUND" in
    *.png) reader=png ;;
    *.tga) reader=tga ;;
    *.jpg|*.jpeg) reader=jpeg ;;
    *) gettext "Unsupported image format" >&2; echo >&2; exit 1 ;;
    esac
    prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_BACKGROUND"`
    cat << EOF
    insmod $reader
    background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`
    EOF
    fi
    fi

    make_timeout ()
    {
    cat << EOF
    if [ "\${recordfail}" = 1 ]; then
    set timeout=${GRUB_RECORDFAIL_TIMEOUT:--1}
    else
    set timeout=${2}
    fi
    EOF
    }

    if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
    cat <<EOF
    if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
    EOF
    make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}"
    echo else
    make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
    echo fi
    else
    make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
    fi

    if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ] && [ "x$GRUB_BUTTON_CMOS_CLEAN" = "xyes" ]; then
    cat <<EOF
    cmosclean $GRUB_BUTTON_CMOS_ADDRESS
    EOF
    fi

    # Play an initial tune
    if [ "x${GRUB_INIT_TUNE}" != "x" ] ; then
    echo "play ${GRUB_INIT_TUNE}"
    fi

    if [ "x${GRUB_BADRAM}" != "x" ] ; then
    echo "badram ${GRUB_BADRAM}"
    fi

    Thanks.

  8. #8
    Join Date
    Dec 2009
    Beans
    286

    Re: A Beginner's Guide to Theming GRUB2

    Simply put, you cannot get rid of the terminal window. It's part of the GRUB source code.

    Also, if you followed the 3rd Edition (which you should use now), from Page 69 of the Guide:
    A background image is never shown if we are using GRUB's graphical theme
    because GRUB_THEME takes precedence over GRUB_BACKGROUND. Before a background
    image is shown in the terminal window, we must remove this precedence. This is set in GRUB's
    /etc/grub.d/00_header script as shown below:
    The patch only allows you to apply a background image to the temrinal window, not remove it all together.
    The Definitive Guide to Theming GRUB2 is here.

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •