在安装Windows 7后恢复GRUB?

我在电脑崩溃后安装了Windows 7,现在无法启动Ubuntu。Ubuntu的分区还在,我尝试使用Boot-Repair修复,但没有成功!

你可以直接使用Ubuntu光盘本身。请阅读http://askubuntu.com/a/6321/22272,因为那里已经有了答案。 - wisemonkey
6个回答

您可以使用您发行版版本的 LiveCD 在主引导记录中重新安装 grub,

步骤如下:

  • 从 LiveCD 启动 ⋯ 请尝试使用与已安装版本相同的 Grub2 的 LiveCD

  • 在 /mnt 下挂载已安装的 Ubuntu 的根目录

  • 切换到根目录

  • 更新 grub

  • 安装 grub

  • 重新启动

上述步骤来自于 Ubuntu Grub2 社区文档末尾附近

从 LiveCD 启动后(在开机界面选择“尝试 Ubuntu”)

然后启动终端(点击 dash,输入 terminal,...)...

  • 运行 LiveCD 时打开此网页可能更方便。Firefox 可以让您这样做。
在终端中输入sudo fdisk -l,如果要求输入密码,请输入密码。注意这里的小写字母L。找到已安装的Ubuntu分区(从我的例子中剪切其他磁盘)。
me@mycomputer:~$sudo fdisk -l
...
Disk /dev/sde: 300.1 GB, 300089646592 bytes
255 heads, 63 sectors/track, 36483 cylinders, total 586112591 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc3f5ebeb

Device    Boot      Start         End      Blocks   Id  System
/dev/sde2       138464296   586110975   223823340    5  Extended
/dev/sde3   *        2048   138463231    69230592   83  Linux
/dev/sde5       138464298   313460279    87497991    7  HPFS/NTFS/exFAT
/dev/sde6       313460736   317650943     2095104   82  Linux swap / Solaris
/dev/sde7       317652992   581922815   132134912   83  Linux
/dev/sde8       581924864   586110975     2093056   82  Linux swap / Solaris

Partition table entries are not in disk order

找到您的Linux安装(Id=83,System=Linux0),然后输入
sudo mount /dev/sde3 /mnt

但是请使用您的分区而不是/dev/sde3(我的根分区是sde3,sde7是我的家目录分区)。
这是在假设您没有单独的/boot分区的情况下。如果有的话,您还需要通过键入来挂载它。
sudo mount /dev/sd·· /mnt/boot

其中 sd·· 是您安装独立引导目录的分区。

ls /mnt - 只是检查是否正确:

me@mycomputer:~$ sudo mount /dev/sde3 /mnt
me@mycomputer:~$ ls /mnt
bin   cdrom  etc   initrd.img      lib         media  opt   root  sbin     srv  tmp  var      vmlinuz.old
boot  dev    home  initrd.img.old  lost+found  mnt    proc  run   selinux  sys  usr  vmlinuz

你应该测试一下启动目录是否正确安装。输入ls /mnt/boot,如果它是空的,说明启动目录没有安装。它应该看起来像这样:
me@mycomputer:~$ ls /boot
abi-2.6.35-30-generic     initrd.img-2.6.35-30-generic  System.map-2.6.35-31-generic
abi-2.6.35-31-generic     initrd.img-2.6.35-31-generic  vmcoreinfo-2.6.35-30-generic
config-2.6.35-30-generic  memtest86+.bin                vmcoreinfo-2.6.35-31-generic
config-2.6.35-31-generic  memtest86+_multiboot.bin      vmlinuz-2.6.35-30-generic
grub                      System.map-2.6.35-30-generic  vmlinuz-2.6.35-31-generic

然后:

for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt #change the root
sudo update-grub # now update grub

例子:

me@mycomputer:~$ sudo for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt$i; done
me@mycomputer:~$ sudo chroot /mnt
me@mycomputer:~$ sudo update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.0.0-13-generic
Found initrd image: /boot/initrd.img-3.0.0-13-generic
Found linux image: /boot/vmlinuz-3.0.0-12-generic
Found initrd image: /boot/initrd.img-3.0.0-12-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Microsoft Windows XP Professional on /dev/sdc1
done

现在重新安装 grub 到 MBR。您需要知道系统从哪个磁盘引导,并在您已经执行的 `fdisk -l` 列表中找到它。然后输入 `sudo grub-install /dev/sd`,将 `sd·` 替换为您将引导的磁盘。
me@mycomputer:~$ sudo grub-install /dev/sd·

然后输入Crtl-D退出chroot。
然后输入sudo for i in /sys /proc /dev/pts /dev; do sudo umount /mnt$i; done - 作为一行
me@mycomputer:~$ sudo for i in /sys /proc /dev/pts /dev; do sudo umount /mnt$i; done

如果您挂载了一个单独的/boot分区,请输入sudo umount /mnt/boot
me@mycomputer:~$ sudo umount /mnt/boot

然后输入sudo umount /mnt
me@mycomputer:~$ sudo umount /mnt

然后输入sudo reboot来重新启动系统(记得移除LiveCD)。
me@mycomputer:~$ sudo reboot

