删除 Linux 分区后 Grub Rescue 出现

删除 Linux 分区后 Grub Rescue 出现

几个月前,我曾将 Win7 电脑与 Ubuntu 12.04 双启动,但不再需要 Ubuntu,因此昨晚我使用 Windows 删除了该分区。今天早上启动电脑时,出现了一个黑屏,上面写着:

错误:未知的文件系统

进入救援模式...

grub 救援>

可用的文件系统有:

(hd0)(hd0,msdos5)(hd0,msdos4)(hd0,msdos2)(hd0,msdos1)(hd1)

我尝试在网上和其他地方查找,但系统一直提示使用 Windows 7 安装 CD 启动并选择“修复 Windows”之类的。但是,我没有安装 CD,因为我买的电脑没有附带安装 CD。

所以我想我要问的是 (1) 我如何进入 Windows 7? (2) 我如何才能让 grub rescue 不再出现? (3) 它为什么现在才出现?

答案1

你有一个严重的问题

您在继续操作时必须格外小心。

当你删除分区时,你破坏了 grub 用于配置自身的数据。这就是你进入救援模式的原因。

这不是要“摆脱” grub 救援提示,而是要修复您在未充分了解后果的情况下更改分区时对系统造成的损害。使用 Windows 实用程序执行此操作也无济于事。

将系统恢复到正确状态需要一些时间、耐心,以及我所说的细心。这是一个包含多个步骤的过程,所以请做好准备...


备份窗口

第一步是备份所有 Windows 分区。如果 Windows启动 [我知道你还不能——我们下面会讲到],Windows 有一个标准的备份程序。它可以创建一个“系统恢复盘”,即可启动的 CD/DVD。创建后,您可以使用备份创建“系统映像”,并将所有文件数据备份到分离USB 硬盘。确保启用足够的选项来创建系统映像并备份全部你的分区。

有了这两个工具,您就可以完全恢复损坏的 Windows 分区 [您还没有,但是...]。该组合可以作为 Windows 的安装磁盘,使用您拥有的最新数据重新映像所有内容。

这是关键的一步。不是在你做完这件事之前,不要试图“修复”任何东西。你已经警告


自动启动 Windows

如果你幸运的话,可能会有一种快速而简单的方法。

如果 grub.cfg 文件完整,则 grub可能一直正常工作。也就是说,启动菜单可用,但您没有按下任何键来覆盖,并且在超时期限之后,grub 执行了默认启动,即 ubuntu,并且无法找到/使​​用它。

如果您覆盖 [按任意键 - 建议按空格键],您将获得一个菜单并可以选择 Windows 启动 [通常在底部]。由于超时值较短,您可能需要非常快速地尝试多次。

如果你能做到这一点,事情就会变得很多更简单。


手动启动 Windows

如果上述方法无效...

您必须从 grub 救援提示符手动启动 Windows。您必须输入一些详细的命令。

第一步是从您提供的列表中确定要使用哪个设备。我猜是这样的(hd0,msdos1)。如果您在 ubuntu 之前安装了 windows 或 windows 是预装的,则尤其如此。

请注意,以上内容只是猜测。确切的方法是创建 gparted 的 livecd [或者可能使用您的 ubuntu livecd] 来获取具有文件系统类型的分区列表。这应该会为您提供有关正确设备的线索。

将此分区信息写在纸上以供日后参考不会有什么坏处。

但是,您可以尝试猜测一下——买者自慎。


grub 命令示例

以下是我的系统中用于链式加载到 Windows 的 grub.cfg 示例片段。这AABCC56FBCC5369B是我的系统特有的 uuid,因此请忽略它。

menuentry 'Windows 7 (loader) (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-AABCC56FBCC5369B' {
    insmod part_msdos
    insmod ntfs
    set root='hd0,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  AABCC56FBCC5369B
    else
      search --no-floppy --fs-uuid --set=root AABCC56FBCC5369B
    fi
    chainloader +1
}

需要手动输入的相关命令是:

insmod part_msdos
insmod ntfs
set root='hd0,msdos1'
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'
chainloader +1

您可能需要稍微调整一下选项。您可能insmod part_gpt需要insmod part_msdos

显而易见,您可能需要调整hd0,msdos1至其他磁盘之一。

一旦 Windows 启动了,请返回上一步并进行备份。

注意:将[最终起作用的]命令记录在纸上。您可能需要重新输入它们。

我建议忽略 Windows 执行更新的任何请求,因为当 Windows 请求重新启动时,您 [可能] 必须在此处重新输入启动命令。


修理靴子

再次,做不是尝试此操作直到您拥有 Windows 备份。

上述启动 Windows 的方法只允许 Windows 启动一次。它们确实不是修复与启动相关的任何内容。如果您关闭系统电源或重新启动,则必须重复上述启动步骤。

我不清楚删除分区时到底发生了什么。您只是将其从分区表中删除 [这意味着它所占用的空间现在被列为空闲空间],还是还将分区移到磁盘上更高的位置以占用旧分区的空间 [可以这样gparted做]?

