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 fe

000001d0?? 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
00

000001f0?? 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" />

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

实现效果:

原文地址:https://www.cnblogs.com/zhchoutai/p/8650373.html

时间: 2024-09-29 17:54:58

MBR结构解析与fdisk的bash实现的相关文章

RTP协议之Header结构解析

实时传输协议 RTP,RTP 提供带有实时特性的端对端数据传输服务,传输的数据如:交互式的音频和视频.那些服务包括有效载荷类型定义,序列号,时间戳和传输监测控制.应用程序在 UDP 上运行 RTP 来使用它的多路技术和 checksum 服务.2 种协议都提供传输协议的部分功能.不过,RTP 可能被其他适当的下层网络和传输协议使用.如 果下层网络支持,RTP 支持数据使用多播分发机制转发到多个目的地. 注意 RTP 本身没有提供任何的机制来确保实时的传输或其他的服务质量保证,而是由低层的服务来完

H.264码流结构解析

大概前五六年之前写过的一个大体分析H.264格式,不是很详细,可以大致看看有哪些格式. H.264码流结构解析 那个时候上传的百度文库,以前记得有多积分,现在都不能下载了,还要充钱才可以.真是~~~ 1. H.264简介 MPEG(Moving Picture Experts Group)和VCEG(Video Coding Experts Group)已经联合开发了一个比早期研发的MPEG 和H.263性能更好的视频压缩编码标准,这就是被命名为AVC(Advanced Video Coding

android sdk api结构解析

一.系统级:android.accounts android.app     1.OS 相关         android.os         android.os.storage         android.hardware(传感器)         android.security         android.drm(这个应该是为所有app服务的)     2.VM 相关         dalvik.system         dalvik.bytecode 二.程序框架  

网易视频云:HBase – 存储文件HFile结构解析

网易视频云是网易推出的PAAS视频云服务,主要应用于在线教育.直播秀场.远程医疗.企业协作等领域.今天,网易视频云技术专家与大家分享一下:HBase – 存储文件HFile结构解析. HFile是HBase存储数据的文件组织形式,参考BigTable的SSTable和Hadoop的TFile实现.从HBase开始到现在,HFile经历了三个版本,其中V2在0.92引入,V3在0.98引入.HFileV1版本的在实际使用过程中发现它占用内存多,HFile V2版本针对此进行了优化,HFile V3

Linux内核 hlist_head/hlist_node结构解析

linux内核里面的双向循环链表和哈希链表有什么不同呢?1.双向循环链表是循环的,哈希链表不是循环的 2.双向循环链表不区分头结点和数据结点,都用list_head表示,而哈希链表区分头结点(hlist_head)和数据结点(hlist_node).与哈希链表有关的两个数据结构如下: struct hlist_head { struct hlist_node *first; //指向每一个hash桶的第一个结点的指针 }; struct hlist_node { struct hlist_nod

Erlang--etc结构解析

Erlang中可以用List表达集合数据,但是如果数据量特别大的话在List中访问元素就会变慢了;这种主要是由于List的绝大部分操作都是基于遍历完成的. Erlang的设计目标是软实时(参考:http://en.wikipedia.org/wiki/Real-time_computing),在大量数据中检索的时间不仅要快而且要求是常量.为了解决快速查 询的问题,Erlang提供的机制就是ETS(Erlang Term Storage)和DETS(Disk Erlang Term Storage

主引导扇区MBR的解析

http://blog.chinaunix.net/uid-24774106-id-3340397.html 最近排查一个USB相关的故障,由于信息安全就不多说工作上的事情了,顺路学习了MBR的相关知识,在网上找了一些资料,现在把学习心得写下来,抛砖引玉.感谢无数前辈的分享精神. 我的U盘插入linux后被识别成了sdb4,我当时很纳闷,为什么是4,没有sdb1 sdb2 sdb3,直接就sdb4 了.linux是从哪里显示的这个4.     是这样的,sdb,这个b是有linux 动态分配的,

jQuery学习之结构解析

jQuery内核解析 1.jQuery整体的结构是一个匿名函数 (function( window, undefined ) {})(window); 2.jQuery就是一个很普通的函数,也是一个很普通的对象,还是一个构造器函数 var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context ); } 3.window.jQuery相当于把jQuery作为window的一个属性,

以太网帧结构解析

由于需要做一个分析网卡接收的数据包的Project,需要了解以太网帧结构并解析,发现有很多内容从一般网络方面的知识是不够的,因此查阅了相关资料再此做一个记录以备忘. 以太网是目前最流行的有线的局域网技术,特别是上世纪九十年后发展的交换式局域网增加了有效数据速率,同时集线器和交换机等普通且便宜的硬件更助长了其普及程度.以太网的数据帧格式如下图所示: 数据字段:在交换式以太网中,一台主机向局域网中的另一台主机发送一个IP数据报,这个数据报封装在以太网帧结构中作为其有效载荷,以太网的最大传输单元(MT