- 计算机硬件组成之存储设备
- 磁盘链接方式与设备文件名
- MBR(MS-DOS)与GPT磁盘分区表(partition table)
- 启动流程中的BIOS与UEFI(启动检测程序)
- Linux安装模式下磁盘分区的选择
一、计算机硬件组成之存储设备
关于计算机硬件组成中的存储设备这里只是为了更好的理解Linux文件系统做一些必要的介绍,主要围绕Linux文件系统管理来展开,而不会涉及存储设备硬件的物理特性原理和指令集这些计算机组成原理内容,但不排除会出现一些相关的描述,但这些内容不会怎么影响对Linux文件系统的软件部分的理解,如果对相关内容有兴趣可以自行查阅资料。
在计算机存储设备中又分为主存和辅存,而这里要了解的辅存:磁盘在Linux文件系统层面的相关内容。主存包括寄存器、缓存、内存,它们需要在通电环境下才能实现数据的存储。而辅存属于持久化的存储设备,通过设备的物理特性存储数据,它们一般有磁盘、磁带等,这里我们需要了解的是磁盘,磁盘是由多个圆形碟片、机械手臂、磁头与主轴马达组成。
碟片上的数据通过机器手臂移动磁头和碟片转动配合实现数据读写,由于这种转动读写数据的方式在碟片上画出很多个同心圆,然后在这些圆上面切出一个个小区块让机械手臂上的磁头去读写。每一个小区块就是磁盘的最小物理存储单元称为扇区(sector),同一个同心圆的扇区组合成的圆就是磁道(track),由于磁盘里可能会有多个碟片,因此所有碟片上面的同一个圆组合成所谓的柱面(cylinder)。由于同心圆的外圈圆比内圈圆大,所以为了合理利用这些空间,在外圈圆磁道上扇区比内圈圆扇区多,所以碟片转一圈读写的数据量比内圈多,因此通常数据读写会由外圈往内圈写。
二、磁盘链接方式与设备文件名
正常情况下物理机器大概使用的都是/dev/sd[a-p]的磁盘文件名,至于虚拟机环境中,为了加速,可能会使用/dev/vd[a-p]这种设备文件名。假设当前你的虚拟机中,仅有一个virtio接口的磁盘,那么它对应在Linux操作系统中文件名应该是/dev/vda。
由于SATA、USB、SAS等磁盘接口都是使用SCSI模块来驱动的,因此磁盘的文件名都是/dev/sd[a-p]的格式,这时候要根据Linux内核检测到磁盘的顺序来命名,一般会先检测主板上的SATA插槽(SAS接口一般在以前的大型机上),按照接入插槽顺序对应命名,然后接着将将USB接口的磁盘按照顺序往后命名,比如现在主板上有六个SATA插槽,现在有两个磁盘分别插入主板的SATA1、SATA5插槽上,还有一个USB磁盘,这时候它们的文件名应该分别是:
SATA1插槽上的文件名:/dev/sda SATA5插槽上的文件名:/dev/sdb USB磁盘(系统启动完成后才被系统识别):/dev/sdc
三、MBR(MS-DOS)与GPT磁盘分区表(partition table)
磁盘的碟片上可以细分出扇区(Sector)与磁道(Track)两种单位,其中扇区的物理大小设计有两种,分别是512字节与4K字节。在碟片上有一个重要的扇区,里面记录了重要的信息被称为MBR(Master Boot Record)格式,由于磁盘容量不断扩大,造成读写上的一些困扰,后来又发展出GPT磁盘分区格式。
3.1MBR(MS-DOS)分区表格式与限制
早期Linux系统了兼容Windows的磁盘,所以使用的是支持Windows的MBR(Master Boot Record,主引导记录)的方式来处理启动引导程序与分区表。而启动引导程序记录与分区表就放在磁盘的第一个扇区,这个扇区通常是512字节的大小(旧的磁盘扇区都是512字节),第一个扇区的512字节主要包含就是主引导程序记录和分区表。
主引导记录(Master Boot Record, MBR):可以安装启动引导程序的地方,有446个字节;
分区表(partition table):记录整块磁盘分区的状态,有64个字节。
关于主引导记录在下一节启动流程中的做具体介绍,这里我们首先来关注分区表,由于分区表所在区域仅有64个字节容量,因此最多只能有四组记录区,每组记录了对应磁盘分区的开始与结束的柱面号码,每组记录所用的容量就是64/4=16字节。
假设现在磁盘的设备文件名为/dev/sda,该磁盘上有400个柱面,每个分区占100个柱面,用一个平面图来表示这个磁盘分区大概就是下面这样:
因为在第一个扇区中只有四个分区记录,如何在这四个分区记录的基础上实现更多的磁盘分区呢?在MBR格式中除了固定的主要分区(Primary)还有一种分区叫做扩展分区(Extended),这里顺带提一下分区的最小单元是柱面(Cylinder)。在扩展分区中又会拿出一个扇区作为分区表的容器,扩展分区就可以再跟一个磁盘一样进行分区,不过扩展分区中的分区一般表示为逻辑分区(loogical partition),逻辑分区的数量也不是可以无限划分的,逻辑分区的数量与操作系统不同而数量会有差别,在Linux中的SATA磁盘上逻辑分区可以突破63个以上的分区限制。
下面是在第一扇区上划分出一个主要分区和一个扩展分区,然后将扩展分区划分成五个逻辑分区的示意图:
(由于画示图时忘了直接在图中标注磁盘分区对应的文件名,这里再补充以下):
P1:/dev/sda1 P2:/dev/sda2 L1:/dev/sda5 L2:/dev/sda6 L3:/dev/sda7 L4:/dev/sda8 L5:/dev/sda9
MBR格式的磁盘分区主要分区与扩展分区最多可以有四个,扩展分区最多只能有一个(操作系统的限制),逻辑分区是由扩展分区划分出来的。只有主要分区和逻辑分区才能被格式化,而扩展分区不能格式化。
关于MBR的分区整合,只有在同一个分区表中的分区才可以整合,也就是说逻辑分区只能和跟逻辑分区整合,主要分区可以跟主要分区整合。但是需要注意的是如果将扩展分区与主要分区整合,就必须先将扩展分区中所有的逻辑分区全部删除才能被整合。
关于MBR的多磁盘分区:每个磁盘上第一个扇区都是自己的主引导程序和分区表扇区,每个磁盘都可以定义一个扩展分区。每个分区的名称都是磁盘名称+分区号,比如两个磁盘的第一个分区名称分别是:/dev/sda1、/dev/sdb1。
3.2GPT(GUID partition table)磁盘分区表:
因为过去的磁盘扇区大小就是512字节,现在的磁盘有的已经做到了4K一个扇区,为了兼容所有磁盘在扇区的定义上采用了逻辑区块地址(Logical Block Address,简称LBA),每个逻辑区块依然是512字节,但实际磁盘的扇区可能不是512字节,采用逻辑区块一方面兼容了之前的磁盘物理扇区容量,另一方面是在磁盘分区时使用的逻辑区块我们可以将它当作是一个扇区,但实际上它可能不是一个扇区。
与MBR采用磁盘的第一个扇区作为主引导记录和分区表容器不同,GPT采用了34个逻辑区块来记录分区信息,除此之外GPT还将磁盘最后的34个逻辑区块作为备份,保障磁盘的安全性,下面是GPT磁盘分区示意图:
根据上面的示图来了解GPT磁盘分区表的结构内容,这些内容都按照非常整齐的逻辑区块地址分布在磁盘的起始位置和结束位置,起始位置34个逻辑区块叫做主分区表,结束位置34个逻辑区块叫做副分区表,副分区表相对主分区表少了一个主引导程序的区块,主引导程序的逻辑区块与MBR的主引导程序记录一样,都是在磁盘的第一个扇区,在GPT磁盘分区格式中就是在磁盘的第一个逻辑分区中,下面就按照逻辑区块编号来逐个解释:
LBA0:跟MBR的446个字节区块一样,用来存放主引导程序记录,前面说过在GPT格式中每个逻辑区块是512字节,在LBA0中除了主引导程序记录占用的区块,剩下的空间还会记录一个特殊标识符,用来表示此磁盘为GPT格式。
LBA1:这是GPT表头记录,记录的内容包括分区表的大小、位置、校正码(CRC32),及备份用的GPT分区的位置。
LBA2~LBA33:这是实际记录分区信息记录,每个LAB记录4组记录,所以默认情况下有4*32=128组分区记录。由于每个逻辑分区是512个字节,分为四组每个记录就是512/4=128字节,GPT分别采用64位来记录开始/结束的扇区号码。
虽然Linux本身的内核设备记录中针对单一磁盘最多只能分15个分区,由于Linux内核通过udev等方式处理可以突破这个限制,GPT已经没有MBR的主、扩展、逻辑分区的概念,与之相对的是通过磁盘起始/结束地址的方式来切分成相对应的磁盘分区,每个分区都可以被独立的格式使用。GTP分区表对于单一分区来说,最大容量理论可以达到264*512字节=263*1k字节=233*TB=8ZB。
在GPT分区格式中,每个分区的起始/结束设备物理地址可以不一定是连续的,如果不是连续的就会自动将不连续的中间空间作为一个分区,所以这种机制可以突破128个分区的限制,但超出分区表的分区好像不能格式化使用,这个我没有测试过,但理论上确实可以不使用连续的物理地址进行分区突破这个限制,说这个只是作为理解GPT的机制,而不是为了去突破他的限制,在现实应用中也没有必要。接着来了解一下为什么要对磁盘进行分区。
3.3为什么要对磁盘进行分区?
数据安全性:
如果磁盘没有进行分区,此时磁盘部分数据出现了问题导致文件系统不能正常工作,这时候整个磁盘的文件数据就会有丢失的风险,采用分区就可以将有问题的那个磁盘分区进行格式化,而不至于导致前整个磁盘的数据出现问题。还有就是假设你的Windows系统装在C盘,可能因为系统故障的原因需要重装系统,这时候你可以将C盘的文件迁移到D盘,然后C盘重装系统就不会影响到D盘中的文件数据。
系统性能的考虑:
有了磁盘分区可以提高指针寻址的速度,说的简单点假设你的数据是一枚掉在篮球场的硬币,这时候要寻早这枚硬币肯定先确定你在球场的活动范围,然后在你的活动范围里去找这枚硬币的速度肯定比在整个篮球场寻找的速度块,但需要注意的是也不是分区越多性能越高,关于这部分内容以后有机会在系统原理中解析吧,如果有兴趣的可以自行查找相关资料。
3.4MBR格式与GPT格式对比
从前面的介绍中我们知道MBR的磁盘主分区和扩展分区放在第一个扇区,如果第一个扇区出现问题就会导致整个磁盘的数据丢失,所以GPT在磁盘的逻辑区块地址末尾的34个分区中又备份了一份副分区表,就算是主分区表出现了问题依然可以使用副分区表的备份进行恢复,GPT提高了数据的安全性。其二是由于磁盘工艺不断的提升,磁盘的容量和扇区越来越多,原来MBR的四个分区会阻碍磁盘的性能提升,所以GPT在合理的分区下性能比MBR要高,这其中的原理还是留在系统原理中解析吧。
四、启动流程中的BIOS与UEFI(启动检测程序)
在前面的磁盘分区中提到了第一个扇区存放的MBR(主引导程序记录),它是用来加载系统内核文件的程序,辅助启动操作系统。但MBR(主引导程序记录)也不能自己启动,而是要用主板上的一个存储器固件中存储的BIOS来启动MBR(主引导程序记录),它们大致的计算机系统启动流程是:
1.主机电源通过通电信号启动BIOS主动执行固件,BIOS会找到第一个可启动设备,即通过磁盘硬盘等相关的插槽接口的第一个设备的第一个扇区中的MBR,找到MBR并加载启动BIOS的任务就完成了;
2.接着MBR主引导程序就会找到系统安装时记录的系统内核文件地址,加载系统内核文件并启动,将控制权交给操作系统,MBR的任务就完成了。
3.系统内核文件启动操作系统,接着系统就开始可以进入工作状态了。
如果分区表是GPT格式的话,BIOS也能够从LBA0的MBR兼容区块读取到主引导记录并启动它,如果主引导程序支持GPT格式的话,BIOS照样可以读取到正确的操作系统内核文件并启动操作系统。
由于MBR仅有446字节而已,如果使用grub的启动引导程序的话,那就要额外划分出一个BIOS boot分区,这个分区才能够放置其他开机过程所需要的程序,在CentOS当中,这个分区占用2MB左右。
所以MBR的Boot Loader任务很简单,包括:
1.提供选项:用户可以选择不同的启动选项,这也是多重引导的重要功能(由额外的BIOS boot分区提供程序文件)。 2.加载内核文件:直接指向可使用的程序区段来启动操作系统(就是加载系统内核文件)。 3.转交其他启动引导程序:将启动管理功能交给其他启动引导程序负责。
也就是说MBR的任务其实很简单,提供启动引导选项,如果是只有一个启动引导选项也就是它自身的话就会自动去加载系统内核文件,如果有多个启动引导选项就会通过用户选择去加载新的启动加载程序,并将启动管理权限交给这个新的启动加载程序,这个新的启动加载程序再去加载它对应的系统内核文件。
启动引导程序除了安装在默认的MBR中,还可以安装在每个分区的启动扇区(boot sector)中,这些被安装在启动分区中的启动引导程序就是Boot Lader中的多个启动引导选项,可以通过下图来了解启动引导程序的工作流程:
上面的一个多重启动引导流程图,你会发现在这个设备上同时安装了Windows和Linux系统,这也正是因为有了多重引导才能是现在一台机器上实现安装多个可用的操作系统,另外需要注意的是这个流程图没有体现出BIOS及调用的多重引导文件BIOS toot。
需要注意的是如果在一台设备上需要同时安装Windows和Linux的话,需要先安装Windows,因为Windows会主动覆盖第一扇区的MBR,而Linux可以选择将启动引导程序安装在MBR或别人分区上。
UEFI BIOS搭配GPT启动的流程:
由于GPT可以提供64位的寻址,然后也就可以使用较大的区块来处理启动引导程序,但是BIOS其实并不懂GPT,毕竟BIOS仅是16位的程序,所以要通过GPT提供兼容模式才能够读写这个磁盘,为了解决这个问题就有了UEFI(Unified extensible Firmware Interface)这个统一可扩展固件接口产生。
UEFI主要是想取代BIOS这个固件接口,因此也被称为UEFI BIOS,相比传统的BIOS使用汇编语言,UEFI使用的是C语言更容易开发。UEFI在启动阶段就能让该系统连接TCP/IP直接上网,根本不需要进入操作系统,这让小型系统开发充满了各式各样的可能性。
UEFI最初开发的时候制定规则里,包括硬件资源使用轮询的方式管理,与BIOS采用终端的方式管理比较,轮询的效率稍微低一些。另外UEFI并不能提供完整的缓存功能,因此执行效率也没有办法提升,不过UEFI驱动程序会启动一个类似操作系统的Shell环境,用户可以在此环境中执行任意UEFI程序,效果相比MS-BIOS更好。
UEFI大多用来实现启动操作系统之前的硬件检测、启动管理、软件设置等目的,加载操作系统之后更BIOS一样会将管理权限交给操作系统,但在特定环境下UEFI程序是可以部分执行的。
由于黑客经常借由BIOS启动阶段来破坏系统,并取得系统的控制权,因此UEFI加入了安全启动(secure boot)功能,这个功能代表即将启动的操作系统必须被UEFI所验证,否则无法启动。Windows用了很多这样的功能管理硬件,不过这个功能也会导致很多操作系统无法启动,所以,有时候可能需要将UEFI的secure boot功能关闭才能启动Linux操作系统。
虽然UEFI可以直接获取GPT分区表,不过最好还是拥有BIOS boot的分区支持。同时为了兼容Windows,并且提供其他第三方厂商所使用的UEFI应用程序存储空间,必须格式化一个FAT的文件系统分区,大约需要提供512MB到1GB左右的大小,让其他UEFI执行更为方便。
关于启动流程的具体系统操作在后面的系统管理员相关博客中会详细的介绍,这里只是将一些概念做一些介绍。