linux系统启动2——MBR

MBR位于硬盘的0柱面,0磁头,1扇区,被称为主引导程序。
MBR的全称是Master Boot Record(主引导记录),MBR早在1983年IBM PC DOS 2.0中就已经提出。
MBR是位于磁盘最前边的一段引导代码。它负责磁盘操作系统对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统在对硬盘进行初始化时产生的。
MBR包含了已安装的操作系统的启动加载器和驱动器的逻辑分区信息。
linux系统启动2——MBR_第1张图片

MBR由三个部分组成,主引导记录BootLoader、硬盘分区表DPT和硬盘有效标志。
在总共512字节的主引导扇区里
第一部分是BootLoader,占446个字节,它负责从活动分区中装载并运行系统引导程序;
第二部分是Partition table区(DPT分区表),占64个字节;

第三部分是Magic number,占2个字节。

linux系统启动2——MBR_第2张图片



所谓 BootLoader(启动加载器),偏移地址00000--0x1BD,是一小段代码(如GRUB的stage1),用于加载磁盘启动分区上更大的加载器(如vmlinuz)。

如果你安装了Windows,Windows启动加载器的初始信息就放在这个区域里;

如果MBR的信息被覆盖导致Windows不能启动,你就需要使用Windows的MBR修复功能来使其恢复正常。

如果你安装了Linux,则位于MBR里的通常会是GRUB加载器。

DPT分区表偏移地址为0x1BE--0x1fd,每个分区表项长16个字节,共64字节分别对应MBR的四个主分区。

每个分区表的16个字节含义如下
00-Partition Flag-00/不可引导、80/可以引导
01~03-Start CHS-分区开始的CHS值(磁头Head,扇区Sector,柱面Cylinder)
04-Partition Bytes-分区类型-83/linux、82/SWAP、8e/LVM
05~07-End CHS-分区结束的CHS值(磁头Head,扇区Sector,柱面Cylinder)
08~11-Start LBA-相对的起始扇区号(第二个分区=第一个分区起始扇区号+第一个分区的扇区数量)

12~15-Size-该分区所拥有的扇区数量


Magic Number也就是结束标志字,偏移地址0x1FE--0x1FF的2个字节,固定为55AA,如果该标志错误系统就不能启动。

我们可以用dd命令来将/dev/sda磁盘的MBR读出并写入到/tmp/mbr文件,如下:

[root@128 ~]# dd if=/dev/sda of=/tmp/mbr-128 bs=512 count=1
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,0.000174479 秒,2.9 MB/秒
[root@130 ~]# dd if=/dev/sda of=/tmp/mbr-130 bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000160761 s, 3.2 MB/s

用hexdump打开/tmp/mbr文件,
注:-C的作用是用十六进制及ASCII的方式查看文件,并采用低/高位的方式显示

hexdump -C /tmp/mbr-128

hexdump -C /tmp/mbr-130

MBR内容的打开后共有32行,每行16个字节,共计512个字节

为了便于查看,我将内容复制到Excel中,将BootLoader的部分内容予以隐藏,结果如下图所示

linux系统启动2——MBR_第3张图片

其中128主机共分了三个区,130主机分了两个区,分区信息如下

[root@130 ~]# parted /dev/sda
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number  Start   End     Size    Type     File system  Flags
 1      1049kB  525MB   524MB   primary  ext4         boot
 2      525MB   21.5GB  20.9GB  primary               lvm
(parted)   
[root@128 ~]# fdisk -l /dev/sda 
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00000116
   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     4810751     2097152   82  Linux swap / Solaris
/dev/sda3         4810752    41943039    18566144   83  Linux
[root@128 ~]# 

下面我们来对两台主机的分区表进行详解

先将16位分区表进行区域拆分,如下图

linux系统启动2——MBR_第4张图片

192.168.254.128三个分区信息
80 20 21 0083 5e 38 2600 08 00 00 00 60 09 00   614400*512/1000/1000=315M
第一个分区是启动分区,拥有的扇区数量是614400,大小是315M,LBA寻址的起始扇区是2048

方法详解:

1、第一位是80,即可以启动

2、12~15位的Size的十六进制数值为00 60 09 00,高低位转换后为00096000,换算成十进制为614400,每个扇区大小512字节,换算成MB大小为315M

