如何修复g?(如何在安装Windows后恢复Ubuntu?)


344

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

我该如何找回Ubuntu?


我认为这是一项常见的任务,我也有两个硬盘和Ubuntu + Windows。我希望您可以用正确的方法进行修复。尝试遵循教程。有任何问题,问我!
antivirtel

1
相关信息(当GRUB安装到错误的驱动器的MBR上时):安装ubuntu后的Grub抢救问题
Eliah Kagan 2013年

是的,您可以,只需执行常规启动并使用Windows进行安装,然后它将在计算机启动时显示在Grub启动菜单中。
Rampoo1208

我知道这是一个旧线程,但是我通过将BIOS中的启动模式从UEFI更改为Legacy解决了该问题。

1
注意:可接受的答案是有关如何修复grub的一般说明。当安装程序错误地编写GRUB时,它也适用于各种各样的情况(普遍存在)。
Danatela

Answers:


348

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

这是如何做:

  1. 从实时CD或实时USB以“尝试Ubuntu”模式启动。
  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
    

    如果你有一个单独的/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
    

    sdXWsdXYsdXZ替换为相应的分区号。

  4. 绑定安装一些其他必要的东西:

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

    sudo mount /dev/sdXY /mnt/boot/efi
    
  6. chroot 到您的Ubuntu安装中:

    sudo chroot /mnt
    
  7. 此时,您正在安装中,而不是实时会话,并以root用户身份运行。更新grub:

    update-grub
    

    如果出现错误,或者执行第7步仍无法解决问题,请转到第8步。(否则,它是可选的。)

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

    grub-install /dev/sda
    update-grub # In order to find and add windows to grub menu.
    
  9. 如果Ubuntu以EFI模式安装,并且EFI分区UUID已更改,则可能需要在中对其进行更新/etc/fstab。比较一下:

    blkid | grep -i efi
    grep -i efi /etc/fstab
    

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

  10. 如果一切正常且没有错误,那么您已经准备就绪:

    exit
    sudo reboot
    
  11. 此时,您应该能够正常启动。

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

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

1
评论不作进一步讨论;此对话已转移至聊天
汤玛斯·沃德

我仍然希望Windows成为我的主要引导操作系统。这仍然是正确的解决方法吗?如何选择要引导到的操作系统?F11?
杰夫(Jeff)

1
我从您的个人资料中看到@ScottSeverance,您居住在DFW。您是否考虑过开设课程或实时教程来使人们深入Linux?
Mohammed Joraid

1
这些问题不会变老:D –不是,在处理EFI时,您可能需要安装,grub-efi-amd64并且如果要使用安全启动,则要使用grub-install --uefi-secure-boot。在superuser.com/a/376471/197980
Raffael

1
此解决方案也适用于具有BIOS(即非UEFI)的计算机上的Windows 10。有关您拥有哪一个的问题,可以通过此技巧解答-thewindowsclub.com/check-if-uefi-or-bios
okolnost

115

Windows安装程序不关心系统中的其他操作系统。因此,它将在主引导记录上写入自己的代码。幸运的是,解决方案也很容易。

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

使用Ubuntu的实时USB / CD引导。使用boot-repair来解决这个问题。

使用实时USB / CD引导后,在终端中运行以下命令:

sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair

使用Recomended Repair

在此处输入图片说明

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


2
您的意思是说它是由Microsoft员工故意设计的?同样,双启动也可以在Windows 7上使用,因此它与您的第一行“ Windows安装程序不关心系统中的其他操作系统”的矛盾是不矛盾的。
Shagun Sodhani'9

Windows一直困扰着它,这是一个非常普遍的问题,我不得不自己解决。答案仍然很好,应该可以解决问题。
达米安

6
您先安装了Windows 7,然后安装了Linux。因此linux识别Windows,而不是Windows识别linux。尝试重新安装Windows7,您将明白我的意思。
Web-E

加密分区(luk)时不要执行此操作,否则会搞砸。它还使用apt-get重新安装了GRUB-不知道为什么要这么做。
孟田

1
引导修复很好地支持传统模式,也许您需要以传统模式引导实时cd / usb @fuzzyanalysis :)
Web-E

25

