如何修复grub?(安装 Windows 后如何取回 Ubuntu?)

Sal*_*din 392 grub2 dual-boot windows boot-repair

我安装了 Windows 7,它吃了 Ubuntu 的启动文件。启动计算机时,它现在直接进入 Windows,而没有给我启动 Ubuntu 的选项。

我怎样才能找回 Ubuntu?

Sco*_*nce 401

当您安装 Windows 时,Windows 假定它是机器上唯一的操作系统 (OS),或者至少它不考虑 Linux。所以它用自己的引导加载程序替换了 GRUB。您需要做的是用 GRUB 替换 Windows 引导加载程序。我已经看到了通过使用 GRUB 命令或类似命令来替换 GRUB 的各种说明,但对我来说,最简单的方法是简单地chroot进入安装并运行update-grub. chroot很棒,因为它允许您进行实际安装,而不是尝试到处重定向。它真的很干净。

就是这样:

  1. 在“Try Ubuntu”模式下从 live CD 或 live USB 启动。
  2. 确定主分区的分区号。sudo fdisk -lsudo blkid或的gparted(这应该已经安装,默认情况下,在实时会话)可以帮助你在这里。我将在这个答案中假设它是/dev/sda2,但请确保为您的系统使用正确的分区号!

    如果你的主分区处于LVM,器件将位于/dev/mapper/,最有可能的,/dev/mapper/{volume}--{os}-root这里{volume}是LVM卷名{os}是操作系统。执行ls /dev/mapper确切的名称。

  3. 挂载你的分区:

    sudo mount /dev/sda2 /mnt  #Replace sda2 with the partition from step 2
    
    Run Code Online (Sandbox Code Playgroud)

    如果您有单独的/boot/var/usr分区,请重复步骤 2 和 3 以分别将这些分区安装到/mnt/boot/mnt/var/mnt/usr。例如,

    sudo mount /dev/sdXW /mnt/boot
    sudo mount /dev/sdXY /mnt/var
    sudo mount /dev/sdXZ /mnt/usr
    
    Run Code Online (Sandbox Code Playgroud)

    用相应的分区号替换sdXWsdXYsdXZ

  4. 绑定挂载一些其他必要的东西:

    for i in /sys /proc /run /dev; do sudo mount --bind "$i" "/mnt$i"; done
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果 Ubuntu 安装在 EFI 模式下(如果您不确定请参阅此答案),请使用sudo fdisk -l | grep -i efi或 GParted 来查找您的 EFI 分区。它将有一个标签EFI。挂载此分区,替换sdXY为您系统的实际分区号:

    sudo mount /dev/sdXY /mnt/boot/efi
    
    Run Code Online (Sandbox Code Playgroud)
  6. chroot 进入你的 Ubuntu 安装:

    sudo chroot /mnt
    
    Run Code Online (Sandbox Code Playgroud)
  7. 此时,您处于安装状态,而不是实时会话中,并且以 root 身份运行。更新 grub:

    update-grub
    
    Run Code Online (Sandbox Code Playgroud)

    如果您遇到错误或者如果执行第 7 步没有解决您的问题,请转到第 8 步。(否则,它是可选的。)

  8. 根据您的情况,您可能需要重新安装 grub:

    grub-install /dev/sda
    update-grub # In order to find and add windows to grub menu.
    
    Run Code Online (Sandbox Code Playgroud)
  9. 如果 Ubuntu 安装在 EFI 模式下,并且 EFI 分区 UUID 发生了变化,您可能需要在/etc/fstab. 比较一下:

    blkid | grep -i efi
    grep -i efi /etc/fstab
    
    Run Code Online (Sandbox Code Playgroud)

    如果当前 EFI 分区 UUID(来自blkid)与 中的不同,则使用当前 UUID 进行/etc/fstab更新/etc/fstab

  10. 如果一切正常,没有错误,那么你就准备好了:

    exit
    sudo reboot
    
    Run Code Online (Sandbox Code Playgroud)
  11. 此时,您应该可以正常启动。

