Windows 10 升级导致 grub 救援

LCh*_*os2 80 boot grub2 dual-boot grubrescue windows-10

我在我的桌面上双启动 Windows 7 和 Linux Ubuntu,今天是他们免费升级 Windows 10 的日子。多么激动人心!我得到了更新,它正在安装,然后我离开去小睡 30 分钟。然而,当我回到我的电脑时,它把我带到了 grub 救援提示。

error: no such partition.
Entering rescue mode...
grub rescue>
Run Code Online (Sandbox Code Playgroud)

当我输入时,我得到以下信息ls

grub rescue> ls
(hd0) (hd0,msdos5) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1)
Run Code Online (Sandbox Code Playgroud)

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

grub rescue> set
cmdpath=(hd0)
prefix=(hd0,msdos6)/boot/grub
root=hd0,msdos6
Run Code Online (Sandbox Code Playgroud)

在发现某些命令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
Run Code Online (Sandbox Code Playgroud)

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

我想了想,确定 sda2 包含我的 Windows 系统(因为我记得我的 C: 驱动器有大约 700 GB 的空间)。想了想之后,我记得在安装 Ubuntu 时将大约 200 GB 的硬盘空间分配给与 Ubuntu 相关的东西。我不完全记得是哪个,但我认为它基本上是 Ubuntu“硬盘空间”,并且其中没有任何引导文件。我为 linux 分配了另外两个东西,但它们的大小非常小(尚未突破 1 GB 标记)。

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

nob*_*ody 69

我的电脑预装了 Windows 8,所以我缩小了 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)/
Run Code Online (Sandbox Code Playgroud)

等等。

然后输入set相同的提示。它将显示 GRUB 查找其文件的位置。就我而言,(hd0,gpt6) 已移至 (hd0,gpt7)。设置命令显示:

prefix=(hd0,gpt6)/boot/grub
root=hd0,gpt6
Run Code Online (Sandbox Code Playgroud)

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

set prefix=(hd0,gpt7)/boot/grub
Run Code Online (Sandbox Code Playgroud)

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

insmod normal
normal
Run Code Online (Sandbox Code Playgroud)

还可以通过以下方式修复root设置:

set root=(hd0,gpt7)
Run Code Online (Sandbox Code Playgroud)

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

当 Windows 完成时,我开始解决 GRUB 问题。按e编辑 Ubuntu 的启动选项。我全部更改(hd0,gpt6)(hd0,gpt7)Ubuntu 启动。

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

然后我纠正了/boot/grub/grub.cfg文件,其中我换成(hd0,gpt6)(hd0,gpt7)和执行:

sudo grub-install
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为来自 `ls` 命令的所有条目尝试了 `ls (hd0,msdos1)/ ls (hd0,msdos1)/boot ls (hd0,msdos2)/ etc.`,每次出现 `error: unkown filesystem` . (11认同)
  • 当 Win 10 决定自行升级并弄乱启动记录时,这个解决方案对我来说非常有效(我从 7 升级到 10 顺利进行) (3认同)
  • 这对我来说是一个很好的答案。我没有 Ubuntu 光盘并且正在将我的 Windows 从 8.1 升级到 10 并且遇到了同样的问题。所以这个答案得到了我的额外信任,因为我能够输入它并继续直到更新完成。谢谢你救了我的培根。 (2认同)
  • 谢谢,这有帮助。我不清楚的一件事(因为我是 Ubuntu 和 Grub 的新手)是在启动到 Ubuntu 后需要编辑 grub 配置(而不是在迷你 Emacs 中,它不支持保存显然是文件。)所以我启动,然后编辑配置`sudo nano /boot/grub/grub.cfg`然后运行`sudo grub-install /dev/sda`(出于某种原因,没有参数的调用对我来说失败了)。只有这样,永久性的变化才会奏效。 (2认同)

小智 13

与 linux 一起安装 Windows(或升级它)可能会出现问题。

试试这个:https : //help.ubuntu.com/community/Boot-Repair



安装 Windows 10 技术预览版后,我用它来解决一个问题,它奏效了。基本上,它所做的是重新安装 grub 以适用于所有当前安装的操作系统。确保告诉它安装 grub 到你的 linux 分区 (sd#)。

祝你好运!


old*_*red 10

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

sudo sfdisk -d /dev/sda > parts.txt
Run Code Online (Sandbox Code Playgroud)

您丢失的分区位于此处或在 1547 处的扩展分区开始...与 1915 处显示的第一个分区之间...:

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

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

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

另一个恢复工具是 parted 救援。它使用扇区​​,但您提供的范围必须刚好在丢失的分区之外,与当前分区没有重叠。最好知道确切的开始和结束。看到男人分手了

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

使用 parted 救援的用户:

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

  • 我遇到了完全相同的问题,并且 parted 在有 Linux 的地方显示“可用空间”。使用 from/to of the "free space" 运行救援,ext4 又回来了! (3认同)
  • 只是想插嘴说 gparted 显示了 ext4 以前的可用空间。Ran 分开,设置为扇区,打印分区,使用“可用空间”的 from/to 进行救援(不要忘记为扇区添加 s 到您的值)并且 ext4 又回来了,与 @speedogoo 完全相同。根本不需要摆弄grub。 (3认同)
  • 由于丢失分区的人越来越多,Windows 10 对分区表做了什么?就我而言,ext4 位于逻辑分区中。 (2认同)

Mar*_*ton 7

这是Windows 分区程序中的一个令人讨厌的错误,而不是 Linux 特有的。就我而言,它具有讽刺意味的是删除了一个 NTFS 分区。

如果 Windows 启动分区太小而无法包含 Windows 10 恢复环境,Windows 10 安装程序会/dev/sda3在主 Windows 分区的末尾创建一个新分区(您的)。sda2sda1

当它为此重写分区表时,对于扩展分区表中的每个逻辑分区sda4,如果它位于前一个分区号之前的磁盘上,则放弃。

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

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

Windows 不会覆盖它删除的分区的内容,因此如果您能找到它们的位置,则可以恢复它们。在我的情况下,我有分区表的备份,但是按照oldfred 的回答中的解释使用testdisk很有可能找到它们。 分区救援将很难使用,因为在您的情况下删除了多个分区。

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

修复分区表后,包含 GRUB 的 Linux 分区现在可能具有与之前不同的编号,因此您可能仍会以 GRUB 救援提示结束。如果是这样,引导修复现在将能够修复 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
Run Code Online (Sandbox Code Playgroud)

安装并运行它。

现在 Windows 可以完成它的升级。