在 Windows 分区中安装 grub 时如何启动到 Windows 7?

Sim*_*Sim 16 grub2 dual-boot windows-7 mbr

原标题:如何用grub在同一个分区上解决(un)启动windows 7?

我一直在研究这个问题两到三天,但我空虚。

基本上,分区 1 是 Windows 7,分区 2 是 Ubuntu 12.04。我告诉 Ubuntu 安装到分区 2 并在分区 1 上安装 GRUB 并且工作正常。但是现在的问题是我无法启动Windows 7。它只是在我选择它后返回到GRUB菜单。

根据我的研究,如果我可以编辑 GRUB 来启动 Windows 7“mbr”或引导加载程序\windows\system32\winload.exe(不使用 Windows 7 修复盘),我的问题将得到解决。这甚至可能吗?


Boot-Repair-Info 的 URL 是http://paste.ubuntu.com/981952/


命令的输出 sudo blkid

/dev/sda1: UUID="1EA0019AA0017A13" TYPE="ntfs" 
/dev/sda2: UUID="e4402f9e-83df-4dc3-8913-69b28314d253" TYPE="ext4" 
/dev/sda3: LABEL="Vault Drive" UUID="74145BFD145BC132" TYPE="ntfs" 
/dev/sda4: UUID="1c030d32-657f-4a78-9468-307d9e09a977" TYPE="ext4"
Run Code Online (Sandbox Code Playgroud)

irr*_*ohn 15

您能否使用如下所述的引导修复工具创建一个 Bootinfo 摘要报告,然后发布该报告的链接?

我知道您已经提供了有关启动配置的一些详细信息。但是,我要求的报告包含更详细的信息,可能会让我们更好地了解您无法使用 GRUB 启动 Windows 的原因。

如何使用引导修复提供“引导信息摘要”


由于您仍然可以启动 Ubuntu,因此您可以使用该命令安装并运行Boot-Repair 工具apt-get,然后将其用于Create a Bootinfo summary.

在终端窗口中运行以下命令以安装该boot-repair工具。

sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair
Run Code Online (Sandbox Code Playgroud)
  1. 完成后,输入命令boot-repair以启动该工具。
  2. 稍有延迟后,boot-repair会询问您是否要下载其最新版本。由于您刚刚安装了最新版本,请回答No
  3. 如果boot-repair要求安装pastebinit软件包,请回复Yes
  4. 该工具现在将扫描您的系统并(最终)显示下图所示的窗口。单击Create a Bootinfo summary框/按钮。这将收集有关系统引导配置的信息,但不会进行任何更改。


    初始引导修复窗口

  5. 创建 bootinfo 摘要后,boot-repair将显示一条包含 URL 的消息,该 URL 应如下所示:http://paste.ubuntu.com/123456/

    请更新/编辑您的问题并添加此 URL。此链接指向的 pastebin 中的信息将(我希望)帮助我们诊断问题。

我认为覆盖 Windows 分区的 VBR 导致了这个问题。

我的理解是启动操作系统有几个步骤。在您的情况下,我认为会发生以下步骤。

  1. 计算机上的 BIOS 尝试运行硬盘驱动器第一个扇区中的代码。第一个扇区通常称为MBR(主引导记录)
  2. 除了 MBR 之外,每个分区还可以有一个引导记录。它通常被称为卷引导记录或 VBR。硬盘驱动器上的 MBR 将控制权转移到分区 1(Windows 分区)的 VBR。
  3. Windows 希望分区的 VBR 朝着引导操作系统(如 Windows 7)迈出下一步。因此,Windows 最初会安装一个 VBR,它将控制权转移到bootmgrWindows 分区中的 Windows程序。

    但是,当您指示 Ubuntu 安装程序将 GRUB 安装到 Windows 分区时,GRUB 似乎已经用自己的 VBR 替换了 Windows VBR。此 GRUB VBR 显示 GRUB 引导菜单。
  4. GRUB 当前用于引导 Windows 的指令本质上是在 Windows 分区中定位 VBR 并将控制权转移给它。Windows 分区中的 VBR 是 GRUB 的 VBR。将控制权转移给它只是(重新)显示 GRUB 引导菜单。

不幸的是,我还不确定解决这个问题的最佳方法是什么。我们要小心,不要破坏 GRUB 并在我们尝试修复启动 Windows 的问题时使您的计算机上无法启动任何东西。

以下是您的 Bootinfo 摘要中的一些信息的副本,以供参考。我上面的评论是基于这些信息。

============================= Boot Info Summary: ===========================

 => Grub2 (v1.99) is installed in the MBR of /dev/sda and looks at sector 1 
    of the same hard drive for core.img. core.img is at this location and 
    looks for (,msdos2)/boot/grub on this drive.

