I dual-boot my machine and I want it to default to boot into windows so that whenever I restart the machine remotely from my home it will be able to get back into Windows (instead of Ubuntu).

The problem is that every time Ubuntu upgrades the kernel, I have to reset the default boot item of grub back to windows. This is because the grub menu loader uses positions i.e. 6 for default OS to boot. And when Ubuntu installs a new kernel it changes that order.

I am looking for a way to configure grub to remember its default boot item under kernel updates.


Grub 1 (Ubuntu 9.04 and earlier)

I find the easiest way to do this is to move the Windows boot entry above the Ubuntu entries in /boot/grub/menu.lst. By default, the Grub configuration file is laid out like this:

  1. basic options
  2. debian auto-magic kernel config (including utilities like memtest86+ by default)
  3. other detected OS's

Section 2 is demarcated by these lines in the config file:

(lots of stuff here)

Entries for autodetected OS's (eg, Windows) are placed after this section. When you install a new kernel, section 2 is the only section that gets changed. So moving the autodetected OS to somewhere before the BEGIN line will place it where the entry number won't change when a new kernel gets installed.

Grub 2 (Ubuntu 9.10 and later)

With Grub2, the entire configuration file is created anew anytime update-grub is run, so editing /boot/grub/grub.cfg won't be a permament fix. How that file is generated is handled by the files /etc/default/grub and the scripts in /etc/grub.d/*. So we modify the configuration by modifing the files which control individual sections of the configfile, then running update-grub again.

My /etc/grub.d includes these files:

  • 00_header
  • 05_debian_theme
  • 10_hurd
  • 10_linux
  • 20_memtest86+
  • 21_memtest86
  • 30_os-prober
  • 40_custom

These are shellscripts that get run in order to generate the config file. The Windows boot entry is generated by 30_os-prober, which is run after the linux boot entries are generated in 10_linux. So just rename 30_os-prober to something less than 10, and rerun update-grub

mv /etc/grub.d/30_os-prober /etc/grub.d/09_os-prober

Now your Windows entry should be the first entry, and you can set that as the default boot entry (GRUB_DEFAULT=) in /etc/default/grub.


Follow the instructions on my blog here to use the clean Windows bootloader for your job. I use it now, and when I start the PC, I have two options:

Windows Vista Ubuntu 10.04

There is no other clutter. You can set many different options for it too. If I do not press anything for 5 seconds, Windows boots up.

Good luck.

  • that link is nearly dead – tshepang Dec 11 '10 at 14:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.