如果您无法正常启动,并且由于没有错误消息而没有执行第 8 步,请重试第 8 步。

  • 有时为您的分区提供正确的 GRUB2配置是不够的,您必须实际将其安装(或重新安装)到主引导记录,第 8 步就是这样做的。帮助用户聊天的经验表明,即使没有显示错误消息,步骤 8 有时也是必要的。

  • 此解决方案也适用于具有 BIOS(即非 UEFI)的计算机上的 Windows 10。关于您拥有哪一个的问题可以通过此技巧来回答 - https://www.thewindowsclub.com/check-if-uefi-or-bios。 (3认同)
  • 评论不用于扩展讨论;此对话已[移至聊天](http://chat.stackexchange.com/rooms/56694/discussion-on-answer-by-scott-severance-how-can-i-repair-grub-how-to-得到-ubunt)。 (2认同)
  • @ScottSeverance 我从你的个人资料中看到你住在 DFW。您是否考虑过提供课程或现场教程来让人们深入了解 Linux? (2认同)
  • 这些问题不会过时 :D – 并不是在处理 EFI 时,您可能需要安装 `grub-efi-amd64`,如果您使用的是安全启动,则需要使用 `grub-install --uefi-安全启动`。这也在 https://superuser.com/a/376471/197980 中有详细说明 (2认同)
  • 将我的磁盘克隆到新的替换设备后,这几乎对我有用。我也使用 EFI 双启动。在 grub-install 期间发出警告:“grub-install:警告:此系统不支持 EFI 变量..”。基于这个答案 https://unix.stackexchange.com/a/693111 我必须在步骤号中使用 --rbind 标志而不是 --bind 。4、所以是`for i in /sys /proc /run /dev; 执行 sudo mount --rbind "$i" "/mnt$i"; 完成`。 (2认同)

Web*_*b-E 137

Windows 安装程序不关心系统中的其他操作系统。所以它在主引导记录上编写自己的代码。幸运的是,解决方案也很简单。

您需要修复 MBR。请执行下列操作

使用 ubuntu 的 live usb/cd 启动。使用boot-repair来解决这个问题。

使用 live usb/cd 启动后,在终端中运行以下命令:

sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair
Run Code Online (Sandbox Code Playgroud)

使用Recomended Repair.

在此处输入图片说明

更多信息 - https://help.ubuntu.com/community/Boot-Repair

  • 您先安装了 Windows 7,然后安装了 linux。所以linux识别windows而不是windows识别linux。尝试重新安装windows7,你就会明白我的意思。 (9认同)
  • 你是说微软人故意的??双引导也适用于 Windows 7,所以它与您的第一行“Windows 安装程序不关心系统中的其他操作系统”相矛盾。 (2认同)
  • Windows 一直在破坏 grub,这是一个非常普遍的问题,我不得不自己处理。答案仍然很好,应该可以解决问题。 (2认同)
  • 启动修复很好地支持传统模式,也许您还需要在传统模式下启动 live cd/usb @fuzzyanalysis :) (2认同)

Sto*_*rux 32

从实时 Ubuntu USB 随身碟或 CD启动
按照以下步骤在 ubuntu 上安装启动修复

打开终端并运行以下命令

sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install boot-repair
Run Code Online (Sandbox Code Playgroud)

完成安装后,如果您使用 Gnome,您可以从 System->Administration->Boot-Repair 菜单启动它,如果您使用 Unity,则可以在 dash 中搜索“boot-repair”。然后按照以下屏幕截图操作:

方法一

  • 点击高级选项

初始画面

  • 勾选下面显示的选项

高级选项

  • 将tab改成Grub Location选项卡,勾选如图所示的选项

在此处输入图片说明

按应用并重新启动系统

方法二

  • 选择推荐的启动修复选项,如第一个屏幕截图所示

文件:

  • 在 Windows 10 更新覆盖 GRUB 然后破坏其自己的引导加载程序的特别令人讨厌的情况下,此方法对我有用。按照这个过程,Windows 和 Linux 都回来了。就我而言,它是 Linux Mint 18.1,引导修复菜单看起来略有不同,但一切正常。谢谢! (2认同)

Ham*_*med 14

只需easyBCD在 Windows 7 中安装并执行

添加新条目 > Linux/BSD >(选择)Grub2 >(推送)添加条目

然后您可以在 Windows 7 引导加载程序上选择Ubuntu以转到Grub2(以前的引导加载程序)。

  • 这些指令本身并不能恢复 Grub 引导加载程序 - 当我尝试它们时,他们在 Windows 中添加了一个额外的引导选项,选择后重新启动我的机器,然后将我带到 grub> 提示符。因此,下一步需要采取进一步措施。 (3认同)

Rod*_*ith 13

在基于 EFI 的系统(例如大多数随附 Windows 8 或更高版本的系统)上,Windows 有时会更新其引导加载程序或将其重置为默认引导加载程序。这在重新安装操作系统或执行主要系统更新(例如升级到最新的 Windows 版本)时尤为常见。请注意,Windows 不太可能真正擦除基于 EFI 的计算机上的任何 GRUB 文件。启动 Ubuntu 所需的一切仍然存在;它只是被绕过。在这些情况下,完全重新安装 GRUB 是多余的,事实上,它有(很小的)机会会产生新的问题。