linux系统启动2——MBR_第5张图片

3、08~11位Start LBA起始扇区号十六进制数值为00 08 00 00,高低位转换后为00000800,换算成十进制为2048

linux系统启动2——MBR_第6张图片

00 5e 39 26 82 74 49 2b 00 68 09 00 00 00 40 00   4194304*512/1000/1000=2147M
第二个分区不可启动,拥有的扇区数量是4194304,大小是2147M,LBA寻址的起始扇区是2048+614400=616448
00 74 4a 2b 83 fe ff ff 00 68 49 00 00 98 36 02   37132288*512/1000/1000/1000=19G
第三个分区不可启动,拥有的扇区数量是37132288,大小是19G,LBA寻址的起始扇区是616448+4194304=4810752


192.168.254.130两个分区信息
80 20 21 00 83 dd 1e 3f 00 08 00 00 00 a0 0f 00   1024000*512/1000/1000=524M
第一个分区是启动分区,拥有的扇区数量是1024000,大小是524M,LBA寻址的起始扇区是2048
00 dd 1f 3f 8e fe ff ff 00 a8 0f 00 00 58 70 02   40916992*512/1000/1000/1000=21G
第二个分区不可启动,拥有的扇区数量是40916992,大小是21G,LBA寻址的起始扇区是2048+1024000=1026048


最后,我们来看在两种不同的硬盘寻址方式:LBA和CHS

CHS寻址模式将硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector),即所谓的CSH 3D参数 (Disk Geometry)。
磁头(Heads):每张磁片的正反两面各有一个磁头,一个磁头对应一张磁片的一个面。因此,用第几磁 头就可以表示数据在哪个磁面。
柱面(Cylinder):所有磁片中半径相同的同心磁道构成“柱面",意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面数=磁道数。
扇区(Sector):将磁道划分为若干个小的区段,就是扇区。虽然很小,但实际是一个扇子的形状,故称为扇区。每个扇区的容量为512字节。

磁头/柱面/扇区理解示意图如下

linux系统启动2——MBR_第7张图片
所以在CHS寻址模式下,BIOS寻找的是硬盘空间的物理位置,所以CHS可以理解为物理寻址。
CHS寻址的最大容量为8GB
CHS寻址方式的容量由CHS三个参数决定:
磁头数最大为255 (用 8 个二进制位存储)。从0开始编号。
柱面数最大为1023(用 10 个二进制位存储)。从0开始编号。
扇区数最大数 63(用 6个二进制位存储)。从1始编号。
所以CHS寻址方式的最大寻址范围为:
255 * 1023 * 63 * 512 / 1048576 = 7.837 GB ( 1M =1048576 Bytes )
或硬盘厂商常用的单位:
255 * 1023 * 63 * 512 / 1000000 = 8.414 GB ( 1M =1000000 Bytes )

LBA(Logical Block Addressing)逻辑块寻址模式,也叫线性寻址,在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区)。
LBA编址方式将 CHS这种三维寻址方式转变为唯一的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为线性编号,系统效率得到大大提高,避免了 烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器将这种逻辑地址转换为实际硬盘的物理地址。
LBA寻址的最大容量为2.2TB
由于MBR中DPT分区表中LBA寻址的部分只有32位(4个分区*每个分区表8位LBA寻址),因此最大仅能够支持2^32(2的32次方)个扇区,而每个扇区的数据量是512字节,于是2^32 x 512,就得出了最大支持容量,这个数值按硬盘厂商的计算方式(1000进位制)来说,大约就是2.199TB.
目前大部分主板BIOS采用的都是LBA寻址,CHS寻址很早之前就已经无人使用了,另外,在MBR分区表中CHS和LBA的地址是可以互换的,互换公式请自行百度,以本人的数学能力暂时无法理解


本文广泛参考了百度百科及以下链接内容

http://fyzx.ankang.gov.cn/Article/Class26/201408/1484.html

http://wushank.blog.51cto.com/3489095/1144637

http://diy.pconline.com.cn/329/3292501_all.html

http://blog.sina.com.cn/s/blog_4b9eab3201011p8c.html

http://www.cnblogs.com/joyzhuang/p/4126325.html



你可能感兴趣的:(linux)