如果你能够使用自动的上面的启动过程,您可以简单地编辑/boot/grub2/grub.cfg并更改set default="0"为指向 Windows 启动 [菜单条目从 0 开始编号]。这可以从 ubuntu livecd 完成。您将获得一个 shell,并且您的硬盘驱动器应该 [或可以] 交叉安装在 [例如]/mnt/sysimage/...

如果你必须启动手动,您可能能够启动 ubuntu livecd、获取 shell 并grub2-install在交叉安装的硬盘上运行。您可能需要使用其他grub2-*实用程序。为此,您确实应该查阅详细的 grub2 文档。而且,对于您来说,我不一定推荐这样做。

更简单、更轻松的方法可能是使用 ubuntu livecd 重新安装 ubuntu [暂时]。这将处理 grub 重新安装。然后,您可以像以前一样从硬盘启动 ubuntu,然后进行编辑/boot/grub2/grub.cfg以更改默认值。

如果在删除分区时,你做了“移动”,则可能需要撤消该操作。不要在 Windows 下执行此操作(或任何此类操作,在我看来)。使用gparted


/boot 分区

在某些系统/发行版中,通常/boot位于约 2GB 左右的自己的小分区中。这是标准(并且在我看来是推荐的)方式。

因为你得到了 grub 救援提示,所以你很可能遇到了这种情况。这是最简单的方法。

可能性较小,但仍有可能(特别是如果您覆盖了默认值),/boot可能只是根分区下的一个目录。但如果是这种情况,我认为 grub 根本不会出现——YMMV

使用一个小的独立/boot分区,您可以再次缩小/删除较大的 ubuntu 分区,但要使用可靠的工具,例如gparted。有关详细信息,请参见下文。


恢复启动 [替代]

如果您足够幸运拥有小/boot分区,我建议保留 grub 作为引导加载程序,即使它只能启动 Windows。

由于只有较大的根分区,您可能希望恢复 Windows 启动。我不是根据您当前的系统状态向您推荐此项。

可能存在基于 Windows 的方法来实现这一点,从启动的 Windows 上看应该很容易。但是,我会先修复 grub 启动,因为 Windows 喜欢在此类操作期间重新启动。

如何让 Windows 做到这一点超出了我的专业知识。

如果你从较大的根分区运行 grub,你可以删除大多数文件不是/boot

之后,使用gparted,您可以缩小根分区。 gparted足够智能,能够更改所有文件系统索引块等以保持完整性。 它还将调整分区表。

这将为您提供可用空间,并gparted可以使用可用空间创建另一个分区,您可以将其用作 Windows(例如)D:驱动器

答案2

如果您有大约 16GB 的可用未分配空间,或者有大约该大小或更大的未使用分区,您可以格式化(可以删除其内容),也可以使用比该大小小一点的空间,那么这个答案适合您。

我删除了 ubuntu 分区,因为我需要 windows 分区上的更多空间;我Create and format hard disk partitions在 windows 中使用它完成了此操作 - 只需单击开始菜单并输入部分;为避免出现问题,只能从 windows 中调整 windows 分区的大小;所以我调整了 windows 分区的大小,多留了几 GB;

幸好我没有把删除ubuntu分区后剩下的可用空间全部给windows;

因此当我收到 grub 救援错误时,在下次重启时,lssetgrub 命令起作用了,但其他几个命令如chainloaderinitrdnormal不起作用;问题是虽然我确实关机了,但 windows 会尝试变得更聪明,猜测你的想法并无论如何都要进入休眠状态,以便下次启动更快;所以磁盘处于“脏”不一致状态,因此无法挂载,除非处于只读模式,这种模式不允许修复任何东西,即使使用实时 ubuntu usb 驱动器,因此,无法从实时 ubuntu 修复/重新安装 grub;这当然也意味着 windows 不能从 grub 启动;当然,os-prober来自 linux 的命令也无法在这种状态下找到 windows 系统,但这并不重要;

就我而言,由于我有可用空间,因此我使用 ubuntu live usb 安装程序从 linux 创建了一个分区 - 而无需触及 windows 分区 - 还为 grub 创建了一个新的 EFI 分区,并将其大小调整为 128MB,然后使用 live usb 安装程序将 ubuntu 安装到新分区中;它安装得很好 - 但最后却无法安装 grub - 因为 windows 处于休眠/脏状态

因此,我使用了实时 ubuntu usb 并boot-repair在终端上进行如下安装(ctrl+alt+t在 ubuntu 中打开终端)(这仅安装在内存中,而不是磁盘上,因为它是实时 ubuntu usb,因此如果重新启动,则需要重做以下步骤):

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

然后我运行boot-repair并选择第一个选项:

sudo boot-repair

这显示了输入的命令以删除旧的 grub 并在EFI上面创建的分区中安装新的 grub;然后就可以在新安装的 ubuntu 中启动,使用新的 EFI 分区中的新 grub;

然后在 ubuntu 的终端提示符下输入

sudo update-grub

现在 Windows 也添加到grub菜单中,一切又恢复正常,下次重启后,就可以在 grub 菜单中同时选择 ubuntu 和 Windows

显然,要关闭没有肮脏休眠的 Windows,需要在 Windows 命令提示符下键入

shutdown /s

相关内容