当前位置: 首页>>技术问答>>正文


Windows 10升级导致grub救援

问题描述

我的台式机上有dual-booting Windows 7和Linux Ubuntu,今天是他们免费提供Windows 10升级的那一天。多么激动人心!我得到了更新,它正在安装,我离开去休息30分钟。然而,当我回到我的电脑时,它引导我进入grub救援提示。

error: no such partition.
Entering rescue mode...
grub rescue>

当我输入ls时,我得到以下内容:

grub rescue> ls
(hd0) (hd0,msdos5) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)

在快速浏览了遇到grub救援提示的人后,我输入了set并得到以下信息

grub rescue> set
cmdpath=(hd0)
prefix=(hd0,msdos6)/boot/grub
root=hd0,msdos6

在发现像normal这样的某些命令不起作用之后,我仍然感到很失落,然后我找到了一个视频教程,你从Linux图像cd启动并在终端上运行一些命令。幸运的是,我有我的CD,并从那里启动。当我输入sudo fdisk -l到终端时,这就是我得到的:

ubuntu@ubuntu:~$ sudo fdisk -l

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 / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc03ede74

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      206847      102400    7  HPFS/NTFS/exFAT
/dev/sda2          206848  1547022335   773407744    7  HPFS/NTFS/exFAT
/dev/sda3      1547022336  1547943935      460800   27  Hidden NTFS WinRE
/dev/sda4      1547945982  1953521663   202787841    f  W95 Ext'd (LBA)
/dev/sda5      1915731968  1953521663    18894848    7  HPFS/NTFS/exFAT

在这里说我的设备都没有Linux系统!我不能再遵循视频教程……

我嘲笑我的大脑并确定sda2包含我的Windows系统(因为我记得我的C:驱动器有大约700英寸的空间)。在考虑了一点之后,我记得在安装Ubuntu时,将大约200-ish GB的硬盘空间分配给Ubuntu相关的东西。我不记得哪个,但我认为它基本上是Ubuntu“硬盘空间”,并且它没有任何启动文件。我为linux分配了另外两个东西,但它们的大小非常小(还没有突破1 GB标记)。

那么,这里的任何人都可以帮助我让我的升级回到正轨吗?我不介意我最终必须完全删除其中包含Linux的分区。

最佳解决方法

我的电脑配备了Windows 8 pre-installed,所以我缩小了Windows分区,为Ubuntu腾出空间。这就是它去年的运作方式。在Windows 10升级中第二次重新启动后,计算机无法再启动。 GRUB仅显示grub rescue命令提示符。我后来发现问题的发生是因为Windows以某种方式改变了分区方案。启动分区(包含正常的GRUB数据)不再是GRUB所期望的。我不知道这是怎么发生以及为什么发生的。

在救援模式中您可以做的第一件事是使用ls命令查看分区。我的是:

  • (HD0,GPT1),

  • (HD0,GPT2),

  • 等等

尝试找出您的启动分区是哪个分区。没有Tab完成,您必须完全输入。我尝试了以下命令,直到找到正确的分区:

ls (hd0,gpt1)/
ls (hd0,gpt1)/boot
ls (hd0,gpt2)/

等等

然后在同一提示符下键入set。它将显示GRUB查找其文件的位置。在我的情况下(hd0,gpt6)已移至(hd0,gpt7)。显示的set命令:

prefix=(hd0,gpt6)/boot/grub
root=hd0,gpt6

要恢复正常GRUB,首先将prefix设置更改为指向右侧分区。在我的情况下,命令是:

set prefix=(hd0,gpt7)/boot/grub

然后你可以从救援切换到正常模式:

insmod normal
normal

也可以使用以下方法修复root设置:

set root=(hd0,gpt7)

但这并非绝对必要,因为它对Windows chain-load条目无关紧要。进入正常的GRUB菜单后,您可以启动Windows并完成Windows升级。问题是你必须在每次重启时告诉grub救援关于正确的分区。这就是我做到的。我之后留下了GRUB的问题,因为我不确定Windows是否会对分区或引导进行更多更改。

Windows完成后,我开始解决GRUB问题。按e编辑Ubuntu的启动选项。我将所有(hd0,gpt6)更改为(hd0,gpt7)并启动了Ubuntu。

