全文大部取自:http://www.programlife.net/mbr.html  http://dngood.blog.51cto.com/446195/647702(取自51cto,博主dngood)  和www.baidu.com

2012年1月28日    代码疯子

近两年MBR病毒还是不少见的,闹得比较大的有“鬼影”病毒、BMW病毒等。所以我觉得还是有必要了解一下MBR的相关知识,最好能找个样本分析下。

MBR定义

MBR全称Master Boot Record,中文叫做“主引导记录”,又叫做“主引导扇区”,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的地址为0柱面0磁道1扇区。MBR 的主要作用是检查分区状态,寻找活动分区,并将控制权交给活动分区引导记录DBR,再由分区引导程序加载操作系统。标准MBR的结构如下:

主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。MBR是由分区程序所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。
硬盘分区表占据主引导扇区的64个字节(偏移0x01BE至偏移0x01FD),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参见硬盘分区结构信息:

结束标志字0×55和0xAA是主引导扇区的最后两个字节,是检验主引导记录是否有效的标志。

度娘的是精简版:

字节偏移(16进制)
字节数
描述
00~1BD
446
引导代码
1BE~1CD
16
分区表项1
1CE~1DD
16
分区表项2
1DE~1ED
16
分区表项3
1EE~1FD
16
分区表项4
1FE~1FF
2
签名值“55AA”

查看MBR

可以使用WinHex来查看MBR,方法为:打开WinHex,然后在菜单栏选择“工具”、“打开磁盘”,在“物理驱动器”一栏选择自己的硬盘打开就可以了。同时,可以选中MBR之后,通过WinHex的“编辑”菜单下的“复制选块”、“到新文件”来保存MBR,方便反汇编。

其实MBR就是存在于主硬盘的最前头的512个字节的数据,所以也可以自己写个程序读就是了。一般的电脑就一块硬盘,所以可以使用CreateFile这个API去打开\\.\PHYSICALDRIVE0

// File: Mbr2File.c
// Author: 代码疯子
// Blog: Http://Www.ProgramLife.Net/
#include <windows.h>
#include <stdio.h>#define FIRST_HARD_DISK TEXT("\\\\.\\PHYSICALDRIVE0")
#define MBR_DATA_LENGTH 512
#define DUMP_FILE_NAME TEXT("MBR.bin")int main(int argc, char *argv)
{HANDLE hFile = INVALID_HANDLE_VALUE;BYTE pbMbr[MBR_DATA_LENGTH] = {0};DWORD dwVal = 0;BOOL bRet = FALSE;hFile = CreateFile(FIRST_HARD_DISK,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hFile == INVALID_HANDLE_VALUE){printf("Open disk failure with error code %d\n", GetLastError());return 1;}bRet = ReadFile(hFile, pbMbr, MBR_DATA_LENGTH, &dwVal, NULL);if (!bRet){printf("Read MBR failure with error code %d\n", GetLastError());CloseHandle(hFile);return 1;}CloseHandle(hFile);hFile = CreateFile(DUMP_FILE_NAME,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if (hFile == INVALID_HANDLE_VALUE){printf("Create dump file failure with error code %d\n", GetLastError());return 1;}bRet = WriteFile(hFile, pbMbr, MBR_DATA_LENGTH, &dwVal, NULL);if (!bRet){printf("Dump data to file failure with error code %d\n", GetLastError());CloseHandle(hFile);return 1;}CloseHandle(hFile);printf("Dump MBR to file succeed, press ENTER to continue...\n");getchar();return 0;
    }

上面是作者的原码,想不到linux下竟然方便得用一句dd命令就搞定^ ^  (部分情况需要sudo才行得通)

还可以使用hexer进行分析喔,是不是很方便呢?

分区表参数含义(字节)
1          活动(80)或非活动分区(00)
2 3 4            起始的磁头 01 柱面 01 扇区00值
5           分区类型符 NTFS(07)FAT32(0B)扩展(0F)
6 7 8            结束的磁头 FE 柱面 FF 扇区FF值
9 10 11 12         本分区之前已用扇区数
13 14 15 16      本分区大小

MBR与GPT分区格式(实例-创建大于2TB的分区) 2011-08-24 12:03:49
http://dngood.blog.51cto.com/446195/647702

一 关键词

MBR和2TB的限制
在使用fdisk建立分区时,我们最大只能建立2TB大小的分区,如果你的磁盘(阵列)大于2TB,只能通过划分多个分区的方法才能充分利用磁盘容量,这对于使用小于2TB分区的朋友没啥影响,但对于使用大于2TB分区(比如5TB的分区)的朋友就会遇到问题了,要突破这个限制;我们先来了解下MBR(Master Boot Record)和GPT(GUID Partition Table).

MBR
主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。

MBR是由分区程序(如Fdisk,Parted)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而能够实现多系统引导。

从主引导记录的结构可以知道,它仅仅包含一个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘(其磁盘卷标类型为MS-DOS),最多只能识别4个主要分区。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主分区(Primary partition)的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区,每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR)。
在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。
在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。
在MBR分区表中,一个分区最大的容量为2T,且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。如果硬盘太大则必须改用GPT。

