Linux系统启动过程中grub故障与修复(一)

   GRUB 是引导装入器 -- 它负责装入内核并引导 Linux 系统。GRUB 可以引导多种操作系统,如Linux、 DOS、 Windows 。
   GRUB共分为三个阶段:stage1主要负责BIOS和GRUB之间的交接,载入存放于各个分区中的开机文件;stage1.5是连接stage1和stage2之间的通道,起着过渡的作用,负责识别stage2所在/boot分区的文件系统,以便进入stage2;stage2是grub的核心部分,在这个阶段完成加载内核、加载根文件系统驱动、挂载根等工作。

1 破坏grub第1阶段

这里写图片描述

如图所示,用hexdump命令查看/dev/sda的mbr,即/dev/sda的前512个字节。mbr的前446个字节保存了与启动相关的信息,即grub的第一阶段。

这里写图片描述

使用dd命令将mbr的前446个字节清0,dd命令用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换:
if=[STDIN],即输入设备或文件
of=[STDOUT] ,即输出设备或文件
bs指定每个块的大小,默认以字节为单位
count指定块的个数
skip指定跳过多少个块之后再输入
seek指定跳过多少个块之后再输出
dd if=/dev/zero of=/dev/sda bs=1 count=512表示用0设备将/dev/sda的前512个字节覆盖,即清0。
    清0后用hexdump命令确认,如上图,前446个字节已全部为0,清0后重启。

这里写图片描述

这里写图片描述

由于破坏了第一阶段需要用到的mbr前446个字节,所以系统认为硬盘已经不具备引导功能了,就不用硬盘启动了,而是直接进入到光盘启动界面。为了修复被破坏的第一阶段,需要进入光盘救援模式,即Rescue installed system。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

此步骤是在询问是否同意将系统挂载到/mnt/sysimage,选择continue即可

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

开启shell,如图所示。此时/mnt/sysimage是系统的根,进入/mnt/sysimage下就可以看到原来硬盘的根下的内容。接下来使用grub install命令进行修复。

这里写图片描述

直接执行grub install报错,是因为在救援模式的/mnt/sysimage下没有grub相关命令,需要使用chroot命令切根,切根后使用操作系统自带的grub命令进行修复。

这里写图片描述

这里写图片描述

grub install /dev/sda 开始进行修复,修复过程中可能会报错:Unknown parttition table signature 未知的分区表签名,忽略即可,不影响修复结果。
    注意:grub install命令后需跟某个硬盘,不能跟具体的分区,因为mbr在硬盘的第一个扇区,不属于任何一个分区。

这里写图片描述

如图,修复成功。修复完成后,用sync将操作同步到磁盘。

这里写图片描述

用hexdump查看mbr,可发现前446个字节已写入了新的内容。

这里写图片描述

grub install不仅能够修复第1阶段的相关内容,也可以修复第1.5阶段和第2阶段的内容,如图所示,在/boot/grub下产生了第1.5阶段和第2阶段的相关配置文件。修复完成后重启即可。

2 破坏第1.5阶段

这里写图片描述

第1.5阶段位于mbr后硬盘上的一小段空间,也不属于任何分区。同样可以使用dd命令将1.5阶段清0,为了不破坏第一阶段,需要跳过第一阶段所处的前512个字节,清0后使用hexdump命令进行确认。

然后重启,观察能否启动。 
这里写图片描述

这里写图片描述

如上图,可以发现,与破坏1阶段后的启动界面不同,刚才破坏了1阶段后,直接进入到了光盘启动界面,因为系统认为硬盘没有启动功能了,不可引导了,所以直接用光盘启动了,而这一次由于并没有破坏第一阶段,所以系统认为硬盘仍然可引导,就用硬盘进行引导,但由于1.5阶段被破坏了,所以就卡在这个地方,无法进入到2阶段。修复1.5阶段仍然需要进入到光盘救援模式,按任意键进入下面的界面。

这里写图片描述

按ESC进入Boot Menu,以进入到救援模式中。

这里写图片描述

这里写图片描述

进入救援模式的过程与第1阶段类似,此处不再赘述。
  开启shell后,使用grub命令进行修复,同样需要切根。

这里写图片描述

这里写图片描述

grub是交互式命令,输入grub后进入交互模式,使用root(hd0,0)和setup(hd0)即可完成修复。
   root(hd#,#)hd#表示boot分区所在硬盘是系统的第几块硬盘,hd即hard disk硬盘,hd0表示第一块硬盘(之前用sda表示第一块硬盘);第二个#表示boot分区在该硬盘上的第几个分区;
   setup(hd#)表示将grub安装在哪个分区上。
   注意:此操作需依赖/boot/grub下的一些文件,若没有这些文件,会导致修复失败。

这里写图片描述

修复完成后,用hexdump命令可以看到mbr后1.5阶段已不再为0,即已经写入了有效内容。

这里写图片描述

修复完成后重启即可。

原创文章,作者:以梦为马,如若转载,请注明出处:http://www.178linux.com/86167

(1)
以梦为马以梦为马
上一篇 2017-09-03 22:47
下一篇 2017-09-03 22:56

相关推荐

  • SHELL中的变量

    SHELL中的变量            运行SHELL脚本中的单个命令自然有用,但这有其自身的限制。通常你会需要在SHELL命令使用其他数据来处理信息。这可以通过变量来实现。变量允许你临时性地将信息存储在SHELL脚本中,以便和脚本中的其他命令一起使用。 1 环境变量…

    Linux干货 2017-04-16
  • Linux的哲学思想

    Linux的哲学思想 linux有个哲学的思想是一切皆文件 其中linux硬件设备也是通过文件来表示的 物理终端 物理终端指的是显示器等硬件终端设备,文件存在于 /dev/console 这个路径下 虚拟终端 虚拟终端指的是在linux命令行连接的终端,文件存在于 /dev/tty# [1,6] 这个路径下 串行终端 指的是使用计算机串行端口连接的终端设备,…

    Linux干货 2018-02-23
  • class13 shell编程(五)软件包管理(三)

    一、shell编程(五) 位置变量补充 shift (踢掉参数) shift                #! /bin/bashecho "1st arg …

    Linux干货 2016-08-24
  • shell 脚本基础作业

    1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 #!/bin/bash :<<EOF 显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 EOF Host_name=`hostna…

    Linux干货 2016-08-15
  • 用户、组及权限管理详解

    用户类别:Liunx中用户标识范围在0-65535之间; 超级用户(管理员) —— 默认为root,拥有所有权限。UID与GID值为0, 普通用户 系统用户 —— CentOS6中UID与GID值为1~499,CentOS7中UID与GID值为1~999。默认不能登录系统,存在主要是满足系统进程对文件属主的需求; 登录用户 —— CentOS6中UID与GI…

    2018-03-08
  • 正则表达式详解​

      正则表达式详解 一、概述   GREP(global search regular expression(RE) and print out theline),是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。利用这些返回值就可进行一些自动化的文本处…

    Linux干货 2015-05-11