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

我有一个多启动系统设置。该系统有三个驱动器。多启动配置了Windows XP,Windows 7和Ubuntu - 都在第一个驱动器上。我在驱动器上留下了很多未分区的空间,并将其保留用于添加其他操作系统和将来存储文件。
有一天,我下载了Partition Wizard,并在Windows 7中创建了一个逻辑NTFS分区,但仍有一些未分区的空间剩余。一切都正常工作,直到几天后重新启动计算机。
现在我遇到了以下问题:
error: unknown filesystem.  
grub rescue>

首先,我很惊讶地发现没有任何形式的帮助命令,尝试了以下命令:help?man--help-hbashcmd等等。
现在我的系统无法启动。我已经开始研究这个问题,并发现人们通常建议使用Live CD引导并从那里修复问题。是否有办法在grub rescue中修复此问题,而不需要Live CD呢? 更新 通过按照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)/列出了目录。其他的会显示"error: unknown filesystem."

更新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后,我按照手册中描述的步骤进行了以下操作:

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

这并没有解决问题。我仍然得到grub rescue提示符。我需要做什么来永久修复它?
我还了解到,某些命令中的驱动器编号(如hd0)需要转换为驱动器字母(如/dev/sda)。hd1将变成sdb,hd2将变成sdc,依此类推。在grub中列出的分区(hd0,msdos6)将被转换为/dev/sda6。
更新5:
我无法弄清楚为什么以下操作没有修复grub:
sudo update-grub
sudo grub-install /dev/sda

所以我根据boot-repair的答案从https://help.ubuntu.com/community/Boot-Repair帖子中下载了它。选择了"Recommended Repair (repairs most frequent problems)"选项后,似乎问题得到了解决。

http://www.zdnet.com/seven-ways-to-set-up-multi-booting-with-windows-8-and-linux-7000026392 这个链接也提供了一些关于这个主题的有用信息。 - K7AAY
我遇到了类似的问题,但我的Live USB也没有用。 - Ramesh
更改启动顺序,从Windows 7恢复光盘开始,启动终端,输入"Bootrec.exe /FixMbr"(不带引号),然后重新启动解决了我的问题。 - consuela
之前的更新对我有用,但现在出现了相同的问题。即使我在 grub rescue 中尝试使用列出的文件夹,也无法工作。 我尝试使用 Ubuntu ISO 设备备份数据,但现有的 Ubuntu 没有列出。 请帮帮我,现在该怎么办? - Jaccs
6个回答

我搞不明白为什么下面的方法没能修复grub:
sudo update-grub
sudo grub-install /dev/sda

所以我根据boot-repair的答案下载了它,这是基于Persist commands typed to GRUB rescue帖子的回答。在选择了"Recommended Repair (repairs most frequent problems)"选项后,似乎问题得到了解决。
我还使用了Grub Customizer来自定义启动项的顺序。

这个方法没有生效,因为在运行最后一个命令之后,你需要再次运行sudo update-grub。在live session中,你需要将目标文件系统挂载到mnt,进入文件系统的chroot环境,然后从chroot环境中运行sudo update-grub。 - mchid

使用方法:
  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。尝试加载normal模块。
  4. normal

我们基本上需要让GRUB知道/boot/grub文件夹的位置。如果这不起作用,我想从引导光盘进行GRUB安装是一个不错的选择。


感谢您的帮助。我想我的问题可能是因为我的引导目录在/dev/sdb上,而不是/dev/sda上。但是,引导修复工具已经自动修复了它,所以我不需要再做任何操作了。 - user53817
天啊,这个对我起作用了...我成功地使用了从一台古老的Debian服务器中拯救出来的硬盘来启动一个VMware虚拟机。但是在重启后它并没有保存下来。 - undefined