GPT
全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构。它是EFI(可扩展固件接口标准)的一部分,用来替代BIOS中的主引导记录分区表。但因为MBR分区表不支持容量大于2.2TB(2.2 × 1012字节)的分区,所以也有一些BIOS系统为了支持大容量硬盘而用GPT分区表取代MBR分区表。

在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

与支持最大卷为2 TB(Terabytes)并且每个磁盘最多有4个主分区(或3个主分区,1个扩展分区和无限制的逻辑驱动器)的MBR磁盘分区的样式相比,GPT磁盘分区样式支持最大卷为18 EB(Exabytes)并且每磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少个分区,IA-64版Windows限制最多有128个分区,这也是EFI标准规定的分区表的最小尺寸)。与MBR分区的磁盘不同,至关重要的平台操作数据位于分区,而不是位于非分区或隐藏扇区。另外,GPT分区磁盘有备份分区表来提高分区数据结构的完整性。

EFI
可扩展固件接口(英文名Extensible Firmware Interface 或EFI)是一种个人电脑系统规格,用来定义操作系统与系统韧体之间的软件界面,为替代BIOS的升级方案。可扩展固件接口负责加电自检(POST)、连系操作系统以及提供连接操作系统与硬件的接口。
EFI最初由英特尔开发,现时由UEFI论坛来推广与发展。

UEFI
是由EFI1.10为基础发展起来的,它的所有者已不再是Intel,而是一个称作Unified EFI Form的国际组织,贡献者有Intel,Microsoft,AMI,等几个大厂,属于open source,目前版本为2.1。

二 创建一个大于2TB的分区

MBR 与 GPT,都是分区格式,其中MBR最大分区小于等于2TB,而GPT分区没有2TB的限制,理论最大分区18 EB!

现在我们知道了要创建一个大于2TB的分区,就不能使用MBR 格式的分区表了,而要使用GPT格式的分区表,我们最常用的fdisk 分区工具就爱莫能助了,需要使用linux 下的Parted分区工具!

测试环境为:

Dell R710  2u 服务器

cpu 2* XEON 5606

mem 16G

disk 6*1TB sas 7200rpm

raid raid level 5  perc 6i卡

rhel 6 64bit ,创建一个4TB大小分区

下面正式开始分区:

1 在使用parted 分区之前,我们先用fdisk -l 来查看下硬盘信息!

2 上边的信息我们知道 /dev/sdb 4.6TB,现在使用parted 命令,如下图。

3 进入parted 后,执行2,3,4,5,6,7,8,9,10,10,11步骤,指令下边有解释!

4 分区完成后使用print 可以看到刚才分区的信息!大小 4684GB

5 quit 用于退出parted环境,信息提示更新/etx/fstab!

6 再用fdisk -l 来查看下 sdb硬盘,现在已经有sdb1 分区了,注意system gpt!

7 parted 到这里就完成了!

下面格式化/dev/sdb1 文件系统为EXT4:

1 执行 mkfs.ext4 /dev/sdb1 一路回车即可!

更新/etc/fstab

1.使用blkid 查看分区的uuid 如下图,复制新分区/dev/sdb1的 UUID

2 将 /dev/sdb1的 UUID 添加到 /etc/fstab,/dev/sdb1 挂载在 /data 目录下!

3 至此全部完成, 下面检查一下!

mount -a 重新挂载 /etc/fstab 文件中的记录!

mount 可以发现 /dev/sdb1 已经挂载到 /data 目录下了!

df -h 发现 /data 4.2TB

三 详细介绍下Parted命令

[root@abintel ~]# parted --help
用法:parted [选项]... [设备 [命令 [参数]...]...]
将带有“参数”的命令应用于“设备”。如果没有给出“命令”,则以交互模式运行。

选项:
-h, --help                    显示此求助信息
-i, --interactive             在必要时,提示用户
-s, --script                  从不提示用户
-v, --version                 显示版本

命令:
检查 MINOR                   对文件系统进行一个简单的检查
cp [FROM-DEVICE] FROM-MINOR TO-MINOR      将文件系统复制到另一个分区
help [COMMAND]                打印通用求助信息,或关于 COMMAND 的信息
mklabel 标签类型              创建新的磁盘标签 (分区表)
mkfs MINOR 文件系统类型       在 MINOR 创建类型为“文件系统类型”的文件系统
mkpart 分区类型 [文件系统类型] 起始点 终止点      创建一个分区
mkpartfs 分区类型 文件系统类型 起始点 终止点 创建一个带有文件系统的分区
move MINOR 起始点 终止点      移动编号为 MINOR 的分区
name MINOR 名称               将编号为 MINOR 的分区命名为“名称”
print [MINOR]                 打印分区表,或者分区
quit                          退出程序
rescue 起始点 终止点          挽救临近“起始点”、“终止点”的遗失的分区
resize MINOR 起始点 终止点    改变位于编号为 MINOR 的分区中文件系统的大小
rm MINOR                      删除编号为 MINOR 的分区
select 设备                     选择要编辑的设备
set MINOR 标志 状态           改变编号为 MINOR 的分区的标志

注意

mklabel label-type 必须是一下这些类型:
* bsd
* loop (raw disk access)
* gpt
* mac
* msdos
* pc98
* sun
例:(parted) mklabel gtp 或者 (parted) mklabel msdos

mkpart(建立新分区)
格式:mkpart part-type fs-type start end  
建立一个新的分区

part-type是以下类型之一------- primary(主分区), extended(扩展分区), logical(逻辑分区)。

fs-type来指定文件系统,比如ext4 。

start和end是新分区开始和结束的具体位置。0表示起止,-1表示结尾;或者以mb表示或者GB表示!