希望 grub 已安装。

5我刚刚为一个朋友安装了Win7,不得不这样做。多亏了askubuntu,我不必费力去记住。耶!askubuntu。 - keepitsimpleengineer
4工作得很好,谢谢!只是想提一下,我没有在最后费心去卸载所有的文件系统——Ubuntu会在关机时自动卸载文件系统。所以我只是执行了sudo reboot,一切都正常运行。 - Ben Lee
3您还需要挂载EFI分区以进行现代安装。sudo mount /dev/<EFI PARTITION> /mnt/boot/efi - CyberEd
啊,所以那些命令的for循环是必要的,这样我们才能运行chroot /mnt并安全地在chroot监狱中工作。不错。对我来说一切都顺利。 - Will
CyberEd的评论是正确的,否则会出现错误grub-install: error: cannot find EFI directory. - ITW

试一下这个...

恢复 grub:

  1. 打开 live 版本。
  2. 打开终端并运行 sudo fdisk -l,查看 Linux 安装在哪个位置。
  3. 运行 sudo mount /dev/sdaX /mnt,其中 X 是你找到的 Linux 单词所在的数字。
  4. 运行 sudo grub-install --root-directory=/mnt /dev/sda 来安装 grub。
  5. 运行 sudo update-grub 来更新 grub,如果此命令不起作用,重新启动后再运行。
  6. 重新启动。

2你救了我的命... --root-directory 真是我所需要的 - Mellowcandle
2+1 非常简短和快速的解决方案。效果非常好。 - laksys
仍然适用于Ubuntu 16.04和Windows 7。 - hadarS
我在第五步遇到了问题。您能否再解释一下?我收到了这个错误信息:usr/sbin/grub-probe: error: faild to get canonical path of 'aufs - user3486308
1@user145959 如我所说,如果你有错误,在重新启动后可以运行这个命令。 - Black Block
这个方法对我来说很有效,我使用的是Ubuntu 18.04和Windows 7 Ultimate。即使重启后,sudo update-grub 对我也没有用。不过Grub还是能正常工作的,非常感谢这个解决方案。 - Simple
在Manjaro Architect安装程序安装了所有内容(除了grub)之后,对我来说起作用了。我跳过了第5步。 - PJ Brunet
@BlackBlock.. 最简单的完美步骤... 应该标记为被接受的答案。兄弟,干杯! - Gunnrryy

Boot-Repair是一个简单的工具,用于修复在Ubuntu中可能遇到的频繁启动问题,比如在安装Windows或其他Linux发行版后无法启动Ubuntu,或者在安装Ubuntu后无法启动Windows,或者GRUB不再显示,某些升级导致GRUB出现故障等等。

enter image description here

备注:这也可以通过使用live-CD或live-USB来执行。
要么通过软件中心将‘ppa:yannubuntu/boot-repair’添加到您的软件源,要么为了速度,请在新的终端会话中添加它:
sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair

Boot-Repair可以在任何Ubuntu会话(正常会话、live-CD或live-USB)中安装和使用。PPA软件包适用于Ubuntu 10.04、10.10、11.04、11.10、12.04和12.10。 source

在64位的Ubuntu CD上无法工作 - 改用了grub安装方法。 - Jim Ford

安装完Windows 7后,Windows引导程序将覆盖了MBR。
要解决这个问题,你可以在Windows中安装一个名为"EasyBCD"的程序。
按照以下步骤在安装EasyBCD后恢复GRUB:
1. 打开程序,从EasyBCD工具箱中选择"添加新条目" 2. 在操作系统栏中选择"Linux/BSD" 3. 在类型下选择GRUB(传统),然后点击"添加条目"图标 4. 对于重启提示,选择"是" 5. 重启后会显示GRUB,它将自动检测到Ubuntu分区,让你能够启动Ubuntu
祝好运!
下载链接:http://neosmart.net/download.php?id=1

1我试了EasyBCD,它达到了我的要求。在我重新安装win7之后,我失去了对grub的访问。通过EasyBCD,我能够引导Linux来恢复我的原始grub,使用update-grub2然后grub-install /dev/sda。 - Alexandre Schmidt

Boot-Repair的作用:

  • 我在我的电脑上安装了Windows XP和Ubuntu。
  • 我安装了Windows 7,导致新的引导加载程序没有Ubuntu。
  • 我使用启动盘安装了Boot-Repair,并且GRUB随着Windows 7和Windows XP一起得到了更新。

有一个需要注意的细节 - 说明中提到要检查是否有单独的引导分区,如果有的话,则执行sudo mount /dev/sd·· /mnt/boot命令。在这里我有些困惑 - 我确实有一个不是我的Linux引导分区,而是我的基本分区(/sda0)。所以我执行了那个命令,结果得到了一个只显示Windows引导的grub菜单。我重新运行了该过程,没有执行sudo mount /dev/sd·· /mnt/boot命令,一切都很顺利 - 我的旧GRUB菜单回来了,包括所有的Linux选项和Windows。说明只针对单独的Linux引导分区,而不适用于引导分区不是Linux的情况。