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,即已经写入了有效内容。
修复完成后重启即可。