问题描述
我有一个多重启动系统设置。该系统有三个驱动器。多重启动配置了Windows XP,Windows 7和Ubuntu – 所有这些都在第一个驱动器上。我在驱动器上留下了很多未分区的空间,并将其保留用于添加其他操作系统以及将来存储文件。
有一天,我继续下载了分区向导,并在Windows 7中创建了一个逻辑NTFS分区,还剩下一些未分区的空间。一切正常,直到几天后重新启动计算机。
现在我得到:
error: unknown filesystem.
grub rescue>
首先,我很惊讶没有找到任何帮助命令,尝试:
help
,?
,man
,--help
,-h
,bash
,cmd
等
现在我坚持使用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而不是修复它。
因为这段视频非常难以观看,所以我将列出以下步骤(无论观看视频多么痛苦,我都应该这样做)
-
启动Ubuntu的实时会话。该视频使用的是现场CD,而我使用的是现场USB。我确保现场USB与我硬盘上的Ubuntu版本相同。
-
查找挂载根分区的位置。在视频中,用户使用Nautilus浏览已安装的每个驱动器。它装有一长串数字和字符。如果是这种情况,请按照以下步骤重新安装分区。否则,请继续执行步骤5。
-
使用
Ctrl
+Alt
+T
启动终端,并使用mount
命令查找分区的名称。 -
安装分区。在媒体文件夹中创建一个新文件夹。
sudo mkdir /media/ubuntu
。然后只需将分区挂载到该文件夹即可。sudo mount /dev/sdxx /media/ubuntu
,其中sdxx
的xx
在步骤3中测定。 -
将以下目录从活动CD /USB的根目录绑定到您的Ubuntu版本的根目录。目录是
dev
proc
和sys
。使用以下命令执行此操作: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开发。
第三种解决方案
使用:
-
set prefix=(hdX,Y)/boot/grub
。使用先前确定的值。示例:如果Ubuntu系统位于sda5上,请输入:set prefix=(hd0,5)/boot/grub
-
set root=(hdX,Y)
。示例:set root=(hd0,5)
-
insmod normal
。尝试加载正常模块。 -
normal
我们基本上需要GRUB才能知道/boot/grub
文件夹的位置。如果这不起作用,我想从启动CD安装GRUB是一个不错的选择。
第四种方案
有趣的是,我一小时前也有同样的问题!
无论如何,这就是我所做的。
-
加载ubuntu:
set root=(hd0,6) set prefix=(hd0,6)/boot/grub insmod normal normal
因为你的ubuntu安装在6对吗?
-
运行终端:
sudo -i *to access root* grub-install --root-directory=/mnt/ /dev/sda sudo update-grub sudo grub-install /dev/sda