我接下要说的只适应于MBR分区,如果是GPT分区的请略过。
大家都知道MBR分区的0扇区0磁道是有特殊的功用;
前446个字节是启动的引导记录,后64个字节为磁盘的分区记录,最后的2个字节为磁盘结束的标志位55aa。
那意味着我破坏了后64个字节那系统引导完就找不到分区了,直接导致无法启动系统,那我们来搞破坏吧;
下面就是0磁道0扇区的512个字节;
[root@CentOS_7 script]# hexdump -C /dev/sda -n 512 00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............| #省略 00000160 61 ff 26 5a 7c be 80 7d eb 03 be 8f 7d e8 34 00 |a.&Z|..}....}.4.| 00000170 be 94 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 |..}.......GRUB .| 00000180 47 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 |Geom.Hard Disk.R| 00000190 65 61 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 |ead. Error......| 000001a0 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 |.....<.u........| 000001b0 00 00 00 00 00 00 00 00 f6 4a 00 00 00 00 80 20 |.........J..... | 000001c0 21 00 83 35 70 05 00 08 00 00 00 00 40 00 00 35 |!..5p.......@..5| 000001d0 71 05 83 fe ff ff 00 08 40 00 00 00 c0 03 00 fe |q.......@.......| 000001e0 ff ff 82 fe ff ff 00 08 00 04 00 00 00 01 00 fe |................| 000001f0 ff ff 05 fe ff ff 00 08 00 05 00 f8 3f 01 55 aa |............?.U.| 00000200
红色80开始就表示分区表,80开头表示活动分区的意思,00是非活动,先备份一下分区表先;
[root@CentOS_7 script]# dd if=/dev/sda of=/data/mbr bs=1 count=66 skip=446 66+0 records in 66+0 records out 66 bytes (66 B) copied, 0.000410346 s, 161 kB/s
查看一下分区表是否备份成功,一定要记得把分区表拷到别外的系统当中来。
[root@CentOS_7 script]# hexdump -C /data/mbr 00000000 80 20 21 00 83 35 70 05 00 08 00 00 00 00 40 00 |. !..5p.......@.| 00000010 00 35 71 05 83 fe ff ff 00 08 40 00 00 00 c0 03 |.5q.......@.....| 00000020 00 fe ff ff 82 fe ff ff 00 08 00 04 00 00 00 01 |................| 00000030 00 fe ff ff 05 fe ff ff 00 08 00 05 00 f8 3f 01 |..............?.| 00000040 55 aa |U.| 00000042
备份已成功,内容与上面的一致;
下面的意思是从/dev/zero中读取66个字节写入到/dev/sda当中,在写入的过程中跳过446个字符;
[root@CentOS_7 script]# dd if=/dev/zero of=/dev/sda bs=1 count=66 seek=446 66+0 records in 66+0 records out 66 bytes (66 B) copied, 0.000251386 s, 263 kB/s
这时分区已死,再次查看已看不到分区表了;
[root@CentOS_7 script]# hexdump -C /dev/sda -n 512 00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............| #省略 00000160 61 ff 26 5a 7c be 80 7d eb 03 be 8f 7d e8 34 00 |a.&Z|..}....}.4.| 00000170 be 94 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 |..}.......GRUB .| 00000180 47 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 |Geom.Hard Disk.R| 00000190 65 61 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 |ead. Error......| 000001a0 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 |.....<.u........| 000001b0 00 00 00 00 00 00 00 00 f6 4a 00 00 00 00 00 00 |.........J......| 000001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000200
可以看到在最后的66个字节全部都不一样了,但是因为分区表现在已经加载至内存当中。需要重启破坏才能生效;
重启后可以看下已经找不到硬盘了;
这时用光盘启动,进入救援模式,这时会加载一个小型的linux系统。就跟windows加载了一个PE一样;
这时会出现情形:
1.进出系统里配置地址,把原来备份的文件传送到系统当中来。用dd命重新写入;
2.无法启动网络服务,我遇到了这一种情况。我着重说下这个。
在备份机器上用hexedit 打开t备份好的mbr,在分区丢失的机器打开一个mbr,对照着原来的分区表把分区的16进制代码一个个写入。最后用hexdump -C 文件来查看是否写之前的一致;#hexedit是编辑16进制的一个工具,如果没有的需要安装;
最后用dd if=mbr of=/dev/sda bs=1 seek=446 这样子把分区表还原回去。
最后重启系统ok。