GRUB无法检测到Windows。

我终于在我的第二个驱动器上安装了Ubuntu。当我启动电脑时,GRUB只提供让我引导Ubuntu而不是Windows 7。我需要做什么才能在GRUB中选择Ubuntu和Windows?
当我按下启动时的F12键进入引导菜单,并选择"Windows Boot Manager"时,它会引导进入Windows 7。
我运行了命令sudo fdisk -l,这是日志(http://pastebin.com/Cgv1igHc):
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.


Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xc3ffc3ff

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1  1953525167   976762583+  ee  GPT
Partition 1 does not start on physical sector boundary.

请提供您的Boot-Info URL。这将为我们提供相关信息以帮助您。 - LovinBuntu
1对我来说,在运行sudo update-grub之后,我收到了这个警告警告:os-prober将不会被执行以检测其他可引导分区。所以我通过这种方式进行了修复 - WiseTap
13个回答

1. 启动Ubuntu并挂载你的Windows分区(只需在Nautilus上打开磁盘)。 2. 在命令行上运行以下命令(按下 Ctrl + Alt + t): ``` sudo os-prober ``` 3. 如果找到了你的Windows安装,可以运行以下命令: ``` sudo update-grub ```
请注意,第2步仅供您方便参考。您可以直接挂载Windows 7分区,然后运行update-grub命令。
相关问题:

2我有两个分区,每个分区都安装了Windows。但是系统只能检测到另一个分区上的安装,而无法识别新安装在SSD上的Windows!即使已经挂载了...有什么建议吗? - Philippe Gachoud
谢谢。有趣的是,os-prober似乎需要第一步。非常重要,否则Windows将无法正常工作。 - Elliptical view
mount -t ntfs-3g -o ro /dev/sda4 /media/windows 挂载 Windows 分区 - Yuvaraj Loganathan
谢谢。我无法解释在遵循这个之前我有多么沮丧。 - Shivang Kakkar

如果上面的os-prober方法不起作用,请尝试添加自定义的grub菜单项。详细文档在这里
前两个步骤是为了找到你的<UUID>
  1. 运行lsblk,找到带有/boot/efi的行的名称
示例输出(这里的答案是sda2):
lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0   477G  0 disk 
├─sda1        8:1    0   450M  0 part 
├─sda2        8:2    0   100M  0 part /boot/efi
├─sda3        8:3    0    16M  0 part 
├─sda4        8:4    0    47G  0 part /windows
├─sda5        8:5    0 425,6G  0 part /
└─sda6        8:6    0   3,7G  0 part [SWAP]
mmcblk0     179:0    0  14,9G  0 disk 
└─mmcblk0p1 179:1    0  14,9G  0 part

运行sudo blkid /dev/sdaX,其中sdaX是上一步的答案(在我的情况下是sda2)
示例输出(这里的答案是58E4-427D)
/dev/sda2: UUID="58E4-427D" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="b81727be-ba90-5f8c-ab98-d3ec67778b7d"

将以下内容添加到文件/etc/grub.d/40_custom的末尾:
menuentry "Windows 7" {  
     insmod ntfs  
     set root='(hd0,1)'  
     search --no-floppy --fs-uuid --set <UUID>
     chainloader +1  
}

运行sudo update-grub并重新启动。

1感谢@Christopher Markieta在另一个回答中提供的所有细节。我也将它们添加到这个回答中(尽管自定义条目的具体内容不同)。 - Carolus
@PhilippeGachoud 在我的情况下,Ubuntu 20.04根本没有检测到Windows驱动器,而且grub引导程序安装在与Ubuntu相同的驱动器的另一个分区上! - Bilal

我之前在电脑上安装了Windows 10,然后尝试进行双系统启动。安装完Ubuntu后,我的GRUB引导器中没有显示出Windows 10。我尝试了以下方法:
首先,在Windows 10中禁用了安全启动。然后在Ubuntu中运行了以下命令:
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair

工作得相当不错。之后在GRUB中找到了Windows和Ubuntu两个选项。

这个 PPA 还存在吗?我无法添加它,并且在 Ubuntu 18.04 启动盘中它声称不存在。 - jocull
刚在Debian上收到一个“404 Not Found”错误。 - winklerrr
如果WiFi没有连接,它会声称它不存在。这个确切的URL刚才对我起作用了。 - Winter

我按照Boot-Repair的步骤解决了一个类似的问题。
安装boot-repair。
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair

点击“推荐修复”按钮,并按照建议在终端中输入一些命令。
我认为我的Grub无法识别Windows是因为关机不当,这解决了问题。

稍微不同的方法,我从另一台电脑上的一个工作示例中复制,将其发布到我的记录中。

将以下内容追加到/etc/grub.d/40_custom

menuentry "Windows 10" {
        insmod part_gpt
        insmod fat
        search --no-floppy --fs-uuid --set <boot_efi_uuid>
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

其中<boot_efi_uuid>是您的/boot/efi分区的UUID。要找到它:

$ lsblk
NAME              MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT                                                  
sda                 8:0    0 119.2G  0 disk
└─md126             9:126  0 357.7G  0 raid0
  ├─md126p1       259:0    0   499M  0 md
  ├─md126p2       259:1    0   100M  0 md    /boot/efi                                                   

$ sudo blkid | grep md126p2 # Replace with your device
/dev/md126p2: UUID=<boot_efi_uuid>

当然,一旦你保存了文件,运行:
sudo update-grub

重新启动,现在您应该能够成功启动Windows。

1谢谢!根据/etc/grub.d/README的说明,文件名应该是10_windows(或类似的)。 - Josh M.
1我在一个RAID卷上遇到了同样的问题,使用RHEL 7。我通过这个答案解决了问题。非常感谢! - NixMan

如果您之前安装过RAID可能会导致问题。就我个人而言,我在2010年组建了我的台式电脑,并安装了两个1.5TB的条带RAID。用户gracemercy54在这里提到这是残留下来的RAID配置元数据。 当我最初尝试Hermes提供的步骤时,出现了一个指定“RAID集中设备数量错误”的错误。所以,如果发生这种情况,请打开终端并运行:
   sudo dmraid -rE
   sudo os-prober
   sudo update-grub

这个对我来说解决了。

我认为我的问题也是由于RAID引起的。但是对我来说,sudo dmraid -rE没有起作用。最后,我通过在BIOS中临时切换到AHCI,然后启动Ubuntu并执行sudo update-grub,然后再切换回RAID ON来解决了这个问题。 - realhu
3警告:如果您仍在使用,此操作将销毁您的RAID阵列。 - Christopher Markieta

我遇到了类似的问题,解决办法就是按照下面的方式手动添加条目:
menuentry "WINDOWS10 (on /dev/sda1)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    set root='(/dev/sda,msdos1)'
    search --no-floppy --fs-uuid --set=root 688EB92384B85968
    drivemap -s (hd0) ${root}
    chainloader +1
}

上面的UUID(688E...)是通过blkid /dev/sdb1命令从Windows启动盘中获取的。

注意:附加行

set root='(/dev/sda,msdos1)'

指的是在Ubuntu下可见的sda,实际上它是SATA总线上的第一块硬盘,而/dev/sdb实际上是作为根目录/挂载的第二块硬盘。
也许这就是为什么grub脚本无法正常工作的原因。我没有时间改变硬盘的物理顺序,但很可能这也有助于解决问题。

我在Windows 10上遇到了同样的问题。我在我的笔记本电脑上安装了Linux Mint 18.1 Cinnamon 64位系统,以便与WIN10双启动。安装完成后,GRUB只提供了Linux的启动选项,而没有Windows。
我找到了这个视频解决Windows 10在GRUB菜单中消失的方法和这个论坛帖子更新/修复后Grub无法识别Win10,但不幸的是,对我来说都没有起作用,所以我结合了这两种方法来解决我的问题。
打开终端并按照以下命令操作,然后打开名为40_custom的文件:
sudo gedit /etc/grub.d/40_custom

将这些行添加到文件末尾,然后保存并退出:

menuentry "Windows 10" {
   set root='{hd0,1}'
   chainloader + 1
}

保存文件后,使用以下命令更新您的GRUB。
sudo update-grub

然后重新启动您的机器,看看是否有效。
希望这对其他人也有用!

我相信这个答案虽然正确,但在很大程度上是对2015年5月29日提交的答案的复制。 - Charles Green

编辑:正如@Guss所指定的那样,这应该在/etc/default/grub中进行配置,而不是内置脚本。
旧答案:
如果os-prober显示Windows,但GRUB没有显示,请按照以下步骤操作。
  • 编辑grub-mkconfig
    sudo nano /usr/bin/grub-mkconfig
    
  • 在中间附近找到以下行
    # Disable os-prober by default due to security reasons.
    GRUB_DISABLE_OS_PROBER="true"
    
  • true改为false
  • 退出nano(按下CTRL+X,然后按下Y,最后按下Enter键)
  • 更新GRUB
    sudo update-grub
    

在当前的Ubuntu LTS版本中,您可以将GRUB_DISABLE_OS_PROBER=false添加到/etc/default/grub文件中——这是一个配置文件,不会被更新覆盖。 - Guss

我曾经遇到过同样的问题,花了两天时间才解决。但是今天早上我突然有了一个想法,结果行之有效。
你应该检查一下你的BIOS/UEFI设置。在我的情况下,我必须让UEFI先启动。否则,我无法从Ubuntu中检测到Windows。我需要设置的是Ubuntu > Windows引导管理器 > DISK1 > DISK2 > DISK3。而不是DISK1 > Ubuntu > Windows引导管理器 > DISK3。
我有两个Ubuntu安装,一个在硬盘上,一个在固态硬盘上。显然,固态硬盘上的安装没有显示为UEFI,但是我希望先启动速度更快的硬盘。
我没有预料到启动顺序会影响Grub检测系统。所以值得仔细检查一下。

  • 相关问题