Make Windows the Default Operating System in Grub2… even after Ubuntu updates…

Many guides for changing the default operating system for Grub2 to boot involve setting the number indicating where in the list that OS appears… unfortunately, when kernel updates are released for Ubuntu they shift everything down two places and your default OS therefore changes.

Fortunately, it is possible to set the default by name 🙂

First we need to obtain the exact name of the OS you wish to boot by running the following command:

fgrep menuentry /boot/grub/grub.cfg

You’ll get something like this:

fgrep menuentry /boot/grub/grub.cfg
menuentry 'Ubuntu, with Linux 2.6.38-8-generic' --class ubuntu --class gnu-linux --class gnu --class os {
menuentry 'Ubuntu, with Linux 2.6.38-8-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
menuentry "Memory test (memtest86+)" {
menuentry "Memory test (memtest86+, serial console 115200)" {
menuentry "Mac OS X (32-bit) (on /dev/sda2)" --class osx --class darwin --class os {
menuentry "Mac OS X (64-bit) (on /dev/sda2)" --class osx --class darwin --class os {
menuentry “Windows Vista (loader) (on /dev/sda1)” {

Now edit /etc/default/grub:

sudo nano /etc/default/grub

The default file looks like this:

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

In order to set Windows Vista to be the default (I know, I know… who in their right mind?!… but still…) you need to change the line that reads GRUB_DEFAULT=0 to be like so:

GRUB_DEFAULT="Windows Vista (loader) (on /dev/sda1)"

Basically copying and pasting everything in quotes (including the quotes!) for the entry you want to be the default.

The final step is to exit and save, then update grub with:

sudo update-grub
  • joe

    Perfection.

  • Bill

    I have probably looked at over 100 web pages claiming to give instructions on how to do this. NONE of them even came close to working.

    This is the first one that actually WORKED.

    Many kudos and thanks.

  • Nick

    Brilliant, thanks!

  • I say like Bill said above. Thank you Dan.

  • Dr. Pepper

    Great info!
    “Now exit /etc/default/grub:” should say ‘edit’ instead of ‘exit’. It threw me off for a moment. 😛

    • Dan Bishop

      Thanks Dr. Pepper! 🙂

  • wayland

    other write ups using numbers did not work. this one does.

  • Mahmoud

    My kids and I prefer windows for some apps, iTunes mainly…thanks a lot

  • Gene Ricky Shaw

    Got everything to work except for “sudo update-grub”. Command isn’t found, and I checked apropos update, apropos grub, etc. No dice. Everything else in this article was great, tho’.

  • Pierre Laporte

    Worked great for me. I appreciate the help. Merci

  • I’m using ubuntu 12.10 dualboot with windows 7 and my windows entry is: GRUB_DEFAULT=’Windows Vista (loader) (on /dev/sda1)’
    thanks a lot Mr Dan Pepper

  • Rui

    cool. no tricks. Just a clean explanation. Thanks

  • Martin

    This just works. Thanks.

  • Yuriy

    Thank you very much.

  • It worked for me on Debian Wheezy

    Thanks !

  • Maddog2201

    Didn’t work for me, I have it set out exactly as you did (Only mine’s windows 7 and it points to sda 2 instead of 1) but it still defaults to ubuntu. If someone could help me it would be much appreciated

    [Code]
    # 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=”Windows 7 (Loader) (on /dev/sda2)”
    #GRUB_HIDDEN_TIMEOUT=0
    GRUB_HIDDEN_TIMEOUT_QUIET=true
    GRUB_TIMEOUT=10
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”
    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=640×480

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

    [Code]

  • Maddog2201

    Ok, I think I worked out the problem for my self, it would never update grub, and that was because I had “Windows 7 (Loader) (on dev/sda2)” I’ve changed it to 7 and it updated this time at least, funny, I figured this out before my last comment got approved.

  • Maddog2201

    still doesn’t work

    • Dan Bishop

      Have you definitely obtained “Windows 7 (Loader) (on /dev/sda2)” from the command “fgrep menuentry /boot/grub/grub.cfg”? I would expect to see “Windows Vista (Loader) (on /dev/sda2)” for Windows 7…

  • Oakland A’s fan from Montreal, QC

    Nice informations, it worked for me with Emmabuntüs 2 v1.07 based on Xubuntu.

    Thanks Dan.