23

I recently installed CentOS 7 on a machine that has been running Windows 7. I did a dual boot installation and installed CentOS in a partition. But when I boot up my machine, it only gives me two CentOS options. It does not give me the option to choose to boot Windows 7. How can I add windows 7 back to the boot options?

NOTE: I'm reading this post titled: CenTOS 7 dual boot with windows, but my /grub folder only seems to have a splash.xpm.gz file in it with no other files. Also, I'm new to Linux and need something more step by step.

EDIT #1

I'm getting the following results on the command line:

[root@localhost home]# sudo update-grub
sudo: update-grub: command not found
[root@localhost home]# sudo grub-mkconfig
sudo: grub-mkconfig: command not found

Also, I'm currently researching the possibility that these commands might not apply to CentOS. For example in this U&L Q&A titled: "Equivalent of update-grub for RHEL/Fedora/CentOS systems?", as well as this Q&A titled: "Installed Centos 7 after Windows and can't boot into CentOS" seem to imply that I should reinstall grub2. But how do I do that? I'm just now learning Linux.

EDIT #2

The following command does work. Here is the output:

[root@localhost home]# sudo grub2-mkconfig 2>/dev/null
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set pager=1

if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}"
fi

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 load_video {
  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
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux, with Linux 3.10.0-123.el7.x86_64' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-77a053a9-a71b-43ce-a8d7-1a3418f5b0d9' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_msdos 
    insmod xfs
    set root='hd0,msdos5'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint- efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5 --hint='hd0,msdos5'  589631f1-d5aa-4374-a069-7aae5ca289bc
    else
      search --no-floppy --fs-uuid --set=root 589631f1-d5aa-4374-a069-7aae5ca289bc
    fi
    linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=77a053a9-a71b-43ce-a8d7-1a3418f5b0d9 ro rd.luks.uuid=luks-a45243be-2514-4a81-b7a1-7e4eff712d2d vconsole.font=latarcyrheb-sun16 crashkernel=auto  vconsole.keymap=us rd.luks.uuid=luks-5349515e-a082-4ff2-b035-54da7b8d4990 rhgb quiet 
    initrd16 /initramfs-3.10.0-123.el7.x86_64.img
}
menuentry 'CentOS Linux, with Linux 0-rescue-369d0c1b630b48cc8ef010ceb99bc668' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-369d0c1b630b48cc8ef010ceb99bc668-advanced-77a053a9-a71b-43ce-a8d7-1a3418f5b0d9' {
    load_video
    insmod gzio
    insmod part_msdos 
    insmod xfs
    set root='hd0,msdos5'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5 --hint='hd0,msdos5'  589631f1-d5aa-4374-a069-7aae5ca289bc
    else
      search --no-floppy --fs-uuid --set=root 589631f1-d5aa-4374-a069-7aae5ca289bc
    fi
    linux16 /vmlinuz-0-rescue-369d0c1b630b48cc8ef010ceb99bc668 root=UUID=77a053a9-a71b-43ce-a8d7-1a3418f5b0d9 ro rd.luks.uuid=luks-a45243be-2514-4a81-b7a1-7e4eff712d2d vconsole.font=latarcyrheb-sun16 crashkernel=auto  vconsole.keymap=us rd.luks.uuid=luks-5349515e-a082-4ff2-b035-54da7b8d4990 rhgb quiet 
    initrd16 /initramfs-0-rescue-369d0c1b630b48cc8ef010ceb99bc668.img
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Windows 7 (loader) (on /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-chain-386ED4266ED3DB28' {
    insmod part_msdos 
    insmod ntfs
    set root='hd0,msdos2'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos2 --hint-efi=hd0,msdos2 --hint-baremetal=ahci0,msdos2 --hint='hd0,msdos2'  386ED4266ED3DB28
    else
      search --no-floppy --fs-uuid --set=root 386ED4266ED3DB28
    fi
    chainloader +1
}
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
1
  • 2
    +1 for the way you tried before asking, and also documented your tries in the question. You'll do well. Nov 25, 2014 at 18:39

4 Answers 4

23

