前言
想要了解MBR和GPT就说明已经知道了其目的是要将磁盘分区,那什么是磁盘分区?为什么要磁盘分区?怎么进行磁盘分区?而MBR和GPT又是什么?两者又有什么区别?其实这都是围绕着一个目的使用磁盘,而工厂生产的硬盘必须要经过三个步骤,才能让电脑使用它们存储数据:
这里以一个巨大的住房/dev/sda的使用为例:
- 低级格式化:通常由生产厂家完成,目的是划定磁盘可供使用的扇区和磁道并标记有问题的扇区。
想要建立住房,首先要有一个毛坯房/dev/sda,将毛坯房按地面平方划分,如果最小单位是1平方米,那么一个扇区就是1平方米。而有良心的开发商会告诉你哪一块地方容易漏水漏电塌墙。 - 磁盘分区:但是硬盘不能直接使用,必须对硬盘进行分割,分割成一块一块的硬盘区域,这就是硬盘分区。
第一天,毛坯房不能直接住人,我们现在要对其进行装修,按卧室/dev/sda1、厨房间/dev/sda2、洗手间/dev/sda3、客厅/dev/sda4、备用区(剩余未划分部分用来以后其他装修),立起一道一道水泥或木板墙,将其做成一个个没有门小的隔间。
第二天,想要看看昨天划分的情形,一进房门,由于我装修除了立墙什么都没做呢,自己记性又不好,忘了哪里被划分为卧室、哪里被划分成洗手间、我要是真开始装修错了怎么办哪?总不能每次一忘就把墙全拆了,重新立吧。所以我们在自己的房门里面,房门边上的小桌子上放了一个小本子,这个小本子记录了我前一天的装修的隔间规划。这个小本子就是分区表,而这个分区表,可以用不同的小本子,比如MBR或GPT,100平的房间的我们用一个4K页小本子如MBR就行了,而一个1公顷大别墅我们可以用一个大黑板,如GPT,根据不同的需求选择不同的分区表。
第三天,我想要再增加一个运动区,用来打Dota2,那怎么办?注意剩余的备用区,我们可以将其划分一部分出来。
分出一个区就相当于装修完一个隔间。 - 高级格式化:给分区挂载文件系统。
注意,我们给毛坯房分隔间的时候,隔间是没有门的,要想使用的话至少需要一个门吧,所以挂载文件系统就相当于给一个房间一个门。实际上就是这个硬盘这个东西,放在这里,虽然我们把它划分了,即装修了,但是怎么把数据存储进去(这样说感觉像是我装修完房间,就把四周给堵上了=_=),就要开一扇门。
挂载:一个进入隔间的门,即建立一个可以被用户打开的目录。通过一个目录(门)进去,Linux可以是/home/zyx_master进入/dev/sda3(卫生间)(即我将我的一个用户的数据直接用一个分区存放,换种说法就是把/dev/sda3挂载到/home/zyx_master下)。
但是可以发现,/home/zyx_master这个目录是放在/home下的,而/home肯定是属于另一分区的。说明,目录仅仅只是一个逻辑路径,与其物理空间的存储规则不是相同关系的。
设dev/sda2挂载在/home下,/dev/sda3挂载在/home/zyx_master下,相当于,在厨房间里面开了一道通往洗手间的门,但厨房间是厨房间,洗手间是洗手间,二者是相互独立的,你不能在洗手间里吃饭,也不能在厨房间上厕所。 - 使用硬盘:在硬盘中存取数据。
在/home/zyx_master里面建立子目录以及存放数据就相当于日常在/dev/sda3这个分区中进行操作。
低级格式化不谈。
MBR(MS-DOS)概述
MBR与GPT都是磁盘分区表(partition table)的一种格式。
当前常用的一些分区格式用的都是MBR。Linux系统是为了兼容Windows的磁盘,因此使用支持Windows的MBR(Master boot Record,主引导记录)的方式来处理启动引导程序与分区表。而启动引导程序与分区表则通通放在磁盘的第一个扇区,这个扇区在旧版中用的是512字节的大小,但是当前用的一般都是1M大小,一个扇区512字节(一个扇区的大小一般是512字节和4k字节,但现在普遍是512字节)。
第一个扇区的大小是512字节大小,其内容如图所示。
主引导记录(Master Boot Record,MBR):可以安装启动引导程序的地方,有446字节,0x1BD=445,而操作系统中,都是从0开始计数的,所以要445+1=446字节。一般在操作系统安装时写入,但它并不属于操作系统。MBR就是一段引导程序,用于检测磁盘的分区合法性和加载操作系统,它的重要作用就是识别活动分区,并引导操作系统。
地址 |
描述 |
长度(字节数) |
0 |
代码区 |
440(最大446) |
440 |
选用磁盘标志 |
4 |
444 |
一般为空值 |
2 |
446 |
标准MBR分区表规划(四个16byte的主分区表入口) |
64 |
510 |
MBR有效标志:0x55AA(就是上面图中灰色的部分) |
2(MBR最后两个字节) |
(上面主引导记录的表了解就行,可能今生今世都不用遇到)
分区表(Partition Table):记录整块分区的状态,有64字节。每个分区16个字节,其内容如下表所示,因此MBR最多只能有四个分区。
偏移 |
描述 |
第1字节 |
引导标志。意思是此磁盘的分区状态,0x00表示磁盘分区未激活,0x80表示磁盘分区已激活。 |
第2字节 |
磁盘分区的起始磁头号。 |
第3、4字节 |
分区起始扇区和柱面号。低字节的低6位为扇区号,柱面号为高字节8位+低字节高2位xxxxxxxx xxxxxxxx。 |
第5字节 |
磁盘分区类型。0x00=该分区未用(即没有指定)、0x06=FAT16基本分区、0x0B=FAT32基本分区、 0x05=扩展分区、0x07=NTFS分区、0x0F=(LAB模式)扩展分区、0x83=Linux等。 |
第6字节 |
磁盘分区的结束磁头号。 |
第7、8字节 |
分区结束扇区和柱面号。低字节的低6位为扇区号,柱面号为高字节8位+低字节高2位xxxxxxxx xxxxxxxx。 |
第9、10、11、12字节 |
本磁盘已经被分区的部分已经用了的扇区数。 |
第13、14、15、16字节 |
本磁盘已经被分区的大小(总扇区数) 注意:在DOS/Windows系统下,基本分区必须以柱面为单位划分(Sectors*Heads个扇区),如对于CHS为764/255/63的硬盘,分区的尺寸大小为: 255 * 63 * 512 / 1048576 = 7.844MB。但是Linux下是以扇区为单位划分的。 |
以上就是这MBR的512个字节的内容。分区表的内容只是针对那64个字节的分区表进行设置而已。
MBR分区表内容
- 所谓的分区只是针对哪个64字节的分区表进行设置,而分区表的每一段16字节,而这16字节的第13、14、15、16字节表示总扇区数,即最大是个扇区数,而每个扇区大小是512个字节,每个分区最大。
- 硬盘默认的分区表仅能写入四组分区信息,这四个分区可以是主要(Primary)或扩展(Extended)分区。
在Linux中,对于MBR可以用命令fdisk建立分区。
答疑模块:
- 问:第一个扇区所在的分区表总共64位只能记录四组数据,如果想要划分更多分区怎么办?
答:可以利用额外的扇区来记录更多的分区信息。这就是扩展分区。 - 问:什么是扩展分区?
答:以/dev/sdb这个新硬盘为例。
磁盘按照MBR分区表格式,最多有四个分区,有主分区和扩展分区,而扩展分区最多只有一个,主分区就是一个个独立的分区假设有三个主分区/dev/sdb1、/dev/sdb2、/dev/sdb3,而用户想要继续分区:- 情形1:我只想再要一个分区,并且以后不会再考虑分区,那么我可以将第四个分区空间作为主分区,建立第四个主分区/dev/sdb4。
- 情形2:我想要再一个分区以后可能还会有其他分区,或我想再建几个分区,将第四个分区空间作为扩展(Extended)分区,建立扩展分区/dev/sdb4。
但这个扩展分区的设备名/dev/sdb4,更类似于另一磁盘,我们可以在扩展分区上建立逻辑分区,理论上可以建立无数个逻辑分区,而所有逻辑(Logistic)分区的命名是从/dev/sdb5开始。
- 问:为什么要分区?
- 安全性
如果Windows的C盘想要重新安装一次系统,可以先将C盘重要数据放到其他分区,如D盘,那么安装C盘重新安装系统并不会影响D盘。 - 系统性能
系统读取数据时,如果未分区的话,要在整个磁盘中查找数据,如果分区之后,只会在一个分区中读取。
- 安全性
- 问:扩展分区划分的逻辑分区在Linux系统中的设备文件名是什么?
答:P1:/dev/sda1、P2:/dev/sda2、L1:/dev/sda5、L2:/dev/sda6、L3:/dev/sda7、L4:/dev/sda8、L5:/dev/sda9。前四个号码都是留给主分区和扩展分区的,所以逻辑分区的设备名称号码就由5号开始。 - 问:可否将同级分区,即逻辑分区与逻辑分区合并或主分区与主分区合并?
答:可以,如下图中的逻辑分区二/dev/sdb6和逻辑分区三/dev/sdb7。只要将两个分区删除,然后再重新建立一个新的分区/dev/sdb6,就能够在不影响其他分区的情况下将两个分区的容量整合成一个。 - 问:可否将非同级分区合并,就是把主分区与逻辑分区合并?
答:不可以。如将第二主分区/dev/sdb2与逻辑分区二/dev/sdb5合并,必须要将第三扩展分区/dev/sdb3整个删除,然后根据起始扇区与结束扇区,重新建立分区。
MBR 主要分区、扩展分区与逻辑分区的特性我们对其作出定义:
- 主要分区与扩展分区最多可以有4个(硬盘分区表64字节的限制)
- 扩展分区最多只能有一个(操作系统的限制)
- 逻辑分区是由扩展分区划分出来的分区
- 能够被格式化后作为数据存储的分区是主要分区与逻辑分区,而扩展分区无法被格式化。
MBR分区表的局限性:
- 操作系统无法使用2.2TB以上的磁盘容量
- MBR仅有一个区块,即所有信息全都放在第一个扇区上,若被破坏后,经常无法或很难恢复
- MBR内存放启动引导程序的区块仅446字节,无法存储更多的程序代码。
GPT概述
因为过去一个扇区大小就死512字节而已,不过目前已经有4K的扇区设计出现。为了兼容所有的磁盘,因此在扇区的定义上面,大多会使用所谓的逻辑区块地址(Logical Block Address,LBA)来处理。GPT将磁盘所有区块以此LBA(默认为512字节)来规划,而第一个LBA称为LBA0(从0开始编号)。
与MBR仅使用第一个512字节区块记录不同,GPT使用了34个LBA区块来记录分区信息。同时与过去MBR仅有一个区块,被干掉就死光光的情况不同,GPT除了前面34个LBA之外,整个磁盘的最后34个LBA(LBA -34——LBA -1)也拿来作为另一个备份。
GTP的详细内容:
- LBA0(MBR兼容模块)
内容包括两个部分:- 存储第一阶段的启动引导程序:与之前的446字节很相似;
- 特殊标志符(标识你就是GPT):放在此兼容模块下,在原本的分区表的记录区内,用来表示此磁盘为GPT格式的意思。不懂GPT分区表的的磁盘管理程序,就不会认识这块磁盘。
- LBA1(GPT表头记录)
这个部分记录了三个部分:- 分区表的位置与大小;
- 备份用的GPT(整个磁盘的最后34个LBA(LBA -34——LBA -1)也拿来作为另一个备份)放置的位置;
- 分区表的校验码(CRC32),操作系统可以根据这个校验码来判断GPT是否正确,如果出错了,还可以通过这个记录区来获取备份的GPT来回复GPT的正常运行。
- LBA2-33(实际记录分区信息处)
从LBA2开始,每个LBA都可以记录4组分区记录,所以在默认的情况下,总共可以有4x32=128组分区记录。因为每个LBA有512字节,因此每组记录用到字节的空间。每组记录记录了两部分:- 所需的标识符和相关的记录;
- 64位记载开始/结束的扇区号码,因此GPT分区表对于单一分区来说,它的最大容量限制就会在.
Linux 内核通过udev等方式的处理,现在Linux已经没有分区限制了(但是不允许超过128个分区)。此外,GPT分区已经没有所谓的主、扩展、逻辑分区的概念。每个分区独立存在,当然每个都可以视为主要分区,每一个分区都可以拿来格式化使用。
支持GPT分区的相关Linux相关命令:gdisk,parted。
启动流程中的BIOS与UEFI启动检测程序
没有软件的硬件是没有用的,没有软件的计算机除了可以“电人”没有任何用。而为了合理分配计算机硬件资源,就有了操作系统这个系统软件的产生。
问:操作系统也是软件,那么我们的计算机是如何认识这个操作系统软件并执行它的呢?
答:这就要涉及到计算机的启动程序。目前的主机系统在加载硬件驱动方面的程序,主要有早期的BIOS与新的UEFI BIOS两种机制。
BIOS搭配MBR/GPT的启动流程
BIOS(Basic Input Output System,基本输入输出系统)是一个写入到主板上的一个固件(一个ROM芯片)(固件就是写入到硬盘上的一个软件程序)。BIOS保存着电脑最重要的部分:
- 基本输入输出的程序;
- 开机后自检程序;
- 系统自启动程序。
这个BIOS就是在启动的时候,计算机系统会主动执行的第一个程序。接下来BIOS会去分析计算机里面有哪些存储设备,BIOS会依据用户的设置去取得能够启动的硬盘,并且到该硬盘里去读取第一个扇区的MBR位置。MBR这个仅有446字节的硬盘容量里会放置基本的启动引导程序,此时BIOS就结束任务,而接下来的工作就交接给MBR内的启动引导程序。
这个启动引导程序的目的是加载内核文件,由于启动引导程序是操作系统在安装的时候所提供的,所以它会认识硬盘内的文件系统格式,因此就能够读取内核文件,接下来就是内核文件的工作,启动引导程序MBR和BIOS的工作就结束了,而接下来的工作就交接给操作系统。
计算机开机到加载MBR详细过程:
- 阶段一:开机
按下电源开关时,电源开始向主板和其他设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态,但CPU不会马上执行指令。
当芯片组检测到电源已经开始稳定供电了,便撤销RESET信号,CPU马上从地址FFFF0H处开始执行指令,这个地址实际上在系统BIOS的地址范围内,无论是Award BIOS还是AMI BIOS,放在这里的只是一条跳转指令,跳到系统BIOS中的真正启动代码处。 - 阶段二:POST
系统BIOS的启动代码首先要进行POST(Power - On Self Test,加电后自检),POST的主要任务是检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等。
由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),系统BIOS会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。
POST结束之后就会调用其他代码来进行更完整的检测。 - 阶段三:初始化相关设备
系统BIOS将直接查找显卡的BIOS,找到后,调用显卡的初始化代码,由显卡BIOS来初始化显卡,此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过只是一闪而过。
接着,系统BIOS会查找其他设备的BIOS程序,找到之后,同样调用其内部初始化程序初始化相关设备。 - 阶段四:初始化系统BIOS
查完所有其他设备的BIOS后,系统BIOS会显示自己的启动画面,包括系统BIOS的类型、序列号和版本号等内容。 - 阶段五:检测CPU和内存
系统BIOS将检测和显示CPU的类型和工作频率,然后开始测试所有RAM,并同时在屏幕上显示内存测试的进度,可以在CMOS设置中自行决定使用简单但耗时少的测试方式,或者详细但耗时多的测试方式。 - 阶段六:检测系统标准硬件设备
内存测试通过后,系统BIOS开始检测系统中安装的标准硬件设备,包括硬盘、CD-ROM、串口、并口、软驱等,另外,绝大多数较新版的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。 - 阶段七:检测配置即插即用设备
标准设备检测完毕后,系统BIOS内部的支持即插即用的代码将开始检测和配置系统中安装的即插即用设备,每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息。 - 阶段八:清屏显示
所有硬件都已检测完毕后,多数系统BIOS都会清屏,并在屏幕上显示出一个表格,其中概括地列出了系统中安装的各种标准硬件设备,以及它们使用过的资源和一些相关工作参数。 - 阶段九:更新ESCD
接下来,系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)。
ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS中。
通常ESCD数据只在系统硬件配置发生改变之后才会更新,所以不是每次启动机器时都能看到“Update ESCD… Success”这样的信息。 - 阶段十:执行MBR
ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作,即根据用户指定的启动顺序从软盘、硬盘或光驱启动。系统BIOS将读取并执行硬盘上的启动引导程序,并将控制权交给启动引导程序。
加载MBR到加载内核的过程:
- 阶段一:系统BIOS读取硬盘(承上面阶段十)
BIOS会依据用户的设置去取得能够启动的硬盘,并到硬盘里面去读取MBR启动扇区的启动引导程序。 - 阶段二:处理分区表
MBR会搜索64B大小的分区表,找到四个主分区(可能没有四个)的活动分区,并确认其他分区都不是活动的,然后加载活动分区的第一个扇区(Bootmgr)到内存。 - 阶段三:启动引导程序
Bootmgr 寻找并读取BCD,如果有多个启动选项,会将这些启动项反映在屏幕上,由用户选择从哪个启动项启动。
MBR内的启动引导程序的目的就是加载(load)内核文件,由于启动引导程序是操作系统在安装的时候所提供的,所以它会认识硬盘内的文件系统格式,因此能够读取内核文件。
接下来就是内核文件的工作。也就是将工作交给操作系统。 - 阶段四:加载并启动操作系统
选择从Windows 7启动后,会加载C:/windows/system32/winload.exe,并开始内核的加载过程。
在这个过程中,bootmgr和BCD存放在Windows 7的保留分区里,而从winload.exe开始,就进入C盘执行内核的加载过程了。
加载GPT到加载内核的详细过程:
- 阶段一:读取启动引导程序
BIOS能够从LBA0的MBR兼容区块读取第一阶段的启动引导程序代码。- 如果磁盘管理程序能够识别GPT的话,那么使用BIOS同样可以读取到正确的操作系统内核。
- 如果磁盘管理程序不懂GPT,例如Windows XP的环境,那自然就无法读取内核文件,就无法启动操作系统。
- 阶段二:获取分区表
LBA0仅提供第一阶段的启动引导程序代码,因此如果使用类似grub的启动引导程序的话,那么就要额外划分出一个“BIOS boot”的分区,这个分区才能够防止其他开机过程所需的程序,在CentOS中,这个分区差不多2M。
计算机启动到操作系统启动之间的简单过程:
- 加载BIOS驱动:计算机启动会主动执行的固件,会认识第一个可启动的设备;
- 访问MBR:第一个可启动设备的第一个扇区内的主引导记录块,内含启动引导程序;
- 启动引导程序(boot loader):一个可读取内核文件来执行的软件;
- 内核文件:开始启动操作系统。
由上面知道,BIOS与MBR都是硬件本身会支持的功能,至于Boot loader则是操作系统安装在MBR上的一个软件。由于MBR仅有446个字节,因此这个启动引导程序是非常小而高效。
MBR启动引导程序(Boot Loader)的主要任务有下面这些:
- 提供选项:用户可以选择不同的启动选项,这也是多重引导的重要功能;
- 加载内核文件:直接执行可使用的程序区段来启动操作系统;
- 转交其他启动引导程序:将启动管理功能转交给其他启动引导程序负责。
前两点容易理解,但第三点有说法。说明计算机里面可能具有两个以上的启动引导程序。但根据上面内容可知,每一个启动引导程序放在MBR,都可以加载一个内核文件,来启动一个操作系统。
- 问:那么说明硬盘不止一个MBR吗?
答:对。硬盘是不止一个MBR,但是启动引导程序除了可以安装在MBR之外,还可以安装在每个分区的启动扇区(boot sector)。 - 问:那么说明每个分区还有各自的启动扇区?
答:对。每个分区有各自的启动扇区这个特性才能造成“多重引导”的功能。 - 问:假设你的个人计算机中只有一个硬盘,里面分成四个区,其中1、2分区分别安装了Windows和Linux,你要如何在开机的时候选择用Windows还是Linux启动?
答:正如上面所说的MBR的启动引导程序的主要任务中的第一项,MBR的启动引导程序提供两个选项:- 选项一可以直接加载Windows的内核文件来开机;
- 选项二将开机管理工作交给第二个分区的启动扇区(boot sector);
而第二个分区的启动扇区的MBR的启动引导程序启动后,里面仅有一个启动选项,因此就能够使用Linux的内核文件来启动。
- 问:为什么要安装多重引导,最好先安装Windows再安装Linux?
答:
Linux在安装的时候,你可以选择将启动引导程序安装在MBR或各别分区的启动扇区,而且Linux的启动引导程序可以手动设置选项(就是下图中的M1,M2),所以你可以在Linux的启动引导程序里面加入Windows启动的选项;
Windows在安装的时候,Windows的安装程序会主动地用自己的MBR以及自己所在分区的启动扇区覆盖掉原本的MBR以及自己所在分区的启动扇区,你没有选择的机会,而且它没有让我们选择选项的功能。
如果先安装Linux再安装Windows的话,那MBR的启动引导程序就只有Windows的选项。而不会有Linux的选项(因为原本在MBR内的Linux的启动引导程序会被Windows的MBR覆盖掉)。 - 问:如果先装Linux再装Windows,MBR只有Windows的选项,那么要重新安装一次Linux吗?
答:不用,只要用尽各种方法来处理MBR的内容即可。
UEFI BIOS搭配BIOS启动的流程
GPT与传统BIOS的不相容之处:
- GPT可以提供64位寻址,然后也能够使用较大的区块来处理启动引导程序,但是BIOS其实不懂GPT。
- 需要通过GPT提供兼容模式,才能够读写这个搭载传统BIOS的磁盘设备。
- 传统BIOS仅是16位的程序,与现阶段新的操作系统接轨方面有点弱。
因此就有了这个UEFI(Unified Extensible Firmware Interface)这个统一可扩展固件接口的产生。由于UEFI是想要取代BIOS这个固件接口,因此,也将UEFI称为UEFI BIOS。
UEFI的优势:
- UEFI由C语言编写,有机会在UEFI启动阶段就了解TCP/IP而直接上网,而不用进入操作系统。
- 使用UEFI的主机,在开机速度上要比BIOS快上许多。
- 加载UEFI驱动程序后,即启动UEFI后,系统会启动一个类似操作系统的Shell环境,用户可以在此环境中执行任意的UEFI应用程序,而且效果比MS-DOS更好。
- UEFI加入了一个安全启动(Secure Boot)功能,这个功能代表着即将启动的操作系统必须要被UEFI所验证,否则无法顺利启动。这个功能可能导致很多操作系统,包括Linux,无法顺利启动。所以有时候要在启动UEFI后要关闭这个SB功能。
UEFI的注意点:
- 与BIOS模式相比,虽然UEFI可以直接获取GPT的分区表,不过最好依旧拥有BIOS boot的分区支持(即MBR)。
- 为了与Windows兼容,并且其他第三方厂商所使用的UEFI应用程序(UEFI类似于一个低级操作系统,可以有其自己的应用程序)会占用存储空间,必须要格式化一个FAT格式的文件系统分区,大约提供512MB到1GB左右的大小,以让其他UEFI应用程序执行较为方便。