Centos6启动故障之MBR破坏与修复

来源:互联网 发布:淘宝店铺模板在线制作 编辑:程序博客网 时间:2024/05/17 04:27

Centos6启动故障之MBR破坏与修复

MBR(Main Boot Record),又称为主引导记录,是位于磁盘0磁道1扇区的一段用于引导系统启动的代码。MBR占用一个扇区共512字节,其中又分为446字节的“BootLoader”、64字节的分区表,以及2字节的结束标识符。MBR不属于任何分区,不具有文件系统结构,读取MBR里面的信息对于系统启动至关重要,当MBR出现故障时,将直接导致系统无法启动。因此,懂得如何修复MBR能够快速是机器起死回生。

1 Centos6系统启动流程

为了展现出MBR对于系统启动的重要性,现将Centos6系统启动流程大致描述一下。
* POST加电自检(Power On Self Test)
当按下开机键时,CPU会自动加载固化在主板ROM里面的BIOS(Basic Input/Output System)程序,然后BIOS开始检测CPU、内存、I/O设备等设备是否存在且能正常运行。检测完成后就进行硬件设备的初始化。
* Boot Sequence(选择启动设备以加载MBR)
通常机器的启动引导方式是通过硬盘引导,但有时我们也会使用其他启动引导方式,例如光盘引导、U盘引导、甚至网络引导。在这个过程中,BIOS会根据已有或者说是默认启动引导顺序的设定,依次扫描各个引导设备,然后第一个被扫描到具有引导程序(bootloader)的设备就被作为要启动的引导设备。
* 读取MBR,加载BootLoader
在BIOS识别到引导设备后,就会读位于该磁盘0磁道1扇区的MBR里面的BootLoader信息,也即前446字节的二进制数据。MBR也是GRUB引导加载程序三个阶段的第一阶段,被称为stage1,用于加载stage1.5阶段,而stage1.5阶段位于MBR后面的空闲扇区,一占用20多个扇区,也即10多k字节大小。stage1.5包含的二进制代码用于支撑stage2所在的文件系统,也即boot分区。内核文件就在stage2阶段被载入内存。然后加载支撑根文件系统所需的相关驱动。
* 运行第一个进程/sbin/init
init程序是系统启动后运行的第一个程序,用于根据已有的配置文件初始化系统,包括网络配置、文件系统、磁盘管理、自定义模块加载、自启动服务的启动。最后执行/bin/login 登录用户。至此系统启动过程完成。

2 破坏MBR

从前面可以看出,MBR位于GRUB引导程序的第一个阶段。如果MBR出现故障,将导致后续所有流程无法进行。现在我们来模拟MBR被破坏的现象。
由于MBR直接写在磁盘的1扇区上,不属于任何分区,我们可以使用dd命令以及/dev/zero块设备将0写写入MBR扇区的前446字节,以清空MBR扇区中BootLoader信息。当然在清空BootLoader信息之前,可以先将BootLoader信息备份到文件中。尽管在生产中,我们并不能预先知道故障的发生,但是我们也是可以预先备份防患于未然。

2.1 读取MBR扇区二进制数据

BootLoader占用MBR的前446字节:

hexdump -C -n 446 /dev/sda

如图所示:

aaa

2.2 备份MBR

利用dd命令将BootLoader在磁盘上的二进制数据完全的备份至指定文件中。生成的备份文件占用空间大小也为446字节。

[root@Centos6T ~]#dd if=/dev/sda of=/app/mbr.bak bs=1 count=446446+0 records in446+0 records out446 bytes (446 B) copied, 0.00106826 s, 417 kB/s[root@Centos6T ~]#hexdump -C -n 512 /app/mbr.bak

如图所示:

aaa

2.3 破坏MBR的BootLoader信息

利用设备/dev/zero产生0序列,然后利用dd命令将0序列写入MBR前446字节,BootLoader被完全破坏

[root@Centos6T ~]#dd if=/dev/zero of=/dev/sda bs=1 count=446446+0 records in446+0 records out446 bytes (446 B) copied, 0.00132975 s, 335 kB/s[root@Centos6T ~]#hexdump -C -n 512 /dev/sda

如图所示:

aaa

3 修复MBR

现在我们使用reboot命令重启机器就会发现,系统已经无法启动,并且会直接进入光盘启动模式。如图所示:

aaa

由于原有磁盘的MBR被破坏,BIOS已无法识别磁盘上的引导信息,自然也不会将该磁盘识别为可引导设备。而此时,光盘也就成了唯一的可引导设备。故BIOS会自动选择光盘作为引导设备。
修复MBR一般有两种方式:1,将刚才备份的MBR信息重新写入磁盘的MBR扇区;2,使用grub-install命令重新安装grub。而这两种方式都需要在光盘救援模式下操作。

3.1 将备份文件写入MBR扇区

使用dd命令将MBR备份文件里面的信息写入磁盘前446字节,然后查看MBR扇区的状态

dd if=/app/mbr.bak of=/dev/sda bs=1 count=446

如图所示:

aaa

此时磁盘上BootLoader部分的数据状态如下图所示:

aaa

重启,最终能够顺利进入系统,如图所示:

aaa

aaa

3.2 重新安装GRUB

仍然是首先进入光盘救援模式,并切换根目录到原磁盘的根目录。然后使用grub-install命令重亲安装grub。注意,grub-install命令后面必须指定原boot分区所在的磁盘。

grub-install /dev/sda

如图所示:

aaa

此时磁盘上BootLoader部分的数据状态如图所示:

aaa

重启,最终能够顺利进入系统。