从活动的Ubuntu USB pendrive或CD
引导,并按照以下步骤在ubuntu上安装Boot-Repair

打开终端并运行以下命令

sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install boot-repair

完成安装后,如果使用Gnome,则可以从“系统”->“管理”->“引导修复”菜单中启动它;如果使用Unity,则可以在破折号中搜索“引导修复”。然后按照以下屏幕截图:

方法一

  • 点击高级选项

初始画面

  • 勾选以下所示的选项

高级选项

  • 将选项卡更改为“ Grub位置”选项卡,然后单击“勾号”。

在此处输入图片说明

按“应用”并重新启动系统

方法2

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

说明文件:


Web-E已经给出了这个答案。也许改为改善那个?我对为什么它不起作用发表了评论。
Dan Dascalescu '16

2
在Windows 10更新特别令人讨厌的情况下,此方法为我工作,它覆盖了GRUB,然后破坏了自己的启动加载程序。遵循此过程即可恢复Windows和Linux。在我的情况下,它是Linux Mint 18.1,引导修复菜单看起来略有不同,但是一切正常。谢谢!
TheBigH

11

只需easyBCD在Windows 7中 安装即可

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

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


3
仅凭这些说明并不能还原Grub Bootloader-当我尝试使用它们时,它们在Windows中添加了一个额外的启动选项,可以选择该选项,重新启动计算机,然后将我带到grub>提示符。因此,对于下一步该如何做,需要采取进一步的措施。
therobyouknow

1
easyBCD允许我添加和删除在Windows Boot Loader和BIOS中都可以看到的引导选项,但是它们从未起作用,因为easyBCD依靠某种自动魔术来查找Linux分区...当我的Linux分区不起作用时,在另一个硬盘上。
模糊分析

6

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

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

  • EasyUEFI-如果系统直接启动到Windows,则调整引导顺序的最简单方法是使用EasyUEFI,它是用于管理EFI引导顺序的免费(对于基本版本)第三方GUI工具。这很ubuntu容易解释- 在启动选项列表中找到条目并将其移到列表顶部。下次重新启动时,应该会出现GRUB。(如果您使用的不是GRUB,则需要找到它的条目。)
  • bcdedit-Windows bcdedit工具可用于将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。


1
通过EFI内置的启动管理器手动一次性启动到Linux(在我的情况下为fedora28),这使我efibootmgr得以重新排序启动顺序(如Rod->谢谢!),这被win10搞砸了更新。之后,GRUB-bootmanager会像更新前一样显示,因此我可以确认所提供的解决方案对我而言是有效的。我找不到EasyUEFI的基本版本,只能找到提供的非免费专业版的试用版。
antiplex

5

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

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

这已在双启动Windows 8和Ubuntu 13.10的Samsung Series 7 Chronos笔记本电脑上进行了测试,禁用了安全启动,启用了UEFI和旧版启动。


最终这对我来说是最干净的选择。还有一些关键操作,但是,嘿,行得通。我混合使用旧版和UEFI引导设备。如果用户引导一个操作系统的速度远远超过其他操作系统,那么从长远来看,这可能会更快(更安全)。
模糊分析

Windows 10自动更新后,这对我也可行。
luis_js

该解决方案为我工作,当我从Windows 10中删除Ubuntu的
维卡斯·古普塔

3

Boot-Repair为我工作。图形应用程序非常容易使用,您无需使用命令行,只需单击一个按钮即可:)

所有可用的修复选项在Ubuntu文档中进行了描述,并且在单独的页面中说明了如何启动Boot-Repair(通过创建可引导磁盘或将其安装在现有的Ubuntu live磁盘中)以及如何使用它。

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


不过,如果有一种更简单的方法来进行Boot Repair,那就太好了。chroot与安装其他工具相比,仅设置维修要快于Google的安装。
Scott Severance

2

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

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

所有这些都可以通过一个简单的图形工具轻松完成:Boot-Repair。它应该集成在Ubuntu 12.04 CD中,以便于使用,但对于现在需要它的人来说,已经有一些发行版将其集成:Ubuntu-Secured-Remix(集成了Boot-Repair的Ubuntu CD),Boot-Repair-Disk(运行Boot的CD) -启动时修复),...

