Linux运维之道(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 存储管理

硬盘设备购买回来后需要对其进行分区才可以使用,分区可以使公司业务数据得到更有效的管理。正如生活中一个大的衣柜往往会被分割为多个大小不一的小格子一样,这样就可以根据自己的不同需要将衣物分类存放,而计算机中的数据要比生活中的衣物更多、更复杂,如果大量的数据都堆积在一起管理会很困难,并且随着时间的推移,管理员会越来越痛苦!这时我们就需要提前规划好磁盘的存储空间,至于一块硬盘到底要分多少个区,每个分区需要划分多大的空间,这需要根据自己的文档数量、大小、类型等因素进行不同的设计。

有关硬盘的识别,Linux会根据设备类型对存储设备进行识别,如果是IDE存储设备,在计算机中将被识别为hd,第一个IDE设备会被识别为hda,第二个IDE设备会被识别为hdb,依此类推。如果是SATA、USB或SCSI设备,会被识别为sd,同样第一个此类设备为sda,第二个此类设备为sdb,依此类推。

对于分区,Linux使用数字来表示。如第一块SATA硬盘的第一个分区为sda1,第二块SATA硬盘的第二个分区为sdb2。

2.4.1 磁盘分区

传统的MBR分区方式,一块硬盘最多可以分四个主分区,如图2-3所示,我们为硬盘分配了四个主分区,那么即使硬盘还有剩余空间,也无法再继续分区。

传统的MBR分区方式中,如果需要更多的分区,则需要在扩展分区中创建逻辑分区的方法来实现,解决方法如图2-4所示。此时先创建一个扩展分区,然后将扩展分区划分出多个逻辑分区,所有逻辑分区的总和等于扩展分区的大小。逻辑分区一定是以编号为5开始的,也就是说,SATA磁盘的第一个逻辑分区一定为sda5。

img

图2-3

img

图2-4

以下是具体的操作步骤。

img
img
img
img

我们可以使用partprobe命令让内核立即读取新的分区表,这样无须重启系统,即可识别新创建的分区。

img

对于上面所讲述的传统MBR分区方式而言,有多种限制。如,最多4个主分区,无法创建大于2TB的分区,而现在有一种新的GPT分区方式则不受这样的限制,此外,GPT分区提供了分区表的冗余以实现分区表的备份与安全。但fdisk命令不支持GPT分区方式,这里我们需要使用Linux的另一个分区工具parted,命令格式为:

img

注意,改变分区方式后,原有磁盘中的数据将会全部丢失,因此要保存好自己的数据备份。这里我们选择第三块磁盘来进行GPT分区演示,具体操作方法如下。

1.修改分区表类型

img

修改完成后,我们可以通过print指令查看修改效果:

img

2.创建与删除分区

创建新的分区需要使用parted命令的mkpart指令,语法格式如下:

img

其中,mkpart指令为创建新的分区,分区类型有:primary、logical、extended三种,文件系统类型有:fat16、fat32、ext2、ext3、linux-swap等,开始与结束标记区分开始与结束的位置(默认单位为MB)。

img

上面的命令将创建一个格式为ext3的主分区,从磁盘的第1MB开始分区,到2GB的位置(大小为2GB的主分区)。

img

上面命令将创建一个容量为2GB的分区(从磁盘的第2个GB位置开始分区,到第4个GB的位置结束)。

img

除了基本的分区创建与删除外,利用parted命令还可以进行分区检查、调整分区大小、还原误删除分区等操作,关于parted命令的更多使用方法,可以查阅man手册。

2.4.2 格式化与挂载文件系统

对磁盘进行分区后,接下来需要格式化与挂载文件系统,在某些操作系统中,格式化完成后,系统会自动挂载至一个盘符上,然后就可以直接访问并使用它,但Linux需要我们手动完成挂载操作。

我们使用mkfs命令来完成格式化操作,其中CentOS 7系统默认的文件系统格式为xfs格式。

img

格式化完成后,需要我们手动挂载文件系统,挂载可以使用命令或者修改系统配置文件两种方式,使用命令挂载文件系统可以立即生效并使用,但计算机重启后无效。另一种需要修改系统配置文件,这种方式挂载的文件系统在计算机重启后仍然有效。下面分别介绍这两种方式。

第一种方式:使用mount命令实现文件系统的挂载。

名称:mount

描述:挂载文件系统。

用法:mount[选项][-o[选项]]设备 挂载目录

选项:-a 挂载/etc/fstab文件中所有未挂载的文件系统。

-t 指定文件系统类型(包括:autofs、cifs、ext、ext2、ext3、ext4、hfs、iso9660、jfs、minix、msdos、nfs、nfs4、ntfs、proc、ramfs、reiserfs、romfs、squashfs、smbfs、sysv、tmpfs、ubifs、udf、ufs、usbfs、vfat、xenix、xfs等)。

-o 指定挂载属性,具体属性可参考man帮助手册。

img
img

第二种方式是修改系统文件/etc/fstab,该文件共计六列,第一列为设备名称或设备标签,第二列为挂载目录的名称,第三列为文件系统类型,第四列为挂载属性,第五列指定该文件系统是否使用dump进行备份(0表示不备份,1表示每天备份),第六列指定该文件系统在开机后使用fsck程序进行磁盘检测的顺序(根文件系统需要指定为1,其他文件系统一般为2,如果为0,则表示不需要进行磁盘检测)。

img

2.4.3 LVM逻辑卷概述

试想有一天随着业务的增加,你的文件系统负载会越来越大,终于到了空间不足的情况,而如果我们还在使用传统的分区方式进行磁盘管理,就不得不将现有的所有分区全部删除,并重新规划新的存储解决方案。其实从一开始我们就需要一种管理机制,她能帮助我们动态地管理存储,而LVM就提供了这种功能。

LVM(Logical Volume Manager)是基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统的大小。此外,LVM的快照功能可以帮助我们快速备份数据。LVM为我们提供了逻辑概念上的磁盘,使得文件系统不再关心底层物理磁盘的概念。

使用LVM创建逻辑卷需要我们提前了解以下几个概念。

◎ 物理卷(Physical Volume,PV):物理卷是LVM的最底层概念,是LVM的逻辑存储块,物理卷与磁盘分区是逻辑的对应关系。生活中的圆形的积木在没有附加工具时,是不能相互堆叠且稳定的(上面的积木很快会掉下来),但方形却有很强的组合功能(多个方向堆叠在一起不会倒塌),我们可以假设普通的分区是一个圆形,多个分区是不能合并组合的,而LVM中的物理卷可以假设为方形,多个LVM物理卷可以合并或拆分,从而实现容量的扩容和缩减。LVM提供了命令工具可以将分区转换为物理卷,通过组合物理卷可以生成卷组。

◎ 卷组(Volume Group,VG):卷组是LVM逻辑概念上的磁盘设备,通过将单个或多个物理卷组合后生成卷组。卷组的大小取决于物理卷的容量以及个数。在CentOS 7系统中,对容量与个数没有限制。

◎ 物理长度(Physical Extent,PE):物理长度是将物理卷组合为卷组后,所划分的最小存储单位,即逻辑意义上磁盘的最小存储单元。LVM默认PE大小为4MB。

◎ 逻辑卷(Logical Volume,LV):逻辑卷就是LVM逻辑意义上的分区,我们可以指定从卷组中提取多少容量来创建逻辑卷,最后对逻辑卷格式化并挂载使用。

图2-5给出了是LVM整体概念的示意图,图中可以看出,我们将物理磁盘分区可用转换为LVM的物理卷(PV),多个物理卷组合为卷组(VG),逻辑卷(LV)是从卷组中提取出来的存储空间,最后我们可以将逻辑卷挂载到某个挂载点目录上。

img

图2-5

通过对以上概念的了解,接下来要说明具体使用到的命令。将普通分区转换为物理卷的命令是pvcreate,将物理卷组合为卷组的命令是vgcreate,从卷组中提取容量创建逻辑卷的命令是lvcreate。创建完成后可以分别使用pvdisplay、vgdisplay、lvdisplay查看效果。

1.pvcreate

描述:使用LVM对磁盘或分区进行初始化。

用法:pvcreate[选项]物理卷[物理卷…]

例子:

img

2.vgcreate

描述:创建卷组。

用法:vgcreate[选项]卷组名称 物理设备路径[物理设备路径…]

例子:

img

3.lvcreate

描述:从卷组中提取存储空间,创建逻辑卷。

用法:lvcreate[选项]卷组名称或路径[物理卷路径]

选项:-l 指定使用多少个卷组中的PE创建逻辑卷,PE的容量在创建卷组时已经指定。

-L 直接指定逻辑卷的容量大小,单位可以是b(B)、s(S)、k(K)、m(M)、g(G)、t(T)、p(P)或e(E)。

-n 指定逻辑卷名称。

例子:

img

2.4.4 创建LVM分区实例

这里我们使用sdb这块500GB的硬盘创建四个100GB的分区,并使用这四个分区创建一个名称为test_vg的卷组,最后从该卷组中创建出两个大小为120GB的逻辑卷,名称分别为test_web、test_data。

1.使用fdisk创建分区

img
img
img

2.使用pvcreate创建物理卷并使用pvdisplay查看结果

img

3.使用vgcreate创建卷组并使用vgdisplay查看结果

img
img

4.使用lvcreate创建逻辑卷并使用lvdisplay查看结果

img

5.格式化并挂载

img
img

2.4.5 修改LVM分区容量

随着时间的推移,逻辑卷test_data现有的存储空间已经不能满足企业大业务量的需要,我们需要将存储容量增大至240GB时,LVM随时可以帮助我们动态调整文件系统的大小。本节继续2.4.4节的案例,由于test_vg这个卷组还有足够的剩余空间可以划分给逻辑卷,所以我们可以直接使用lvextend命令调整逻辑卷大小。但lvextend仅调整逻辑卷大小,使用该命令调整完逻辑卷大小后,还需要使用xfs_growfs命令更新文件系统的大小,具体方法如下:

img

此外,当我们的卷组没有足够的空间划分给逻辑卷时,LVM的卷组也是可以动态调整容量大小的,这时需要使用fdisk创建一个新的分区,并使用pvcreate命令转换为物理卷格式,接着通过vgextend将新的物理卷追加至现有的卷组空间中,最后使用lvextend调整逻辑卷的容量。下面我们再次扩展逻辑卷test_data的存储空间至360GB。

img
img

提示

在企业生产环境中,为文件系统调整大小前一定要做好数据的备份工作。

2.4.6 删除LVM分区

当我们不再需要逻辑卷分区时,可以使用LVM命令轻松地删除之前创建的物理卷、卷组、逻辑卷。删除的顺序应该与创建时的顺序相反,也就是卸载文件系统、删除逻辑卷、删除卷组、删除物理卷这样的顺序。卸载文件系统时需要注意,如果有必要,应该更新/etc/fstab文件。

img

2.4.7 RAID磁盘阵列概述

早在1978年,美国加州大学伯克利分校就提出了RAID(Redundant Array of Independent Disk)虚拟存储系统。RAID即独立冗余磁盘阵列,其思想是将多块独立的磁盘按不同的方式组合为一个逻辑磁盘,从而提高存储容量,提升存储性能或提供数据备份功能。RAID存储系统的组合方式根据RAID级别定义。

RAID分为软件RAID和硬件RAID两类。在现有的操作系统中,如Windows、Linux、UNIX等已经集成了软RAID的功能。软件RAID可以实现与硬件RAID相同的功能,但由于其没有独立的硬件控制设备,所以性能不如硬件RAID,但软件RAID实现简单,不需要额外的硬件设备。硬件RAID通常需要有RAID卡,RAID卡本身会有独立的控制部件和内存,所以不会占有系统资源,效率高、性能强。当然目前市面上有很多主板已经集成了RAID卡,具体的使用方式可以参考硬件说明书。

现在RAID存储系统被广泛应用于生产环境作为存储解决方案。

2.4.8 RAID级别

RAID根据组合的方式不同,有多种设计解决方案,以下介绍几种常见的RAID方案(RAID级别)。

1.RAID 0(不含校验与冗余的条带存储)

多块磁盘组合为RAID 0后,数据将被分割并分别存储在每块硬盘中,所以能最大地提升存储性能与存储空间,但无法容错,RAID 0至少需要两块磁盘。

如图2-6所示,如果有一个文件要写入RAID 0,则该文件会被分割为多个部分(图2-6中分割为四个数据块),DATA1与DATA2被分别同步存入磁盘1与磁盘2,其他部分依此类推。读取该文件时,将同时从磁盘1与磁盘2中读取数据。如果两块磁盘的存储空间均为120GB,则RAID 0的总存储空间为240GB。

缺点:因为没有校验与备份,两块硬盘中如果有一块磁盘损坏,即磁盘中的任何一个数据块损坏将导致整个文件无法读取。

2.RAID 1(不含校验的镜像存储)

多块磁盘组合为RAID 1后,数据将被同时复制到每块硬盘中,制作这种磁盘阵列至少需要两块硬盘,该级别的RAID只要有一块磁盘可用,即可正常工作,该级别的阵列安全性是最好的,磁盘利用率是最低的。

img

图2-6

如图2-7所示,如果有一个文件要写入RAID 1,则该文件会写入磁盘1,同时以复制备份的形式写入磁盘2,DATA1与DATA2被同时存入磁盘1与磁盘2,其他部分依此类推。RAID 1写入数据的效率会降低,因为相同数据需要同时写入两块硬盘,但RAID 1读取数据的效率会提升,因为可以同时从两块硬盘读取数据。

img

图2-7

缺点:RAID 1的写入效率低下。此外,磁盘的利用率极低,如果两块磁盘的存储空间均为120GB,则RAID 1的总存储空间依然为120GB。

3.RAID 2(位级别的校验式条带存储)

多块磁盘组合为RAID 2后,数据将以位(bit)为单位同步式分别存储在不同的硬盘上,并采用海明码(海明码是一种具有纠错功能的校验码)对数据进行校验与恢复。

如图2-8所示,如果有一个文件要写入RAID 2,则该文件会被分成数据位分别同步写入不同的磁盘中,DATA1与DATA2进行海明码运算后再写入校验盘中,其他部分依此类推。拥有校验位的RAID 2允许三块磁盘中的任何一块磁盘损坏,并能够对未损坏的两块磁盘进行运算后还原已损坏磁盘上的数据,从而实现数据恢复的功能。RAID 2对大数据量的读写具有很高的性能,但对少量数据的读写时性能反而不好,该磁盘阵列至少需要三块硬盘。

img

图2-8

4.RAID 3(字节级别的校验式条带存储)

该级别的磁盘阵列可以参考RAID 2的读写原理,仅数据分割的单位为字节。

5.RAID 4(数据块级别的校验式条带存储)

该级别的磁盘阵列与RAID 2类似,仅数据分割单位不同,图2-9为RAID 4存储原理图。

img

图2-9

6.RAID 5(数据块级别的分布式校验条带存储)

多块磁盘组合为RAID 5后,数据将以块(block)为单位同步式分别存储在不同的硬盘上,并对数据进行海明码运算,与其他级别不同的是,该级别的海明码会被写入不同的磁盘。图2-10为RAID 5存储原理图。

img

图2-10

7.RAID 10(镜像与条带存储)

RAID 10不是独创的一种RAID级别,它由RAID 0与RAID 1结合而成,RAID 10继承了RAID 0的快速与高效,同时也继承了RAID 1的数据安全,RAID 10至少需要四块硬盘。RAID 10通常有两种结构,一种是RAID 0+1结构,一种是RAID 1+0结构。如果是RAID 1+0,则先使用四块硬盘组合成两个独立的RAID 1,然后将两个RAID 1再组合为一个RAID 0。

如图2-11所示,当数据写入时,首先会以条带的方式同步写入由两个RAID 1组合而成的RAID 0中,随后,当数据被写入由具体磁盘组成的RAID 1时,又可以实现双磁盘镜像功能。

img

图2-11

缺点:RAID 10继承了RAID 0和RAID 1的优点,但同时也继承了一些缺点,RAID 10的磁盘利用率很低,只有50%。

2.4.9 创建与管理软RAID实例

创建与管理软RAID实例的步骤如下。

1.查看磁盘信息

img

从以上输出信息可以看出,本机有sdb、sdc、sdd三块硬盘未分区,如果需要在Linux中实现软RAID,可以将每块硬盘分一个区组建RAID,也可以对硬盘分多个区实现软RAID,这里我们将每块硬盘分两个区。

2.创建硬盘分区

img
img

3.创建RAID(本例将分别创建RAID0与RAID5)

Linux中创建磁盘阵列可以使用mdadm命令,在CentOS 7中,目前支持的RAID级别有RAID0、RAID1、RAID4、RAID5、RAID6、RAID10。下面我们看看该命令的使用方法。

名称:mdadm

描述:管理Linux软件RAID设备。

用法:mdadm[模式]选项 <raid设备>

选项:-C 创建软件RAID(create)。

-l 指定RAID级别(level)。

-n 指定磁盘个数。

-x 指定备用设备个数。

img

以上两条命令分别创建了名称为md0的RAID 0设备以及名称为md1的RAID5设备,这里的名称可以根据自己的习惯自行指定。

刚刚创建的RAID 0及RAID 5的详细信息如下。

img
img

4.格式化与挂载

img

将磁盘阵列设备设置为开机自动挂载项,CentOS系统开机会读取磁盘阵列的配置文件/etc/mdadm.conf以启动RAID设备。下面两条命令可以帮助我们快速创建这样的配置文件,DEVICE行代表填写所有磁盘阵列的设备成员名称,ARRAY行描述磁盘阵列具体的基本信息,包括名称、级别、UUID等信息。

img

2.4.10 RAID性能测试

img

可以看出,对普通磁盘写入1GB的数据所需总时间为23.262s。

img

可以看出,对RAID 0写入1GB数据所需总时间为4.308s。

img

可以看出,由于RAID 5需要生成校验位数据,所以写入数据的速度比RAID 0慢,但比普通磁盘快,写入1GB数据所需总时间为12.614s。

注意

以上测试仅以软RAID为例。

2.4.11 RAID故障模拟

img

注释:使用-f选项(failed)模拟磁盘sdb2的损坏。

由于上面做性能测试时已经往RAID 5中写入了1GB的数据,所以使用命令模拟磁盘损坏后,快速查看RAID详细信息可以看出正在使用/dev/sde2重建数据(还原数据),而原来的/dev/sdb2成了损坏的空闲设备。

img
img