因此,在这些情况下,我建议将 GRUB(或任何您喜欢的引导加载程序或引导管理器)重置为默认设置,而不是重新安装 GRUB。有几种方法可以做到这一点,包括:

  • EasyUEFI——如果系统直接引导到 Windows,调整引导顺序的最简单方法是使用EasyUEFI,这是一个免费(基本版本)第三方 GUI 工具,用于管理 EFI 引导顺序。这很ubuntu容易解释——在引导选项列表中找到该条目并将其移动到列表的顶部。下次重新启动时,GRUB 应该会出现。(如果您使用的不是 GRUB,则需要找到它的条目。)
  • bcdedit-- Windowsbcdedit工具可用于将 GRUB 设置为默认启动顺序。命令bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi,在键入管理员命令提示符窗口,将做到这一点; 但是,如果您的计算机在安全启动激活的情况下启动,bcdedit /set {bootmgr} path \EFI\ubuntu\shimx64.efi则将需要。事实上,即使没有使用安全启动,后一个命令通常也能工作,所以我会先使用该命令。请注意,有一个更高级的 Windows shell 工具需要的语法与我介绍的略有不同,但我不记得详细信息。
  • 一次性引导至 Ubuntu——大多数 EFI 提供了一个内置的引导管理器,通过在系统启动过程的早期按功能键、Esc 或 Enter 来访问。ubuntu引导 Ubuntu的条目可能会显示在此引导管理器菜单中,使您能够引导至 Ubuntu。或者,您可以启动到 Ubuntu 紧急介质,例如在“安装前先试”模式下启动的安装程序。无论哪种方式,您都可以使用efibootmgr来调整引导顺序:
    1. 键入sudo efibootmgr以查看引导条目。
    2. 注意当前BootOrder行。
    3. 找到条目ubuntu并记下其Boot####编号。
    4. 键入sudo efibootmgr -o xxxx[,yyyy,zzzz,....]以更改引导顺序,xxxx为 Ubuntu 设置编号。之后发生的事情很可能不是很重要,尽管我已经注意到,如果 Windows 不在列表中,它似乎很可能会将自己重新添加到引导顺序的开头。因此,您可能应该确保 Windows 在列表中,并且重新排序列表可能是最安全的,以便所有原始条目都在那里,只是将ubuntu条目移到列表的顶部。
  • 固件设置实用程序——某些 EFI 的设置实用程序使您可以调整引导顺序。一个 EFI 与另一个 EFI 的细节差异很大,所以我不会详细介绍,但您可以在设置实用程序中寻找这样的选项。

这些过程还有其他变体,例如bcfg在 EFI shell 中使用、bless在 macOS 中使用、使用我的rEFInd进行一次性启动等。不过,我会从 EasyUEFI 开始;这可能是最简单的解决方案。有时,Windows 会坚持在每次启动时将自己设为默认值,而且报告表明这bcdedit可能会更好地处理该问题。

请注意,上述内容均不适用于 BIOS 模式安装;但是,由于大多数装有 Windows 8 或更高版本的计算机以 EFI 模式启动,因此 BIOS 模式安装变得越来越少,因此在许多情况下,最好以 EFI 方式处理问题,而不是盲目地重新安装 GRUB。

  • 通过 EFI 内置启动管理器手动一次性启动到 linux(在我的情况下为 fedora28)允许我使用 `efibootmgr` 重新排序启动顺序(如 Rod 所述 -> 谢谢!)通过win10更新。之后 GRUB-bootmanager 显示为更新前的样子,因此我可以确认提供的解决方案对我有用。我找不到 EasyUEFI 的基本版本,只能找到提供的非免费专业版的试用版。 (3认同)

scr*_*uss 10

现在有一个更简单的解决方案:

  1. 重新启动,然后输入计算机的 BIOS 选项(F2,有时是 F11)。
  2. 转到引导菜单,然后选择引导设备优先级
  3. 检查Windows 启动管理器是否位于主启动驱动器(通常是SATA HDD …IDE HDD …)之上。如果是,请将启动磁盘优先级移至 Windows 启动管理器的优先级之上。
  4. 保存您的 BIOS 选项,然后退出(通常是 F10)。

这已经在三星 Series 7 Chronos 笔记本电脑上进行了测试,双启动 Windows 8 和 Ubuntu 13.10,禁用安全启动,启用 UEFI 和传统启动。


lor*_*o-s 6

引导修复对我有用。使用图形应用程序非常非常容易,您不需要使用命令行,只需单击一个按钮:)

所有可用的修复选项都在Ubuntu 文档中进行了描述,并且有一个单独的页面解释了如何启动引导修复(通过创建可引导磁盘或将其安装在现有的 Ubuntu 实时磁盘中)以及如何使用它。

