当前位置: 首页>>技术教程>>正文


Grub救援 – 错误:未知的文件系统

, , ,

问题描述

我有一个多重启动系统设置。该系统有三个驱动器。多重启动配置了Windows XP,Windows 7和Ubuntu – 所有这些都在第一个驱动器上。我在驱动器上留下了很多未分区的空间,并将其保留用于添加其他操作系统以及将来存储文件。

有一天,我继续下载了分区向导,并在Windows 7中创建了一个逻辑NTFS分区,还剩下一些未分区的空间。一切正常,直到几天后重新启动计算机。

现在我得到:

error: unknown filesystem.  
grub rescue>

首先,我很惊讶没有找到任何帮助命令,尝试:

help?man--help-hbashcmd

现在我坚持使用non-bootable系统。我已经开始研究这个问题并发现人们通常建议启动Live CD并从那里解决问题。有没有办法从grub救援中解决这个问题,而不需要Live CD?

UPDATE

通过遵循Persist commands typed to GRUB rescue中的步骤,我能够启动到initramfs提示符。但不能比这更进一步。

到阅读grub rescue上的手册为止,我能够使用ls命令查看我的驱动器和分区。对于第一个硬盘驱动器,我看到以下内容:(hd0)(hd0,msdos6)(hd0,msdos5)(hd0,msdos2)(hd0,msdos1)

我现在知道(hd0,msdos6)包含Linux,因为ls (hd0,msdos6)/列出了目录。其他人会给出“错误:未知文件系统”。

更新2

在以下命令之后,我现在进入启动菜单并可以启动到Windows 7和Ubuntu,但重启后我必须重复这些步骤。

ls
ls (hd0,msdos6)/
set root=(hd0,msdos6)
ls /
set prefix=(hd0,msdos6)/boot/grub
insmod /boot/grub/linux.mod
normal

更新3

感谢Shashank Singh,根据您的指示,我简化了以下步骤。我从你那里了解到我可以用6替换msdos6,而我可以用insmod normal代替insmod /boot/grub/linux.mod。现在我只需要弄清楚如何从grub本身保存这些设置,而无需启动到任何操作系统。

set root=(hd0,6)
set prefix=(hd0,6)/boot/grub
insmod normal
normal

更新4

好吧,似乎需要启动Linux。启动到Ubuntu后,我执行了manual中描述的以下步骤:

sudo update-grub
sudo grub-install /dev/sda

这并没有解决问题。我仍然得到了grub救援提示。我需要做些什么才能永久修复它?

我还了解到,在hd0中的驱动器号需要转换为驱动器号,如/dev /sda中的某些命令。 hd1将是sdb,hd2将是sdc,依此类推。 grub中列出的分区为(hd0,msdos6)将转换为/dev /sda6。

更新5

我无法弄清楚为什么以下没有修复grub:

sudo update-grub
sudo grub-install /dev/sda

所以我根据https://help.ubuntu.com/community/Boot-Repair帖子的答案下载了boot-repair。在我选择“推荐修复(修复最常见问题)”选项后,这似乎就成了伎俩。

最佳解决方案

我无法弄清楚为什么以下没有修复grub:

sudo update-grub
sudo grub-install /dev/sda

所以我根据Persist commands typed to GRUB rescue帖子的答案下载了boot-repair。在我选择“推荐修复(修复最常见问题)”选项后,这似乎就成了伎俩。

我还使用了Grub Customizer来自定义引导条目的顺序。

次佳解决方案

这个问题有另一个原因。在这种特殊情况下,GRUB以某种方式损坏并需要修复或重新安装。但是,如Grub rescue fails with “Boot Repair” with error “unknown file system”所示,安装GRUB的根分区也可能已损坏。解决这个问题:

这是一种可能的解决方案,但不应该使用它,以免您的根分区进一步损坏。运行命令fsck -t ext4 /dev/sda1,此程序尝试搜索和修复损坏的文件系统上的错误。将sda1替换为您的实际根分区。将ext4替换为实际的文件系统;您必须知道文件系统,否则分区将更加损坏。有关更多信息,请参阅Repairing a corrupted filesystem


尽管这个问题有答案,但还有另一种方法可以解决对我有用的问题。这些步骤在痛苦的视频Grub Rescue – Guide for beginners中进行了解释。简而言之,它将完全重新安装GRUB 2而不是修复它。

因为这段视频非常难以观看,所以我将列出以下步骤(无论观看视频多么痛苦,我都应该这样做)

  1. 启动Ubuntu的实时会话。该视频使用的是现场CD,而我使用的是现场USB。我确保现场USB与我硬盘上的Ubuntu版本相同。

  2. 查找挂载根分区的位置。在视频中,用户使用Nautilus浏览已安装的每个驱动器。它装有一长串数字和字符。如果是这种情况,请按照以下步骤重新安装分区。否则,请继续执行步骤5。

  3. 使用Ctrl + Alt + T启动终端,并使用mount命令查找分区的名称。

  4. 安装分区。在媒体文件夹中创建一个新文件夹。 sudo mkdir /media/ubuntu。然后只需将分区挂载到该文件夹​​即可。 sudo mount /dev/sdxx /media/ubuntu,其中sdxxxx在步骤3中测定。

  5. 将以下目录从活动CD /USB的根目录绑定到您的Ubuntu版本的根目录。目录是dev procsys。使用以下命令执行此操作:

    sudo mount --bind /dev /media/ubuntu/dev
    sudo mount --bind /sys /media/ubuntu/sys
    sudo mount --bind /proc /media/ubuntu/proc
    
  6. 将根目录更改为Ubuntu分区上的目录。 sudo chroot /media/ubuntu/

  7. 完成上述操作后,再次安装GRUB 2会将其安装到您的Ubuntu发行版的根目录,而不是现场CD /USB的根目录。所以继续运行sudo grub-install /dev/sdx

这就是如何使用Live CD /USB修复GRUB。此方法由YouTube用户crazytechzone开发。

第三种解决方案

使用:

  1. set prefix=(hdX,Y)/boot/grub。使用先前确定的值。示例:如果Ubuntu系统位于sda5上,请输入:set prefix=(hd0,5)/boot/grub

  2. set root=(hdX,Y)。示例:set root=(hd0,5)

  3. insmod normal。尝试加载正常模块。

  4. normal

我们基本上需要GRUB才能知道/boot/grub文件夹的位置。如果这不起作用,我想从启动CD安装GRUB是一个不错的选择。

第四种方案

有趣的是,我一小时前也有同样的问题!

无论如何,这就是我所做的。

  1. 加载ubuntu:

    set root=(hd0,6)
    set prefix=(hd0,6)/boot/grub
    insmod normal
    normal
    

    因为你的ubuntu安装在6对吗?

  2. 运行终端:

    sudo -i *to access root*
    grub-install --root-directory=/mnt/ /dev/sda
    sudo update-grub
    sudo grub-install /dev/sda
    

参考资料

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