This is usually fixed by running the scripts detect the installed operating systems and generate the boot loader's (grub2 in this case) configuration file. On CentOS 7, that should be grub2-mkconfig.

  1. Check that windows is detected. Run grub2-mkconfig but discard its output:

    $ sudo grub2-mkconfig > /dev/null 
    Generating grub configuration file ...
    Found background image: /usr/share/images/desktop-base/desktop-grub.png
    Found linux image: /boot/vmlinuz-3.16.0-4-amd64
    Found initrd image: /boot/initrd.img-3.16.0-4-amd64
    Found memtest86+ image: /boot/memtest86+.bin
    Found memtest86+ multiboot image: /boot/memtest86+_multiboot.bin
    Found Windows 7 (loader) on /dev/sda2
    

    The output will look similar (but not identical) to what is shown above. Make sure that Windows is listed.

  2. If Windows was listed in the previous step, go ahead and save the new configuration file. Make a backup first, just in case.

    sudo cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.old
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg   
    

If all went well, you should now be able to reboot into Windows.

9
  • I also have a problem with grub2. I like the answer, but how do I discard the output? Is this the command grub2-mkconfig > /dev/null that I should use? Also, will this work from the rescue mode as well, if linux does not boot?
    – patrik
    Dec 3, 2014 at 10:09
  • @patrik yes, the > /dev/null discards the output. This step is only to check whether Windows is detected. It doesn't do anything. It is sudo grub2-mkconfig -o /boot/grub2/grub.cfg that writes the new configuration file. Also note that the command on Debian-based systems is simply sudo update-grub. Running this from a rescue system can work but you need some other things first. Have a look at my answer here.
    – terdon
    Dec 3, 2014 at 10:15
  • @terdon I am having trouble recreating these steps on a windows 8 machine which I want to turn into a dual boot machine with CentOS 7. Are you willing to help me with it? Here is the link: unix.stackexchange.com/questions/210111/…
    – CodeMed
    Jun 17, 2015 at 15:45
  • @CodeMed I can try but I don't know much about CentOS and less about WIndows.
    – terdon
    Jun 17, 2015 at 17:07
  • Adding some information: just tested that this solution also works for Windows 10. It will generate an entry called Windows Recovery Environment (loader) which, despite its name, won't do any recovery and will boot directly to Windows 10.
    – dr_
    Sep 7, 2016 at 10:28
17

Following up on the answer by @terdon - when you do the test-step, and grub2-mkconfig does not find the Windows partition. Next, make sure you have the "ntfs-3g" package installed, so that your Linux system can read the Windows partition(s).

sudo yum install ntfs-3g

After installing that, when you run

sudo grub2-mkconfig > /dev/null

... you should see the windows boot listed. If the other entry / entries are OK, go ahead and write it.

2
  • 1
    Thank you and +1 for adding insight into this old question.
    – CodeMed
    Jun 23, 2015 at 15:26
  • 1
    you may also need to add --enablerepo epel switch for the first command
    – gamliela
    Mar 20, 2016 at 10:01
9

I came across this issue when installing CentOS 7.0. Windows was not initially listed in the output of grub2-mkconfig.

In order to install ntfs-3g as suggested in another answer, I had to first install epel-release:

sudo yum install epel-release

Simply trying sudo yum --enablerepo epel install ntfs-3g resulted in a repository not found message.

Installing epel-release enabled the installation of ntfs-3g. From there, the Windows partition was listed in grub2-mkconfig. The steps in the previous answers then gave the option to select windows at boot.

4

Summing up answers by @terdon @JosephK and @clk to formalize complete procedure.

  1. Add the epel repository

    sudo yum install epel-release
    
  2. Install ntfs-3g package

    sudo yum install ntfs-3g
    
  3. Run the grub2-mkconfig command and check if 'Windows' entry is detected.

    sudo grub2-mkconfig > /dev/null 
    
  4. Update the grub.cfg file.

    sudo cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.old
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg   
    
1
  • 1
    +1 Yes, this is the correct procedure. It works also for CentOS 8.
    – dr_
    Jan 27, 2020 at 17:48

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .