MBR结构解析与fdisk的bash实现
一、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
要看懂上图,我们得复习一下组成原理的基本知识。(1字节=1B=8二进制位=2个十六进制位)
然后上图中,左側第一列是偏移量。因为每一行的数据是16k,所以每行偏移量0x10。
依据我们上面的介绍,载入引导程序是446k、分区表是64k、标志结束位是2k。所以正如上图黑色区域和白色区域标志一样。我们得到了相应每一个区域的范围例如以下:
载入引导程序:(00000000 第1字节~000001b0 第14字节)
分区表:(000001b0 第15字节~000001f0第14字节)
标志结束位:(000001f0第15字节~000001f0第16字节)
注:此处没有第0字节
因为分区表包涵了我们须要的大部分信息。接下来我们重点解析一下分区表。
000001b0 00 00 00 00 00 00 00 00 c8 87 da 95 00 0080 01
000001c0
01 00 07 fe ff ff 3f 00 00 00 06 73 41 06 00 fe000001d0 ff ff 0f fe ff ff 45 73 41 06 bb 5c 01 1f00 00
000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 0000
00000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 0055 aa
上图中,我们为4个分区的内容分别标上了不同颜色。
我们为了方便解析每一个字段,以第一个分区为样例。而且为每一个字节分配一个名字。具体例如以下:
80 01 01 00 07 fe ff ff 3f 00 00 00 06 73 41 06 status f1 f2 f3 parttype l1 l2 l3 lba1 lba2 lba3 lba4 s1 s2 s3 s4 尽管看起来非常多,但事实上仅仅有几类:
status:是否是可启动盘是的话就是0x80。否则就是0x00
f3+f2+f1:分区的開始位置
l3+l2+l1:分区的结束位置
s4+s3+s2+s1:分区的大小
parttype:分区类型。在fdisk中能够查看得到相应列表例如以下图。我这里第一个分区是07类型,也就是HPFS/NTFS的windows文件系统。第二个分区才是Linux。
二、fdisk验证
我们以第一个主分区为样例对某些字段进行简单的验证,下图是fdisk /dev/sdb的结果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR3J1YkxpbnV4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
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)。可是拿出来一起学习。假设有不好的地方请指正哈。
#!/bin/bash
if [ -b $1 ];then
mbr=`mktemp`
echo "Reading MBR from device $1"
dd if=$1 of=$mbr bs=512 count=1
mbr_is_temporary=1
else
mbr=$1
if [ -r "$mbr" ];then
echo "Reading MBR from file $mbr"
else
echo "Readable MBR required."
exit 1
fi
fi od -v -t x1 -An -j 510 $mbr | grep -q " 55 aa$"
if [ "$?" -ne "0" ];then
echo "MBR signature not found.Not a valid mbr."
exit 1
fi partmun=1
od -v -t x1 -An -j446 -N 64 $mbr | while read status f1 f2 f3 parttype l1 l2 l3 lba1 lba2 lba3 lba4 s1 s2 s3 s4
do
if [ "$parttpye" == "00" ];then
echo "Partition $parttpye is not defined"
else
case $status in
00) bootable="unbootable";;
80) bootable="bootable";;
*) bootable="invail";;
esac
printf "Partiton %d is type %02s and is %s." $partnum $parttype $bootable
sectors=`printf "%02s%02s%02s%02s\n" $s4 $s3 $s2 $s1 | tr '[:lower:]' '[:upper:]'`
bytes=`echo "ibase=16; $sectors / 2" | bc`
gb=`echo "scale=2; $bytes / 1000 / 1000" | bc`
printf " Size %.02f GB \n" $gb
fi
partnum=`expr $partnum + 1`
done
if [ "$smb_is_temporary" ];then
rm -f $mbr
fi实现效果:
MBR结构解析与fdisk的bash实现的更多相关文章
- iOS沙盒目录结构解析
iOS沙盒目录结构解析 原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713 出于安全考虑,iOS系统的沙盒机制规定每个应 ...
- H.264码流结构解析
from:http://wenku.baidu.com/link?url=hYQHJcAWUIS-8C7nSBbf-8lGagYGXKb5msVwQKWyXFAcPLU5gR4BKOVLrFOw4bX ...
- Oracle的rowid结构解析
SQL> select rowid,deptno from dept; ROWID DEPTNO ------------------ ---------- A ...
- EXT 结构解析
EXT Demo 结构解析 创建项目 sencha -sdk F:\lib\ext-6.0.0 generate app demo F:\demo 预览项目 执行命令 sencha app build ...
- ionic项目结构解析
ionic项目结构解析 原始结构 创建一个IonicDemo项目 'ionic start IonicDemo sidemenu' 这种结构多模块开发比较麻烦,因为view跟controller分开路 ...
- Redis源码剖析--源码结构解析
请持续关注我的个人博客:https://zcheng.ren 找工作那会儿,看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识.在面试过程中,redis确实 ...
- InfluxDB源码目录结构解析
操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 influxdata主目录结构 [root@localhost ...
- [转帖]认识固态:SSD硬盘内外结构解析
认识固态:SSD硬盘内外结构解析 来自: 中关村在线 收藏 分享 邀请 固态硬盘(Solid State Drive),简称固态盘(SSD),是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元 ...
- redis源代码结构解析
看了黄建宏老师的<Redis设计与实现>,对redis的部分实现有了一个简明的认识: 之前面试的时候被问到了这部分的内容,没有关注,好在还有时间,就把Redis的源码看了一遍. Redis ...
随机推荐
- 求1+2+...+n 【微软面试100题 第十二题】
题目要求: 要求不能使用乘除法,for/while/if/else/switch/case等关键字以及条件判断语句(A?B:C). 参考资料:剑指offer第46题 题目分析: 方法1:利用类的静态成 ...
- 带有命名空间的xml解析,C#
前一段时间做花旗的接口,返回的xml格式是带有命名空间的,可是难倒了我,找了好久才找到解决办法,给大家分享下,少走弯路. 1,直接进入正题,先看一段带有命名空间的xml,这段xml大概的意思是,前面是 ...
- 令人惊叹的sublime text 3 插件
1.ChineseLocalization------语言汉化.(新手必备) 2.SublimeTmpl------打开生成模板.(新手必备) 3.SublimeCodeIntel------代码自 ...
- day05_01 鸡汤+内容回顾
推荐电影: 1.被解救的姜戈 2.华尔街之狼 3.阿甘正传 4.辛德勒的名单 5.肖申克的救赎 6.上帝之城 7.焦土之城 8.绝美之城 打印多行 msg = "hello 1 hello ...
- [python][oldboy]关键字参数和位置参数,默认参数,可变长参数(无名,有名)
关键字参数和位置参数是在函数调用的时候定义 关键字参数是以键-值对出现,无序,多一个不行,少一个不行 位置参数,有序,多一个不行,少一个不行 混搭:所有位置参数必须在关键字参数的左边 默认参数是在函数 ...
- 静态方法,Arrays类,二维数组
一.静态方法 静态方法属于类的,可以直接使用类名.方法名()调用. 静态方法的声明 访问修饰符 static 类型 方法名(参数列表) { //方法体 } 方法的作用:一个程序分解成几个方法,有利于快 ...
- 九度oj 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)
题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~130 ...
- 【FFT】学习笔记
首先,多项式有两种表示方式,系数表示和点值表示 对于两个多项式相乘而言,用系数表示进行计算是O(n^2)的 而用点值表示进行计算是O(n)的 那么我们自然就会去想如果把系数表示的多项式转化为点值表示的 ...
- 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】
题目 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束. 落子的规则是:一个格子可以落子当且仅当这个 ...
- 刷题总结——Middle number(ssoj 优先队列)
题目: 给定一个整数序列··有两个操作: add x,表示序列中加入x mid 表示询问这个序列的中位数 原始序列数量n<=100000,操作数m<=10000 题解: 这道题可以直接用权 ...