主引導记录(MBR)相关推荐

  1. easyuefi添加linux分区,linux學習筆記(一)——使用easyBCD或easyUEFI引導從硬盤安裝Ubuntu系統...

    Table of Contents windows系統安裝ubuntu會出現引導問題,windows系統不希望有其他系統和windows系統共存.所以我們得自己作一個引導.接下來主要介紹兩種引導,ea ...

  2. A段架構師的關鍵思考技術:戰術引導戰略

    前言:架构师要与技术人员共同寻找会赢的战术,然后与管理人员协调攸关的战略资源,将会赢的战术效益极大化.简单的设计造形,就如同迷雾丛林的地图般,非常有助于让技术和管理人员理解混沌和变化的本质性规律,消除 ...

  3. MySQL序列以及生成主键编号记录

    文章目录 广告 操作MySQL常用命令 生成主键编号记录 MySQL时间类型笔记 序列的创建 MySQL中文转汉语拼音(未解决多音字,生僻字等问题) case when else end 语句 广告 ...

  4. 开机流程与主引导分区(MBR)——鸟哥私房菜

    在前篇随笔中,已经谈到了CMOS与BIOS,CMOS是记录各项硬件参数(包括系统时间.设备的I/O地址.CPU的电压和频率等)且嵌入到主板上面的存储器,BIOS是一个写入到主板上的韧体(韧体是写入到硬 ...

  5. 开机流程与主引导分区(MBR)

    由于操作系统会提供所有的硬件并且提供内核功能,因此我们的计算机就能够认识硬盘内的文件系统,并且进一步读取硬盘内的软件文件与执行该软件来完成各项软件的执行目的   问题是你有没有发现,既然操作系统也是软 ...

  6. Linux启动管理:主引导目录(MBR)结构及作用详解

    http://c.biancheng.net/view/1015.html MBR 也就是主引导记录,位于硬盘的 0 磁道.0 柱面.1 扇区中,主要记录了启动引导程序和磁盘的分区表.我们通过图 1 ...

  7. 硬盘主引导记录,分区引导记录(MBR,PBR)

    首先是主引导扇区它位于磁盘0柱面0磁头1扇区,共512字节,由主引导记录,分区表(一般讲的分区表均指主分区表)和结束标志55AA构成,前446字节为主引导记录,从447到510字节为分区表,最后两个字 ...

  8. 主引导扇区(MBR),分区表(DPT)及活动分区(DBR)

    主引导扇区:硬盘的0柱面.0磁头.1扇区(也叫主引导记录MBR),大小为512Byte. 分区表(DPT):位于主引导分区,从偏移01BEH开始到偏移01FDH结束的64字节. 活动分区DBR:DBR ...

  9. 主引导目录(MBR)结构及作用详解

    MBR 也就是主引导记录,位于硬盘的 0 磁道.0 柱面.1 扇区中,主要记录了启动引导程序和磁盘的分区表.我们通过图 1 来看看 MBR 的结构. 图 1 MBR的结构 MBR 共占用了一个扇区,也 ...

  10. LINUX鸟哥私房菜学习笔记之开机流程与主引导分区(MBR)

    ### BIOS与CMOS BIOS 是一个写入到主板上的一个韧体(韧体就是写入到硬件上的一个软件程序),BIOS是在计算机开机的时候系统主动执行的第一个程序 CMOS 是记录各项硬件参数且嵌入在主板 ...

最新文章

  1. 马上开始写 react ES6 --- 基于gulp 和 Babel 的脚手架
  2. mac 安装Android sdk以便开展appium android自动化测试
  3. 输入字符和数字 java,验证输入仅为字符串,数字仅为JAVA
  4. centos 更改mysql数据库目录位置_centos更改MySQL数据库目录位置
  5. 02 基本序列以及序列表示
  6. ImageServiceImpl加@Service注解
  7. Java LineNumberReader reset()方法及示例
  8. 电机的入门之路系列5--二相四线,四相五线,四相六线电机的区分方法
  9. 京东618期间将累计发放百亿消费券
  10. flowable 配置自定义表单_web工作流管理系统开发之四 自定义表单
  11. stm32f407zg跟ze的区别_STM32F103ZE和STM32F207ZG的芯片区别
  12. c语言中while循环语句的作用,c语言中while的用法
  13. 解决nohup.out文件过大的方法
  14. python中的可迭代是什么意思,Python中的迭代和可迭代对象
  15. OpenGL(三)——着色器
  16. java使用flex生成swf_flex动态生成矢量swf字体--java动态生成swf文件
  17. Day11(重写,多态,final,抽象类)
  18. linux ATT汇编 输出hello world
  19. 定义复数java_java定义复数的方法
  20. 第十三届 蓝桥杯 单片机设计与开发项目 省赛

热门文章

  1. python 前端素材提供
  2. 微信公众号爬虫方案分析
  3. 小甲鱼C语言1-22讲笔记(指针和数组)
  4. tm8211的i2s协议
  5. 期刊论文分析的技巧与程序
  6. INVEST模型生境质量评价之威胁源数据处理
  7. Linux下通过ODBC连接数据库
  8. EXCEL多元回归分析
  9. Matlab信号处理
  10. php 批量采集 邮箱,万能全网邮箱批量采集工具按照关键字搜索邮箱教程