grub rescue> 终端模式修复方法

解决分区发生变化时grub引导问题

Posted by JenI on 2016-10-21 00:00:00+08:00

前言

由于之前电脑系统都是自己分区自己装的,所以并没有单独给windows系统预留出winRE分区,毕竟这个实在不太常用,系统出了问题还不如进PE来的实在.结果这次微软推送windows 10一周年更新,果然毫不犹豫的从最后一个ntfs分区内强行分了一个winRE分区出来,这对windows倒是没什么影响,但这多出来的一个分区改变了我原本硬盘的分区方式,原来的分区号都向后推了一位,第8个分区变成了第9个分区,导致我的另一个系统引导出现错误,引导软件找不到linux的根目录.

/dev/sda4         346904576    348596223     1691648     826M Windows 恢复环境
/dev/sda7        1607491584   1674600447    67108864      32G Linux root (x86-64)
/dev/sda8        1674600448   1682989055     8388608       4G Linux swap
/dev/sda9        1682989056   1953525134   270536079     129G Linux home

对于这种情况,不同的引导软件有不同的修复方式

systemd-boot(针对arch)

开机调u盘启动,进入livecd,挂载分区,并chroot到硬盘系统

mount /dev/sda7 /mnt
mount /dev/sda1 /mnt/boot
arch-chroot /mnt /bin/bash

修改/boot/loader/entries/arch.conf为

title      Arch Linux
linux      /vmlinuz-linux
initrd     /initramfs-linux.img
options      root=/dev/sda7 rw    #原来是sda6,现在改为sda7

其中/dev/sda7也可以改为第7快硬盘的UUID,reboot重启即可进入

syslinux

依然是u启进livecd,挂分区,chroot,然后修改/boot/syslinux/syslinux.cfg

LABEL arch
    MENU LABEL Arch Linux
    LINUX ../vmlinuz-linux
    APPEND root=/dev/sdb7 rw
    INITRD ../initramfs-linux.img

LABEL archfallback MENU LABEL Arch Linux Fallback LINUX ../vmlinuz-linux APPEND root=/dev/sdb7 rw INITRD ../initramfs-linux-fallback.img

修改完重启

grub

接下来就是本篇博文的关键内容了,因为现在大部分Linux发行版本默认以grub作为引导软件,所以着重记录一下grub下引导问题的修复问题

当开机系统找不到grub路径或grub的配置文件出现问题时,会自动进入grub救援模式,也就是屏幕会出现下列信息

error: file '/boot/grub/i386-pc/normal.mod' not found.
Entering rescue mode...
grub rescue>

此时的救援模式并非平时使用的shell终端,在这里可以执行的命令很有限,仅有

set,ls,insmod,root,prefix等

首先使用ls命令,该命令会列出所有的磁盘信息

grub rescue>ls
 (hd0),(hd0,msdos4),(hd0,msdos2),(hd0,msdos9),(hd0,msdos7),(hd0,msdos5),(hd0,msdos3),(hd0,msdos1),(hd0,msdos8),(hd0,msdos6)

依次替换msdos1位置的数字以查看每个磁盘下的文件,当显示文件则说明linux安装在这个分区

grub rescue>ls(hd0,msdos1)/boot/grub

假设linux系统被装在了(hd0,msdos7)上,使用下列命令找回丢失的grub菜单

grub rescue>set root=(hd0,msdos7)
grub rescue>set prefix=(hd0,msdos7)/boot/grub
grub rescue>insmod /boot/grub/normal.mod

使用以下命令显示grub菜单

grub rescue>normal

这时应该就进入grub菜单项了,选中linux系统,摁e键临时编辑grub配置文件,我以kali为例

grub

将上图中(hd0,msdos1)替换为自己的linux所在分区(hd0,msdos7),然后ctrl+x就可以进入系统了,但这只是临时的,当电脑重启,问题依然存在,所以要重新安装grub并修改配置文件

sudo update-grub
grub-install --target=i386-pc /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

这样问题就解决了,当然,具体到不同的环境修复方法或多或少会有些不同,但基本命令熟悉了之后再遇到这种问题随机应变就可以了


作者:   JenI   转载请注明出处,谢谢


Comments !