只需启动 Ubuntu live CD,安装 Boot-Repair 并运行它。


Lov*_*ntu 5

当 GRUB 损坏时,用户通常无法访问系统,因此必须通过实时会话(live-CD 或 live-USB)进行修复。

导致 GRUB 中断的可能原因有很多:Windows 在 MBR 上写入、DRM 阻止 GRUB 正确安装、安装程序错误、硬件更改……按照 Scott 最初的建议更新 GRUB 通常是不够的,按照 Marco 的建议重新安装 GRUB 是效率更高,但仍有各种情况需要其他调整(向内核添加选项、取消隐藏 GRUB 菜单、更改 GRUB 选项、选择正确的主机架构......)。修复 GRUB 的其他困难是 chroot 的使用,以及正确分区 /disks 的选择。

所有这一切都在一个小的图形工具中变得容易:Boot-Repair。它应该集成在 Ubuntu 12.04 CD 中以便于使用,但是对于现在需要它的人来说,已经有一些发行版集成了它:Ubuntu-Secured-Remix(Ubuntu CD 集成了 Boot-Repair)、Boot-Repair-Disk(CD 运行 Boot - 启动时修复),...

希望这可以帮助。


sub*_*ker 5

Scott 和 Web-E 给出的答案已经足够好,并且多次提供帮助。但是很多时候,由于i386和amd64平台的问题或者grub找不到efi目录的问题,boot-repair工具无法修复grub 。
解决我的问题超过 10 次的是手动清除旧的 grub 安装并安装一个新的。

因此,首先执行 Scott回答中的前 6 个步骤,如果出现错误,您可以跳过第 5 步:

  1. 在“Try Ubuntu”模式下从 live CD 或 live USB 启动。
  2. 确定主分区的分区号。sudo fdisk -lsudo blkid或的gparted(这应该已经安装,默认情况下,在实时会话)可以帮助你在这里。我将在这个答案中假设它是/dev/sda2,但请确保为您的系统使用正确的分区号!

    如果你的主分区处于LVM,器件将位于/dev/mapper/,最有可能的, /dev/mapper/{volume}--{os}-root这里{volume}是LVM卷名{os}是操作系统。执行ls /dev/mapper确切的名称。

  3. 挂载你的分区:

    sudo mount /dev/sda2 /mnt  #Replace sda2 with the partition from step 2
    
    Run Code Online (Sandbox Code Playgroud)

    如果您有单独的/boot/var/usr分区,请重复步骤 2 和 3 以分别将这些分区安装到/mnt/boot/mnt/var/mnt/usr。例如,

    sudo mount /dev/sdXW /mnt/boot
    sudo mount /dev/sdXY /mnt/var
    sudo mount /dev/sdXZ /mnt/usr
    
    Run Code Online (Sandbox Code Playgroud)

    用相应的分区号替换sdXWsdXYsdXZ

  4. 绑定挂载一些其他必要的东西:

    for i in /sys /proc /run /dev; do sudo mount --bind "$i" "/mnt$i"; done
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果 Ubuntu 安装在 EFI 模式下([如果不确定,请参阅此答案][efi]),请使用sudo fdisk -l | grep -i efi或 GParted 来查找您的 EFI 分区。它将有一个标签EFI。挂载此分区,替换sdXY为您系统的实际分区号:

    sudo mount /dev/sdXY /mnt/boot/efi
    
    Run Code Online (Sandbox Code Playgroud)
  6. chroot 进入你的 Ubuntu 安装:

    sudo chroot /mnt
    
    Run Code Online (Sandbox Code Playgroud)

然后执行以下步骤:

  1. 配置所有挂起的包。
    sudo dpkg --configure -a
  2. 修复损坏的包。
    sudo apt install -fy
  3. 删除当前的 grub。
    sudo apt purge -y grub*-common grub-common:i386 shim-signed
    这可能会警告您您的设备将没有引导加载程序,并且下次可能无法引导。继续并接受它。
  4. sudo apt install -y grub-pc
    运行此命令后,它会要求您指向当前sdXY安装引导加载程序。使用sudo fdisk -l命令查找当前操作系统的安装位置。它将被标记为Linux。使用Tab键导航该窗口并使用键选择一个选项Space
  5. 如果一切顺利,grub 将被正确安装。您也可以sudo grub-update进行双重检查。

如果问题仍然存在,您可以阅读Arch 的 wiki来真正了解 grub 来解决许多其他种类的问题。(是的,对 Ubuntu 也有帮助!)。


小智 5

事实证明 grub 也可以从 Windows 修复。从 CMD 运行以下命令(以管理员身份)为我恢复了 grub 菜单。

bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi
Run Code Online (Sandbox Code Playgroud)