use*_*817 66 boot grub2 dual-boot
我设置了多引导系统。该系统具有三个驱动器。Multiboot 配置了 Windows XP、Windows 7 和 Ubuntu - 所有这些都在第一个驱动器上。我在驱动器上留下了很多未分区的空间,并将其保留以用于添加其他操作系统和将来在那里存储文件。
有一天,我继续下载了分区向导,并从 Windows 7 中创建了一个逻辑 NTFS 分区,但仍有一些未分区的空间。一切正常,直到几天后我重新启动了计算机。
现在我得到:
error: unknown filesystem.
grub rescue>
Run Code Online (Sandbox Code Playgroud)
首先,通过尝试,我很惊讶没有找到任何类型的帮助命令:
help,?,man,--help,-h,bash,cmd,等。
现在我被无法启动的系统困住了。我已经开始研究这个问题,发现人们通常建议引导到 Live CD 并从那里解决问题。有没有办法在不需要 Live CD 的情况下从 grub 救援中解决这个问题?
更新
按照输入到 GRUB 救援的 Persist 命令的步骤,我能够启动到 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
Run Code Online (Sandbox Code Playgroud)
更新 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
Run Code Online (Sandbox Code Playgroud)
更新 4
好吧,似乎需要引导到 Linux。启动到 Ubuntu 后,我执行了手册中描述的以下步骤:
sudo update-grub
sudo grub-install /dev/sda
Run Code Online (Sandbox Code Playgroud)
这并没有解决问题。我仍然收到 grub 救援提示。我需要做什么才能永久修复它?
我还了解到,对于某些命令,需要将 hd0 中的驱动器号转换为 /dev/sda 中的驱动器号。hd1 将是 sdb,hd2 将是 sdc,依此类推。在 grub 中列为 (hd0,msdos6) 的分区将被转换为 /dev/sda6。
更新 5
我无法弄清楚为什么以下内容没有修复 grub:
sudo update-grub
sudo grub-install /dev/sda
Run Code Online (Sandbox Code Playgroud)
因此,我根据https://help.ubuntu.com/community/Boot-Repair帖子中的答案下载了boot-repair。在我选择了“推荐的修复(修复最常见的问题)”选项后,这似乎可以解决问题。
use*_*817 26
我无法弄清楚为什么以下内容没有修复 grub:
sudo update-grub
sudo grub-install /dev/sda
Run Code Online (Sandbox Code Playgroud)
所以我根据输入到 GRUB 救援帖子的Persist 命令的答案下载了引导修复。在我选择了“推荐的修复(修复最常见的问题)”选项后,这似乎可以解决问题。
我还使用Grub Customizer 自定义引导条目的顺序。
用:
set prefix=(hdX,Y)/boot/grub. 使用之前确定的值。 set prefix=(hd0,5)/boot/grubset root=(hdX,Y). 例子:set root=(hd0,5)insmod normal. 尝试加载正常模块。normal我们基本上需要 GRUB 才能知道/boot/grub文件夹在哪里。如果这不起作用,我想从引导 CD 进行 GRUB 安装是一个不错的选择。
此问题还有另一个原因。在这种特殊情况下,GRUB 以某种方式损坏,需要修复或重新安装。但是,如Grub 救援失败并显示“引导修复”并出现错误“未知文件系统”中所示,安装 GRUB 的根分区也可能已损坏。要解决此问题:
这是一个可能的解决方案,但不应该使用它,以免您的根分区进一步损坏。运行该命令fsck -t ext4 /dev/sda1,该程序会尝试在损坏的文件系统上搜索和修复错误。将 sda1 替换为您的实际根分区。用实际的文件系统替换 ext4;你必须知道文件系统,否则分区会更损坏。有关更多信息,请参阅修复损坏的文件系统。
尽管这个问题有答案,但有一种替代方法可以解决对我有用的问题。这些步骤在面向初学者的痛苦视频Grub Rescue-Guide 中进行了解释。简而言之,它将完全重新安装 GRUB 2 而不是修复它。
因为这个视频看得太痛苦了,我会列出下面的步骤(不管看视频有多痛苦,我都应该这样做)
mount命令查找分区的名称。sudo mkdir /media/ubuntu. 然后只需将您的分区挂载到该文件夹。sudo mount /dev/sdxx /media/ubuntu其中xxofsdxx在步骤 3 中确定。将 Live 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
Run Code Online (Sandbox Code Playgroud)将根目录更改为 Ubuntu 分区上的目录。 sudo chroot /media/ubuntu/
sudo grub-install /dev/sdx这就是如何使用 live CD/USB 修复 GRUB。这个方法是由 YouTube 用户 crazytechzone 开发的。