希望这可以帮助。


1

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

因此,请先执行Scott的答案的前6个步骤,如果出现错误,则可以跳过第5步:

  1. 从实时CD或实时USB以“尝试Ubuntu”模式启动。
  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
    

    如果你有一个单独的/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
    

    sdXWsdXYsdXZ替换为相应的分区号。

  4. 绑定安装一些其他必要的东西:

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

    sudo mount /dev/sdXY /mnt/boot/efi
    
  6. chroot 到您的Ubuntu安装中:

    sudo chroot /mnt
    

然后执行以下步骤:

  1. 配置所有挂起的软件包。
    sudo dpkg --configure -a
  2. 修复损坏的包装。
    sudo apt install -fy
  3. 删除当前的g。
    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也有帮助!)。


0

Windows没有看到Linux格式化的分区。您需要使用liveCD中的gparted并创建带有引导标志的NTFS格式化主分区。

如果新的主分区位于扩展分区之后,则有些人会遇到问题,因为Windows并不总是正确地重置分区表。最好具有良好的备份和分区表的单独备份。

将分区表备份到文本文件并保存到外部设备。

sudo sfdisk -d /dev/sda > PTsda.txt

这仅适用于MBR(msdos)系统。如果您的Ubuntu安装在GPT分区驱动器中,则只能以UEFI模式安装Windows或将驱动器转换回MBR(msdos)。


与16.04或更高版本中的gpt分区驱动器一起使用的新版本sfdisk和fdisk也将使用上述命令备份gpt分区驱动器。oldfred不记得他昨晚吃的晚餐,所以不确定他在2013年发布的内容。:)
oldfred

嗨,弗雷德,当我昨晚做饭忘了晚餐时,真是一种祝福。我们删除了之前的评论。
WinEunuuchs2Unix

0

只有fsck命令grub-rescue为我修复了屏幕。

使用启动修复从Live-CD启动,然后打开终端

获取正确的设备:

sudo fdisk -l

需要找到启动设备,该启动设备*在“启动”类别下如下所示:

Device     Boot   Start       End   Sectors  Size Id Type
/dev/sda1          2048   2000895   1998848  976M 82 Linux swap / Solaris
/dev/sda2  *    2000896 943716351 941715456  449G 83 Linux

现在使用以下方法修复磁盘:

sudo fsck /dev/sda2 -y

注意:在此示例中,/ dev / sda2是引导设备。

完成后重新启动。做完了


0

Scott Severance的答案是有效且详细的,但有一项解决方案不需要外部启动设备,因此无需识别并手动挂载所有导致该版本的Ubuntu分区chroot

在Windows 10中,您可以Advanced Recovery用来选择要从中启动的设备(分区?)。

转到Settings并选择Update & Security

在此处输入图片说明

前往Recovery

在此处输入图片说明

Advanced Startup选择Restart Now

在此处输入图片说明

然后选择Use a Device,所有引导选项应显示给您。选择“ ubuntu”分区,然后您的PC应从该分区启动。

一旦启动到我通常的Ubuntu环境中,我就尝试只是运行,grub-update但这并没有改变。

然后我发现我的/boot/efi分区这是/dev/nvme0n1p1sudo grub-install /dev/nvme0n1p1,然后sudo update-grub

由于似乎有新的Windows 10策略在次要更新上覆盖MBR,因此这已多次还原了我的主引导记录。


0

我有一个不同的问题,可能是由于boot-repair擦拭/etc/grub.d/模板引起的,在这里我的问题中对此进行了概述:Windows 10安装后,Ubuntu 18.04无法启动

如@karels注释所指出,grub配置是使用中的文件生成的/etc/grub.d。我的目录仅包含/etc/grub.d/25_custom,其中包含指向不存在的.efi图像的奇怪菜单项。看来我的/etc/grub.d模板可能已被淘汰boot-repair

我通过以下方式解决了这个问题:

  1. 使用Live CD引导(对于使用相同的Ubuntu版本可能很重要)
  2. sudo mount /dev/sdxx /mnt
  3. sudo cp /etc/grub.d/* /mnt/etc/grub.d/
  4. sudo update-grub
  5. 痛苦48小时后重新启动并放松
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.