3.3.1 Linux存储基本概念
本小节介绍Linux存储的基本概念:扇区、块设备、分区、文件系统和挂载,它们都是Linux存储中重要而又基础的概念。
1.扇区
扇区(Sector)是存储设备(磁盘/U盘/SSD硬盘等)中最小的存储单元,是Linux存储中最基础和最重要的概念之一。图3-18所示是一个硬盘盘片,它由一个个的同心圆组成,每个同心圆称为一个磁道(Track),图3-18中最外部加粗的同心圆就是一条典型的磁道;硬盘上所有盘片上半径相同的磁道,组成一个柱面(Cylinder);从盘片的圆心出发,向外画直线,可以将磁道划分为若干弧段,每条磁道上的每个弧段就称为一个扇区,每个扇区存储512字节的数据。
图3-18 传统意义上的扇区示意图
对磁盘来说,扇区是其最小物理存储单元,而对于U盘/SSD硬盘而言,其存储实现和磁盘完全不同,但它们也有扇区,该扇区是抽象后的概念。总之,扇区表示存储设备的最小存储单元。
以上是传统意义上扇区概念:每个磁道上的扇区数相同,每个扇区存储512字节的数据。随着硬盘技术的发展,扇区的设计也发生了相应的变化,最显著的地方有两个。
(1)每个磁道上的扇区数不再相同
传统意义上每个磁道的扇区数量相同,这就导致不同磁道上的扇区的弧段长度是不一样的,半径越大的磁道,扇区弧段越长。由于每个扇区存储的数据量相同,这样就会导致不同磁道上的扇区的磁颗粒密度不同,弧段越长的扇区磁颗粒密度反而越小,这就导致了硬盘存储空间的浪费。随着硬盘技术的发展,出现了等密度磁道,每个磁道的磁颗粒密度是相同的。同时每个扇区的存储容量还是一样的,因此,就不能用以前的方法来划分扇区了,而是要基本依据弧段的长度来划分扇区。磁道半径越大,磁道的周长就越大,划分的扇区也就越多。因此,半径不同的磁道,其扇区数不再相同。
这个特性导致了硬盘寻址方式发生变化,传统意义上的硬盘,采用CHS(柱面、磁头、扇区)寻址。硬盘使用者(操作系统/底层应用)可以很方便地将存储空间的线性地址,转换成CHS(同时也可以直接定位扇区的物理位置)对硬盘寻址。然而这一切都依赖于“每个磁道扇区数相同”这一特性,当每个磁道的扇区数不再相同时,硬盘使用者就不能方便地使用一个公式,将存储空间的线性地址,再转换成CHS进行寻址了。
此时,硬盘提供了LBA(Logical Block Addressing)寻址方式,即逻辑块寻址模式,硬盘使用者直接传入扇区的逻辑地址进行寻址,由硬盘内部的控制器完成逻辑地址到物理位置的转换。这种方式简化了硬盘使用者的工作,但是,硬盘使用者就不能像以前一样,根据线性地址直接定位扇区的物理位置了。此外,LBA寻址还带来了寻址空间的飞跃,CHS采用24位对扇区寻址,其寻址空间大小约为16M*512B,约为8GB左右,这也就决定了硬盘的空间最多能使用8GB左右。而LBA采用48位寻址,其寻址空间则扩大到128PB左右,扩容1600万倍。
(2)硬盘扇区的存储容量由512字节变成了4096字节
传统硬盘扇区的大小为512字节,每个扇区都有自己的开销,例如校验数据等。随着硬盘容量的扩大,这些开销也随之增大,为了降低开销,提升硬盘空间的利用率。新的硬盘将扇区的大小设计成4096字节(4KB),这样可以有效降低开销。但是,硬盘的使用者,如BIOS/操作系统等,并未及时更新扇区大小,它们还是认为扇区的大小为512字节,并以此进行管理。为了向上兼容,新硬盘的接口还是以512字节为一个扇区,此时用户向硬盘读取1个扇区的内容,硬盘内部尽管读取的是4KB数据,但返回给用户依旧是512B的数据。因此,从用户的角度来说,依然可以认为硬盘的扇区大小为512字节,但心里要清楚,硬盘扇区的实际大小是4KB。
文件系统通常以4K(或者4K的倍数)为一个基本单位来管理硬盘空间,这个基本单位称为块(Block)。当文件系统读取1个Block时,如果该Block正好对应一个物理扇区,那么硬盘就只需要读取1次,否则,该Block就会跨两个扇区,硬盘就需要读取两次,对于写操作则需要读两次,再写两次,严重影响性能。4K对齐(地址为扇区(512B)的8倍)技术可以解决上述问题,具体包括分区起始地址的对齐、文件系统中元数据存储起始地址的对齐以及真实数据存储起始地址的对齐等。
总之,关于扇区至少要掌握:扇区是存储设备的最小的存储单元;每个扇区的大小为512B(尽管底层硬件的实现已经不是这样)。
2.块设备
块设备指支持寻址,以块为单位来操作数据的设备,典型的块设备如硬盘和光盘等。和字符设备相比,块设备有两个特点。
1)支持数据寻址,例如硬盘中的CHS/LBA寻址。
2)读取/写入数据的单位是块,这里的块指一个扇区512B,而字符设备是以字节为单位操作数据的。
Linux使用块设备文件表示块设备,例如/dev/sr0表示光驱设备,/dev/sda1表示硬盘上的一个分区,它们都是典型的块设备文件。从实现的角度可以将块设备分为:物理块设备和虚拟块设备两大类,说明如下。
(1)物理块设备
物理块设备指该设备的存储功能直接由真实的专用存储设备完成,例如磁盘、U盘、SSD硬盘,以及它们的分区和光驱等,都是物理块设备。
磁盘、U盘、SSD硬盘的设备文件名为/dev/sdX,X表示块设备编号,取值范围a~z,注意X后面是没有数字编号的;分区的设备文件名为/dev/sdXN,X表示块设备编号,N为分区编号,从1开始;光驱设备文件名为/dev/srN,N为设备编号。
(2)虚拟块设备
虚拟块设备指由软件虚拟而成的块设备。它们并不直接对应存储设备,其存储功能是由软件结合通用的存储实现。虚拟块设备使得上层的用户和底层的存储实现脱钩,不管底层实现怎样,上层用户用起来都是一样的。而物理块设备则是直接和底层存储对接的。
从功能的角度,虚拟块设备又可以分为3类:网络虚拟块设备、逻辑卷和Loop设备。
1)网络虚拟块设备
网络虚拟块设备是指基于网络的虚拟块设备。网络虚拟块设备会在本机虚拟一个块设备,但是该块设备的数据却是通过网络存储在远程服务器上的,至于数据是如何在远程服务器上存储的,有可能是直接存储在硬盘,也可能是存储在服务器的Raid阵列,还可能是存储在服务器的内存,甚至可能是服务器的一个文件中等。
典型的网络虚拟块设备技术有ISCSI和NBD。ISCSI(Internet Small Computer System Interface)使用TCP/IP实现本机和服务器之间交换SCSI命令,SCSI命令用于计算机同本地存储的数据交换,因此,有了ISCSI,本机就可以将服务器当成一个本地存储设备来使用。NBD(Network Block Device)同样会在本机虚拟出一个块设备,该块设备通过轻量级块设备访问协议同服务器交互,从而将服务器当成一个本地存储设备来使用。
ISCSI的设备文件为/dev/vdX,X为设备编号,取值范围为a~z。可以在/dev/vdX上分区,ISCSI分区的设备文件为/dev/vdXN,X为设备编号,取值范围为a~z,N为分区编号,从1开始。
NBD的设备文件为/dev/nbdN,N为设备编号,从0开始。NBD分区的设备文件为/dev/nbdNpM,其中N为设备编号,从0开始,M为分区编号,从1开始。
2)逻辑卷
逻辑卷是构建在多个(也可以是1个)块设备之上的虚拟块设备。逻辑卷使用逻辑卷管理(Logical Volume Manager,LVM)技术实现,LVM通常将多个物理块设备(包括分区)组成一个统一的空间,称为卷组(Volume Group,VG),然后在卷组上划分出一块块的空间,每一块空间就称为一个逻辑卷(Logic Volume,LV),如图3-19所示。和直接使用块设备存储空间相比,LVM技术可以很方便地实现存储空间的管理,例如对逻辑卷进行扩容等。
图3-19 逻辑卷示意图
逻辑卷设备文件命名形式为/dev/dm-N,其中,dm-N表示具体的设备名,N表示逻辑卷编号,起始编号为0。
逻辑卷上不能再分区,而是直接构建文件系统。
3)Loop设备
Loop设备又称回环设备,它可以将一个文件虚拟成一个块设备,块设备上的数据都存储在此文件上。Loop设备因为使用方便,在测试中应用很多。
Loop设备文件名为/dev/loopN等,N表示设备编号,类型是数字,起始编号为0。Loop设备上不能再分区,而是直接构建文件系统。
3.分区
分区指将存储设备的存储空间划分成逻辑上独立的几个部分,每个部分就是一个独立的分区。例如Windows下的C盘、D盘等,就是一个个的分区,Linux下的sda1、sda2等,也是一个个的分区。
分区的应用场景有很多:当拿到一个从未使用过的存储设备时,通常要做的第一个操作就是对其进行分区;如果要对一个存储设备的空间重新规划,要先对其进行分区;当在硬盘上安装操作系统时,也要对其进行分区等。
如果将存储设备的所有空间作为一个分区的话,是可以不分区,直接格式化的。
分区的分类也有多种:例如从技术实现的角度,分区可以分为MBR分区和GPT分区两类;从自身属性的角度,分区可以分为主分区和扩展分区两类,扩展分区又由若干逻辑分区组成,具体说明如下。
(1)MBR分区和GPT分区
MBR分区是传统的分区方式,因为分区表紧随MBR之后,故称为MBR分区。MBR分区最多支持4个主分区,或者3个主分区+1个扩展分区。MBR分区存在的问题:分区的数量受限,单个分区的大小不超过2TB。
GPT(GUID Partition Table)分区是新的分区方式,其优点是支持2TB以上的分区,分区的数量也不受限制(但分区数量受操作系统的限制),GPT分区存在的问题是,在GPT分区上安装操作系统,需要设置UEFI引导,但一些老的主板的BIOS并不支持UEFI引导。
如果硬盘空间超过2TB,使用GPT分区;如果硬盘空间不超过2TB,且硬盘用作系统盘,建议使用MBR分区,这样兼容性好;如果硬盘用作数据盘,使用MBR分区/GPT分区都可以。
(2)主分区、扩展分区和逻辑分区
主分区、扩展分区和逻辑分区都是MBR分区中的概念,GPT分区突破了分区数的限制,其分区类型不做上述区分。主分区是指记录在MBR分区表中的分区,分区表共64字节,分为4项,每项16字节,记录一个分区的信息。扩展分区是为了解决MBR分区数限制而引入的,在扩展分区中再划分为若干逻辑分区,逻辑分区间以链表方式建立连接,MBR分区表中的一项指向第一个逻辑分区,如图3-20所示。MBR分区中最多只能有一个扩展分区,主分区+扩展分区的个数不超过4个。
图3-20 MBR分区示意图
扩展分区项出问题,很可能会导致所有的逻辑分区都无法使用;如果是其中一个逻辑分区无法访问,则它后面的逻辑分区很有可能无法访问。主分区则不会有以上问题,因此,从这个角度讲,主分区的安全性要高。因此,如果不超过4个分区,可以都使用主分区;如果超过4个分区,应将操作系统安装在主分区。
4.文件系统和格式化
文件系统指文件在存储设备的组织方式和数据结构,如Windows中的NTFS、Linux中的Ext3、Ext4和XFS等。如果把存储设备比作一个仓库,分区就是仓库的隔间;文件系统则是为隔间加入货架,并且使用记录本来记录货架情况,从而实现货物存入和取出的系统;文件则是货物,而且是可以拆分再打包的货物。
任何存储设备,都必须构建好文件系统后,才能使用。这个构建文件系统的过程,就是平时所说的“格式化”。例如一块从未使用过的硬盘,分区后把它格式化成NTFS格式,就可以使用该硬盘了。
5.挂载(Mount)
挂载(Mount)是将文件系统同目录关联起来的一种操作,被关联的目录,称之为挂载点(Mount Point)。挂载的概念在2.2.5节中已有详细说明,此处不再赘述。总之,任何存储系统,必须要构建文件系统,文件系统构建好后,还要进行挂载操作,将该文件系统同Linux下的某个目录关联起来,这样上层用户才能够向该存储系统读取/写入文件。因此,挂载是存储系统使用之前的最后一个操作。