在windows里,我们安装系统的时候会习惯性的选择C盘作为我们的系统安装盘,在windows中还会有D盘、E盘、F盘等,在linux中,也会有磁盘分区的概念,接下来了解一下Linux的磁盘分区细节。
磁盘命名方式
在linux中,任何事物都以文件的形式存在,包括硬盘,linux中硬盘的命名方式较为简便,对于SATA接口、USB接口、SAS接口的硬盘都是用SCSI模块驱动的,因此硬盘命名为/dev/sd[a-p],那么如何决定这个顺序呢?
例如我们有两块SATA接口的硬盘和一个USB接口的硬盘,而计算机上有6个SATA接口,第一块硬盘接在了SATA1接口上,第二块硬盘接在了SATA5接口上,各硬盘的命名规则如下
- SATA1接口的硬盘命名为/dev/sda
- SATA5接口的硬盘命名为/dev/sdb
- USB接口的硬盘命名为/dev/sdc 因此可以得知硬盘的命名顺序和接口的数字没有太大的关系,而与系统侦测到的硬盘顺序有关系。
由于我们还需要对硬盘进行分区,因此在英文字母的延续下还需要有数字对硬盘的分区进行标识,例如将硬盘分为两个区,那么在文件系统上,第一个分区的唯一标识就是/dev/sda1
另外,使用虚拟机虚拟出来的硬盘命名规则为/dev/vda。
MBR分区
什么是分区,分区又有什么好处呢?
一块整个的硬盘,我们应该对磁盘空间进行一下划分,提升磁盘空间的利用率,例如我们将一整块磁盘以功能性进行分区,例如分区1存储的是word文档,分区2存储的是照片,分区3存储的是代码,这样我们在硬盘里找东西的时候,不至于手忙脚乱,可以在某一特定的空间进行查找
虽然真正的查找文件的活不是我们在干,而是计算机在干,但是这种分区方式可以增加查找速度啊,增加计算机的查找效率。
上述我们说了为什么分区,现在总结一下分区的好处:
- 分区可以保护系统的安全性
- 分区可以增加系统查找文件的效率
第一点展开来说就是我们会将系统盘和个人数据的存储盘进行分离,就像windows中的C盘和其他盘符一样,当系统盘崩溃的时候,重装系统,不会导致我们的个人文件数据丢失。
第二点我们在上面也进行了描述,当我们查找文件的时候,可以到特定的地址范围进行快速查找,而不用扫描整个磁盘。
早期的linux为了兼容windows的分区格式,因此使用的是MBR分区,而开机管理程序与分区记录表则放在第一个扇区,通常此扇区大小为512Byte,开机管理程序占用446Byte,分区记录表占用64Byte。
由于分区记录表大小仅为64Byte,因此理论上最多只能存放4个分区记录,每组分区记录存放了该分区的起始柱面号。
早起的linux是以柱面为最小单位进行分区的,而新版本的linux则以扇区为最小单位进行分区的,通常一个扇区的大小为4K或512Byte
结构图如下
我们上面说了磁盘间是通过字母在linux标识的,例如第一块硬盘的标识为/dev/sda,第二块硬盘的标识为/dev/sdb,对一块硬盘进行分区后,例如分了4个分区,第一块硬盘的第一个分区为/dev/sda1,第一块硬盘的第二个分区为/dev/sda2,以此类推。
由于一个由MBR进行分区的硬盘最多只能有4个分区,因此MBR分区将每个分区的名称定义为主分区(Primary)与扩展分区(Extended)。
可能大家有这样一个疑惑,MBR方式进行分区最多只能分4个,但是我的windows上可以分好多个,这不是冲突了吗,这是怎么回事?
在一块以MBR格式进行分区的磁盘,最多只能有一个拓展分区,当然,还可以将这个扩展分区的前几个区块作为扩展分区记录表,而将拓展分区再分为几个分区,原理图例如下面这样。
我们将拓展分区里的分区称之为逻辑分区(logical partition),我们接下来再来讨论一下分区的命名问题(其中包含逻辑空间的命名)
上面我们将一块磁盘分为了两个大分区,主分区和扩展分区,然后扩展分区里又分为了5个逻辑分区,因此命名为:
- 主分区命名为/dev/sda1
- 逻辑分区1命名为/dev/sda5
- 逻辑分区2命名为/dev/sda6
- 逻辑分区3命名为/dev/sda7
- 逻辑分区4命名为/dev/sda8
- 逻辑分区5命名为/dev/sda9
从命名规则上可以得知,无论主分区分几个,都得将主分区的命名留下来,即上述的/dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4,而且逻辑分区的命名只能从5开始,即/dev/sda5
在linux中,SATA硬盘的接口目前最多能分63个分区
主分区与逻辑分区可以被格式化,扩展分区无法被格式化
上述我们说了磁盘的第一个扇区存放的是开机引导程序以及磁盘分区表,这个扇区特别重要,所以一旦物理磁盘上这个扇区损坏了,那么这个硬盘基本上是废掉了,因为找不到磁盘分区表,操作系统就不知道具体的分区情况,也就无法向磁盘中存取数据。
一个磁盘分区的例子
如果我想将磁盘分区后再留有一定的空间,便于我日后出现分区满的时候进行扩展,我应该怎么分区?
方法一:
可以将磁盘分为4个主分区,然后留有一定的空间。
这个想法是对的,但是MBR的分区方式最多只允许分4个分区,即便留了一部分剩余空间,日后也没有办法再进行分区了,因此方法一是不可行的。
方法二:
可以将磁盘分为3个主分区和一个扩展分区,然后在扩展分区中分为一个逻辑分区,再留有一定的空间,如果日后想要对剩余的空间再进行分区的话,直接再扩展分区中分逻辑分区即可。
因此,方法二可行。
其实MBR分区也有一定的缺点:
- 操作系统为2.2T以上的硬盘进行分区
- MBR分区的硬盘一旦第一个扇区损坏,硬盘将无法使用
- MBR分区的开机引导程序所占空间仅为446Byte,无法容纳更复杂的开机引导程序
基于上述缺点,便发展出了GPT格式的分区。
GPT分区
GPT分区首先与MBR进行对比,他可以分的数量变多了,而且还会对关键信息进行备份,丢失时可以及时的恢复。
当今以4K为标准的扇区已经出现,但是为了兼容于所有硬盘,GPT还是以512Byte为标尺进行分区,说的好听一点就是逻辑区块地址(Logical Block Addrress,LBA)。
在MBR中使用512Byte来存储MBR的关键信息,在GPT中,则是以34个LBA来记录GPT的分区信息,同时为了防止类似于MBR第一个扇区丢失导致磁盘报废的情况,GPT则使用后33个LBA来备份GPT分区信息。
GPT分区的第一个分区为LBA0,下面来解释一下各个LBA的基本存储内容:
- LBA0
此处存储的格式类似于MBR,前446Byte存储开机引导程序,后64Byte存储的为一个标识符,意为此块硬盘为GPT分区,不懂GPT磁盘分区的磁盘管理程序不会认识这块硬盘。
- LBA1
这个部位记录了分区表本身的大小以及位置,而且还记录了后33个备份的LBA,还放置了分区表的机制验证码(CRC32),操作系统可以检查这个验证码是否正确,如有误,可以通过后33个LBA对分区表进行恢复。
- LBA2-33
这些部分就是真正存储分区的位置,每一组可以存储4个分区信息,也就是每一个分区信息占有128Byte,并且在这128Byte中,还会分别拿出64Bit来记录分区的起始位置,由于共有32个位置存放,则理论上共计可以分4 x 32 = 128个分区,并且最大分区容量可以达到8ZB = 233TB。
虽然一些新版本的linux大多认识GPT分区,但是像fdisk这种分区工具是无法使用GPT分区的,还有grub的第一版是不认识GPT的,只有grub2才认识。
使用GPT分区需要有三要素,即硬盘支持GPT分区,主板支持UEFI,操作系统支持GPT和UEFI。
GPT和UEFI又是什么?下一篇文章接着总结。