但是,我使用加密分区和cryptswap。在启动时,Ubuntu问我密码。幸运的是,我在Ubuntu的安装中保存了它并在启动时输入了它。 Ubuntu启动没有问题。

然后我更正了/boot/grub/grub.cfg文件,其中我用(hd0,gpt7)替换了(hd0,gpt6)并执行:

sudo grub-install

此时唯一剩下的问题是加密。由于根Ubuntu分区数增加了1(7而不是6),因此交换分区也发生了类似的变化。我不得不将/etc/crypttab文件更改为指向/dev/sda8而不是/dev/sda7

我只为Ubuntu使用了两个分区(root和swap)。如果与Windows共存的其他操作系统使用更多分区,则可能需要进行更多更改。特别是如果分区是根据它们的数量安装而不是根据它们的UUID安装的。看看你的/etc/fstab。如果分区由UUID标识,则应该没有问题。但是,如果有/dev/...行,如果这些分区已重新编号,则应更正该数字。

次佳解决方法

与Linux一起安装Windows(或升级它)可能会有问题。试试这个:https://help.ubuntu.com/community/Boot-Repair

我在安装Windows 10技术预览版之后使用它来解决问题,并且它有效。基本上,它的作用是重新安装grub以适用于所有当前安装的操作系统。确保告诉它将grub安装到你的linux分区(sd#)。祝好运!

第三种解决方法

在更改分区之前,请进行备份并保存到其他设备。如果不是sda更改为正确的驱动器。然后,如果使用testdisk恢复不正确的集,则可以重新开始。在使用testdisk进行恢复时,您只需要所有当前加上缺少的逻辑。

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

您丢失的分区在此处或在1547年开始扩展分区之间…&第一个分区显示在1915年……:

/dev/sda4      1547945982  1953521663   202787841    f  W95 Ext'd (LBA)
/dev/sda5      1915731968  1953521663    18894848    7  HPFS/NTFS/exFAT

您可以使用testdisk,但它使用CHS。您必须选择所有现有分区和缺少的分区为逻辑分区。它可能会显示许多版本,具体取决于您更改分区的次数。因此,请选择与缺失匹配的大小,而不重叠任何其他当前分区。一些正确恢复只能启动,其他人必须重新安装grub。有些无法纠正恢复分区。

http://www.cgsecurity.org/wiki/TestDisk_Step_By_Step

另一个恢复工具是分开救援。它使用扇区​​,但是你给出的范围必须在缺少的分区之外,与当前分区没有重叠。最好的,如果你知道确切的开始&结束。见男人分手了

http://www.gnu.org/software/parted/manual/html_node/rescue.html

使用parted rescue的用户:

http://ubuntuforums.org/showthread.php?t=1775331&p=10905969#post10905969

第四种方法

这是Windows分区程序中的一个令人讨厌的错误,而不是特定于Linux的错误。在我的案例中讽刺地删除了一个NTFS分区。

如果Windows启动分区sda1太小而无法包含Windows 10 Recovery Environment,则Windows 10安装程序会在主Windows分区sda2的末尾创建一个新分区(您的/dev/sda3)。

当它重写分区表来执行此操作时,对于扩展分区表sda4中的每个逻辑分区,如果它位于前一个分区号之前的磁盘上,它就会放弃。

在您的情况下,您的Linux分区位于新sda5之前的磁盘上,但在重新分区之前具有比sda5更高的分区号。

如果您查看巨大的Windows 10升级日志,您将看到类似“6之前5,无事可做”的消息,以及旧的和新的分区表。

Windows不会覆盖它删除的分区的内容,因此如果您可以找到它们的位置,则可以恢复它们。在我的情况下,我有分区表的备份,但是如oldfred’s answer中所解释的那样使用testdisk很有可能找到它们。由于您的案例中删除了多个分区,因此分区救援将难以使用。

要使用Ubuntu Live CD中的testdisk,请在终端类型sudo apt-get install testdisk中安装它,然后运行sudo testdisk

修复分区表后,包含GRUB的Linux分区现在可能具有与之前不同的编号,因此您可能仍然会在GRUB救援提示符处结束。如果是这样,Boot Repair现在可以修复GRUB。

再次,使用您的Ubuntu Live CD,键入:

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

安装并运行它。

现在Windows可以完成升级。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1250.html,未经允许,请勿转载。