sda1: ______________________________________________________________________

    File system:       ntfs
    Boot sector type:  Grub2 (v1.99)
    Boot sector info:  Grub2 (v1.99) is installed in the boot sector of sda1
                       and looks at sector 44090872 of the same hard drive 
                       for core.img. core.img is at this location and looks
                       for (,msdos2)/boot/grub on this drive. No errors 
                       found in the Boot Parameter Block.
    Operating System:  Windows 7
    Boot files:        /bootmgr /Boot/BCD /Windows/System32/winload.exe

sda2: ______________________________________________________________________

    File system:       ext4
    Boot sector type:  -
    Boot sector info: 
    Operating System:  Ubuntu 12.04 LTS
    Boot files:        /boot/grub/grub.cfg /etc/fstab /boot/grub/core.img
Run Code Online (Sandbox Code Playgroud)

启动 Windows 7 的可能解决方法

下面是编辑 GRUB 引导命令的建议,它可能允许您引导 Windows 7。我不确定这是否可行,但似乎值得一试。

目前,您grub.cfg使用下面的 GRUB 引导命令来引导 Windows 7。

menuentry "Windows 7 (loader) (on /dev/sda1)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
    chainloader +1
}
Run Code Online (Sandbox Code Playgroud)

我建议您尝试更改此设置并改用这些命令。

menuentry "Windows 7 (loader) (on /dev/sda1)" --class windows --class os {
    insmod part_msdos
    insmod ntfs
    insmod ntldr
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
    ntldr ($root)/bootmgr
}
Run Code Online (Sandbox Code Playgroud)

以下是执行此操作的步骤。

  1. 将系统引导至 GRUB 菜单。
  2. 选择(突出显示)GRUB 引导菜单项Windows 7 (loader) (on /dev/sda1)
  3. 按下e可编辑 Windows 7 的 GRUB 引导命令。
  4. 如上所示,对该命令列表进行两项更改menuentry
    • 添加命令 insmod ntldr
    • 将命令更改
      chainloader +1

      ntldr ($root)/bootmgr
  5. Ctrl+XF10使用这些编辑过的命令启动。

注 1:

如果上述解决方法成功加载了 Windows 7 启动菜单,那么您可以通过以下方式使其半持久化

  1. 使用sudo编辑该文件/etc/grub.d/40_custom并添加第二,改性menuentry如上所示。(如果您这样做,我还建议您更改此“自定义”条目的标题。)
  2. 运行命令sudo update-grub以更新/boot/grub/grub.cfg以包含您的自定义条目。(当您启动时,它将位于 GRUB 菜单的底部。)

我认为上面的建议只是一个部分烘焙的解决方案。更好的解决方案是将 Windows VBR 恢复到 Windows 分区同时不会破坏 GRUB 的启动能力。

我认为……但我不是 100% 确定……Windows 恢复命令bootsect可用于执行此操作。如果您想冒险,下面概述了一种可能的方法。

  • 启动 Windows 时,按 调F8Advanced Boot Options菜单。
  • 选择Repair Your Computer条目。
  • 穿过下一个窗口,直到到达System Recovery Options
  • 选择 Command Prompt
  • 运行命令 bootsect /nt60 C:

但是,在您冒险尝试上述方法之前,您可能还想稍等片刻,看看您对问题的其他答案是什么。

笔记2:

在搜索其他内容时,我在 AskUbuntu 上遇到了另外两个与您的问题相关的问题。

  1. 安装 Ubuntu 11 后 Windows 7 无法启动
  2. 安装 Ubuntu 后 Windows 7 无法启动

我不确定这些问题提供了多少帮助。第二个问题的答案是使用命令bootrec /fixboot恢复Windows分区的VBR。我对那个问题的理解是使用该bootrec /fixboot命令解决了问题。

但是第二个问题,坚持bootrec /fixboot没有解决这个问题。

(关于那里可能发生的事情,让我大吃一惊。)


小智 7

menuentry "Windows 7" {
    insmod ntfs
    set root=(hd0,1)
    drivemap -s (hd0) ($root)
    ntldr /bootmgr
    #or chainloader +1
}
Run Code Online (Sandbox Code Playgroud)

如果您在 (hd0,1) 以外的分区上安装了 Windows,则需要使用 drivemap 命令启动到 Windows。Chainloader +1 或 ntldr /bootmgr 均可用于启动 Windows 7。

你所做的是你修改了第一个分区的 VBR;当您从安装 CD 启动时,您可以通过在 cmd 中的 Windows 恢复模式下执行这些命令来恢复它:

bootrec.exe /FixMbr  

bootrec.exe /FixBoot  

bootrec.exe /RebuildBcd
Run Code Online (Sandbox Code Playgroud)