这个问题可能有另外一个原因。在这种特定情况下,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,而不是修复它。
由于这个视频非常痛苦,我将在下面列出步骤(无论观看视频是否痛苦,都应该这样做)。
启动Ubuntu的实时会话。视频使用了实时CD,而我使用了实时USB。我确保实时USB上安装了与我的硬盘上相同版本的Ubuntu。
找到你的根分区被挂载的位置。在视频中,用户使用Nautilus浏览每个被挂载的驱动器。它被挂载为一长串数字和字符。如果是这种情况,请按照以下步骤重新挂载分区。否则,请继续进行第5步。
使用Ctrl + Alt + T打开终端,并使用mount命令找到分区的名称。
挂载分区。在媒体文件夹中创建一个新文件夹。sudo mkdir /media/ubuntu。然后将分区简单地挂载到该文件夹。sudo mount /dev/sdxx /media/ubuntu其中sdxx在第3步中确定。
将实时CD/USB的根目录下的以下目录绑定到你的Ubuntu版本的根目录下。这些目录是devprocsys。使用以下命令执行此操作:
sudo mount --bind /dev /media/ubuntu/dev
sudo mount --bind /sys /media/ubuntu/sys
sudo mount --bind /proc /media/ubuntu/proc

将根目录更改为你的Ubuntu分区上的根目录。sudo chroot /media/ubuntu/ 完成上述步骤后,重新安装GRUB 2将会将其安装到你的Ubuntu发行版的根目录,而不是实时CD/USB的根目录。所以继续运行sudo grub-install /dev/sdx 这就是使用Live CD/USB修复GRUB的方法。这个方法是由YouTube用户crazytechzone开发的。

在chroot之后,你会自动成为root用户,所以不需要使用sudo。只需要执行grub-install命令就足够了。 - user43326

哈哈,我一个小时前也遇到了同样的问题!
不管怎样,这是我做的。
  1. 加载Ubuntu:

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

    因为你的Ubuntu安装在6号分区对吧?

  2. 运行终端:

    sudo -i *以访问root*
    grub-install --root-directory=/mnt/ /dev/sda
    sudo update-grub
    sudo grub-install /dev/sda
    

谢谢你的回答,但在你发表回答之前,我已经使用了引导修复工具来解决我的引导问题。我现在已经更新了这篇帖子,并分享了我的解决方案。我希望我也能尝试一下你的方法。 - user53817

在Ubuntu中安装Boot-Repair
  1. 在Ubuntu的Live CD或Live USB上启动您的计算机。
  2. 选择“尝试Ubuntu”。
  3. 连接互联网。
  4. 打开一个新的终端(按下Ctrl+Alt+T),然后输入:
  5. sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update
    
  6. 按下Enter
  7. 然后输入:
  8. sudo apt-get install -y boot-repair && boot-repair
    
  9. 按下Enter
使用Boot-Repair

enter image description here

推荐修复

  1. 从以下方式之一启动 Boot-Repair:

    a. 从 Dash (屏幕左上角的 Ubuntu 标志)

    b. 或者通过 System->Administration->Boot-Repair 菜单 (仅适用于 Ubuntu 10.04)

    c. 或者在终端中输入 'boot-repair'

  2. 然后点击 "推荐修复" 按钮。修复完成后,请记下出现在纸上的 URL(paste.ubuntu.com/XXXXX),然后重新启动并检查您是否恢复了对操作系统的访问。

  3. 如果修复失败,请将 URL 提供给通过电子邮件或论坛帮助您的人员。


@penreturn 非常感谢,这个方法非常有效。 :D - Jeel Shah

另一个问题的原因是,在极少数情况下,引导驱动器上的文件系统可能会崩溃。正如其他答案中提到的那样,我最初使用ls命令在GRUB救援提示符中列出所有驱动器/分区,但是全部报告未知文件系统错误。最后,我通过以下步骤修复了Ubuntu 16.04(Xenial Xerus)上的问题:
  1. 从USB闪存启动(尝试Ubuntu而不安装)

  2. 找到引导驱动器(检查驱动器容量或对每个分区执行fsck):

    sudo fdisk -l
    
  3. 恢复文件系统:

    sudo fsck /dev/sdb1
    
  4. 在文件系统修复完毕并清理后,从引导驱动器重新启动机器。