欢迎来到站长赚钱网-正规网络赚钱方法大全

MBR结构解析与fdisk的bash实现

作者:未知     来源:网络

2017-02-18 16:02:49 

一、MBR结构解析

首先我们先介绍一些MBR的基本知识基础,再晾图片分析。MBR主要分为三大块分别是:

1、加载引导程序(446K)

2、分区表(64k)

3、标志结束位(2k)

加载引导程序:内容是因机器而异它里面正如其名,就是存放加载引导程序。现在主要的加载引导程序是LILO(LInux LOader)和 GNU GRUB(GRand Unified Boot loader)。

分区表:里面主要记录4个16K主分区的信息,我们将在下文进行详细介绍。

表示结束位:就是标志MBR结束,一般是0xaa55。如果不是,则告诉机器前面的内容是不合法的。

然后我们执行下面的命令一起来看看MBR内容:

# dd if=/dev/sdb bs=512 count=1 | hexdump -C

vcHLttTTpsO/uPbH+NPytcS3ts6nyOfPwqO6PC9wPgo8cD48c3Ryb25nPrzT1NjS/bW8s8zQ8qO6o6gwMDAwMDAwMCC12jHX1r3afjAwMDAwMWIwILXaMTTX1r3ao6k8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+t9bH+LHto7qjqDAwMDAwMWIwILXaMTXX1r3afjAwMDAwMWYwtdoxNNfWvdqjqTwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz6x6ta+veHK+M67o7qjqDAwMDAwMWYwtdoxNdfWvdp+MDAwMDAxZjC12jE219a92qOpPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPteio7q0y7Smw7vT0LXaMNfWvdo8L3N0cm9uZz48L3A+Cgo8cD7TydPat9bH+LHtsPy6rcHLztLDx9Do0qq1xLTzsr+31tDFz6KjrL3Tz8LAtM7Sw8fW2LXjveLO9tK7z8K31sf4se2hozwvcD4KPHA+MDAwMDAxYjAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICBjOCA4NyBkYSA5NSAwMCAwMDgwIDAxPC9wPgo8cD4wMDAwMDFjMCAgCjAxIDAwIDA3ICBmZSAgIGZmICAgZmYgICAzZiAgMDAgIDAwIDAwIDA2IDczIDQxIDA2IDAwIGZlPC9wPgo8cD4wMDAwMDFkMCAgIGZmICAgZmYgICAwZiAgIGZlICAgZmYgICBmZiAgIDQ1IDczICA0MSAwNiBiYiA1YyAwMSAxZjAwIDAwPGJyPgo8L3A+CjxwPjAwMDAwMWUwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAwMAogMDA8L3A+CjxwPjAwMDAwMWYwICAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwNTUgYWE8YnI+CjwvcD4KPHA+yc/NvNbQo6zO0sPHzqo0uPa31sf4tcTE2sjdt9ax8LHqyc/By7K7zazR1cmroaPO0sPHzqrBy7e9seO94s72w7+49tfWts6jrNLUtdrSu7j2t9bH+M6qwP3X06GjsqLH0s6qw7+49tfWvdq31sXk0ru49sP719aho77fzOXI58/Co7o8L3A+CjxwPgo8dGFibGUgYm9yZGVyPQ=="1" width="700" cellpadding="1" cellspacing="1">8001010007feffff3f00000006734106status
f1f2f3parttype
l1l2l3lba1lba2lba3lba4s1s2s3s4

虽然看起来很多,但其实只有几类:

status:是否是可启动盘是的话就是0x80,否则就是0x00

f3+f2+f1:分区的开始位置

l3+l2+l1:分区的结束位置

s4+s3+s2+s1:分区的大小

parttype:分区类型,在fdisk中可以查看得到对应列表如下图。我这里第一个分区是07类型,也就是HPFS/NTFS的windows文件系统。第二个分区才是Linux。

/

二、fdisk验证

我们以第一个主分区为例子对某些字段进行简单的验证,下图是fdisk /dev/sdb的结果

/

Boot:第一个字节0x80说明第一个分区是可启动分区

Id:也就是parttype字段对应的值是0x07

System:根据id从fdisk的表格中得到HPFS/NTFS文件系统

Blocks:这里是s4s3s2s1=0x06417306,我们同样利用 echo "ibase=16;06417306/2" " bc 得到52476291k也刚好验证了上面的数值。

Start:这里f3f2f1=0x000101,我们利用echo “ibase=16;000101/2” | bc 得到128k。这里为什么是128k而不是上文fdisk中的1呢?主要是由于两个问题造成,第一个是fdisk的end和start中的数值是指磁盘的柱面。所以并不是简单的kB或者MB,因为根据磁盘型号不同,它每个柱面的大小容量也是不一样的。此外第二个原因是这里可能是由于磁盘的stripe造成的。(RAID卡配置--stripe size在每个磁盘上连续写入数据的总量,也称作“条带深度”。)stripe一般默认是128k。可能由于预设的原因所以不是从柱面0开始,而是从1开始。

(注:硬盘容量 =柱面数(表示每面盘面上有几条磁道,一般总数是1024) ×磁头数(表示盘面数) ×扇区数(表示每条磁道有几个扇区,一般总数是64)× 扇区(存储基本单元,大小一般为512B/4KB))

三、fdisk的bash实现

前些实习的日子,找到了一个比较优美的bash代码。是检测MBR的启动分区、分区类型、大小等信息。这些信息也就是从我们上面介绍的分区表中得到。这里把代码拿出来,虽然实用性上不强(毕竟已经有fdisk)。但是拿出来一起学习,如果有不好的地方请指正哈。



实现效果:


上一篇:如何删除带有密码的赛门铁克企业版客户端? 下一篇:微信摇一摇被举报了什么时候解封 微信被禁解封方法介绍
发表我的评论 共有条评论
    名字:
全部评论