2.4 存储管理
Linux针对设备类型对存储设备进行识别,如果是IDE存储设备,在计算机中将被识别为hd,第一个IDE设备会被识别为hda,第二个IDE设备将被识别为hdb,以此类推。如果是SATA、USB或SCSI设备,会被识别为sd,以此类推。
对于分区,Linux使用数字来表示。如第一块SATA硬盘的第一个分区为sda1,第二块SATA硬盘的第二个分区为sdb2。
2.4.1 硬盘分区
传统的MBR分区方式是一块硬盘最多可以分四个主分区。即使硬盘还有剩余空间,也无法再继续分区。无法创建大于2TB的分区。
Sda1 |
Sda2 |
Sda3 |
Sda4 |
剩余空间 |
传统的MBR分区方式中,如果需要更多的分区,则需要使用在扩展分区中创建逻辑分区的方法来实现。此时可以在扩展分区中划分出多个逻辑分区,所有逻辑分区的总和为扩展分区的大小。逻辑分区一定是以编号5开始的。SATA磁盘的第一个逻辑分区一定为sda5。
Sda1 |
Sda2 |
Sda3 |
扩展分区sda4 |
||
逻辑分区sda5 |
逻辑分区sda6 |
...... |
Command (m for help): m在此输入指令m获得帮助 Command action a toggle a bootable flag切换分区启动标记 b edit bsd disklabel编辑bsd磁盘标签 c toggle the dos compatibility flag切换dos兼容模式 d delete a partition删除分区 l list known partition types显示分区类型 m print this menu显示帮助菜单 n add a new partition新建分区 o create a new empty DOS partition table创建新的空分区表 p print the partition table显示分区表信息 q quit without saving changes不保存退出 s create a new empty Sun disklabel创建新的Sun磁盘标签 t change a partition's system id修改分区id,可以通过l查看id u change display/entry units修改容量单位,磁柱或扇区 v verify the partition table检验分区表 w write table to disk and exit保存并退出 x extra functionality (experts only)扩展功能
使用partprobe命令让内核立即读取新的分区表。或partx -a增加了分区,partx -d删除了分区。
[root@instructor ~]# partprobe /dev/sda
GPT分区提供了分区表的冗余以实现分区表的备份与安全。但fdisk命令不支持GPT分区方式,使用Linux的另一个分区工具parted,命令格式为:
parted[选项][磁盘 [命令] ]
1. 修改分区表类型
[root@instructor ~]# parted /dev/sdb mklabel gpt修改分区表格式 [root@instructor ~]# parted /dev/sdb print查看系统分区表信息
2. 创建与删除分区
创建新的分区需要使用parted命令的mkpart指令,语法格式如下:
parted [磁盘] mkpart 分区类型文件系统类型开始结束
其中,mkpart指令为创建新的分区,分区类型有:primary、logical、extended三种,文件系统类型有:fat16、fat32、ext2、ext3、linux-swap等,开始与结束标记区分开始与结束的位置(默认为MB)。
[root@instructor ~]# parted /dev/sdb mkpart primary ext3 1 1G
上面的命令将创建一个格式为ext3的主分区,从磁盘的第1MB开始分区,到1GB结束。
[root@instructor ~]# parted /dev/sdb rm 3(编号)使用rm指令删除分区
除了基本的创建与删除外,利用parted命令还可以进行分区检查、调整分区大小、还原误删除分区等操作。
2.4.2 格式化与挂载文件系统
使用mkfs命令来完成格式化操作,其中Linux系统默认文件系统格式为ext4格式。对于交换分区,我们需要使用单独的mkswap命令实现格式化的工作。
[root@instructor ~]# mkfs.ext4 /dev/sdb5 [root@instructor ~]# mkswap /dev/sdb3
挂载可以使用命令或修改系统文件两种方式。第一种方式使用mount命令实现文件系统的挂载。
mount
描述:挂载文件系统
用法:mount [选项] [ -o[选项] ] 设备|目录
选项:-a挂载/etc/fstab文件中所有未挂载的文件系统
-t指定文件系统类型(包括: adfs, affs, autofs, cifs, coda, coherent, cramfs,
debugfs, devpts, efs, ext, ext2, ext3, ext4, hfs, hfsplus, hpfs, iso9660, jfs, minix, msdos, ncpfs, nfs, nfs4, ntfs, proc, qnx4, ramfs, reiserfs, romfs, squashfs, smbfs, sysv, tmpfs, ubifs, udf, ufs, umsdos, usbfs, vfat, xenix, xfs, xiafs),默认ext4。
-o指定挂载属性,具体属性可参考man帮助手册
第二种方式是修改系统文件/etc/fstab,该文件共计六列,第一列为设备名称或设备标签,第二列为挂载点名称(挂载点为用户自己创建的目录),第三列为文件系统类型,第四列为挂载属性,第五列指定该文件系统是否使用dump进行备份(0表示不备份,1表示每天备份),第六列指定该文件系统在开机后使用fsck程序进行磁盘检测的顺序(根文件系统需要指定为1,其他文件系统一般为2,如果为0,则表示不需要进行磁盘检测)。
/dev/sda6 /123 ext4 defaults 0 0
2.4.3 LVM逻辑卷概述
LVM(Logical Volume Manager)是基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统的大小。LVM的快照功能可以帮助我们快速备份数据。
物理卷(Physical Volume,PV):物理卷是LVM最底层概念,是LVM的逻辑存储块,物理卷与磁盘分区是逻辑的对应关系。
卷组(Volume Group,VG):卷组是LVM逻辑概念上的磁盘设备,通过将单个或多个物理卷组合后生成卷组。
物理长度(Physical Extent,PE):物理长度是将物理卷组合为卷组后,所划分的最小存储单位,即逻辑意义上磁盘的最小存储单元。LVM默认PE大小为4MB。
逻辑卷(Logical Volume,LV):逻辑卷就是LVM逻辑意义上的分区,我们可以指定从卷组中提取多少容量来创建逻辑卷,最后对逻辑卷格式化并挂载使用。
将分区转换为物理卷的命令是pvcreate,将物理卷组合为卷组的命令是vgcreate,从卷组中提取容量创建逻辑卷的命令是lvcreate。创建完成后可以分别使用pvdisplay、vgdisplay、lvdisplay查看效果。
1. pvcreate
描述:使用LVM对磁盘或分区进行初始化
用法:pvcreate [选项] 物理卷 [物理卷...]
2. vgcreate-s指定PE大小
描述:创建卷组
用法:vgcreate [选项] 卷组名称 物理设备路径 [物理设备路径...]
3. lvcreate
描述:在已存在的卷组中创建逻辑卷
用法:lvcreate [选项] 卷组名称或路径 [物理卷路径]
选项:-l指定使用多少个卷组中的PE创建逻辑卷,PE容量在创建卷组时已经指定
-L直接指定逻辑卷的容量大小,单位可以是b(B)、s(S)、k(K)、m(M)、g(G)、t(T)、p(P)、e(E)
-n指定逻辑卷名称
[root@instructor ~]# pvcreate /dev/sdb{5,6,7} [root@instructor ~]# vgcreate -s 8M ceshi_vg1 /dev/sdb{5,6} [root@instructor ~]# lvcreate -l 40 -n ceshi_lv1 ceshi_vg1 /dev/sdb6
指定使用/dev/sdb6这个物理卷的存储空间
附:修改分区标签为LVM,即8e
2.4.5 修改LVM分区容量
使用lvextend命令调整逻辑卷大小。但lvextend仅调整逻辑卷大小,使用该命令调整完逻辑卷大小后,还需要使用resize2fs命令更新文件系统的大小。
[root@instructor ~]# lvextend -L +100M /dev/mapper/ceshi_vg1-ceshi_lv1 [root@instructor ~]# resize2fs /dev/mapper/ceshi_vg1-ceshi_lv1
LVM的卷组也是可以动态调整容量大小的,这是需要使用fdisk创建一个新的分区,并使用pvcreate命令转换为物理卷格式,接着通过vgextend将新的物理卷追加至现有的卷组空间中,最后使用lvextend调整逻辑卷的容量。
[root@instructor ~]# vgextend ceshi_vg1 /dev/sdb7
2.4.6 删除LVM分区
使用LVM命令轻松地删除之前创建的物理卷、卷组、逻辑卷。删除的顺序应该与创建时的顺序相反,也就是卸载文件系统、删除逻辑卷、删除卷组、删除物理卷。
[root@instructor ~]# lvremove /dev/mapper/ceshi_vg1-ceshi_lv1 [root@instructor ~]# vgremove ceshi_vg1 [root@instructor ~]# pvremove /dev/sdb{5,6,7}
2.4.7 RAID磁盘阵列概述
RAID(Redundant Array of Independent Disk)虚拟存储系统。RAID即独立冗余磁盘阵列,其思想是将多块独立的磁盘按不同的方式组合为一个逻辑磁盘,从而提高存储容量,提升存储性能或提供数据备份功能。
RAID分为软件RAID和硬件RAID两类。硬件RAID通常需要有RAID卡,RAID卡本身会有独立的控制部件和内存,所以不会占有系统资源,效率高、性能强。
2.4.8 RAID级别
1. RAID 0(不含校验与冗余的条带存储)
多块磁盘组合为RAID 0 后,数据将被分割并分别存储在每块硬盘中,所以能最大地提升存储性能与存储空间,但无法容错,RAID 0 至少需要两块磁盘。
如果一个文件要写入RAID 0 ,则该文件会被分割为多个部分,DATA1与DATA2被分别同步存入磁盘1和磁盘2,其他部分依次类推。读取该文件时,将同时从磁盘1和磁盘2中读取数据。
缺点:因为没有校验与备份,两块硬盘中如果有一块磁盘损坏,即磁盘中的任何一个数据损坏将导致整个文件无法读取。
2. RAID 1 (不含校验的镜像存储)
多块磁盘组合为RAID 1 后,数据将被同时复制到每块硬盘中,制作这种磁盘阵列至少需要两块硬盘,该级别的RAID只要有一块硬盘可用,即可正常工作,该级别的阵列安全性是最好的,磁盘利用率是最低的。
如果一个 文件要写入RAID 1 ,则该文件会写入磁盘1,同时以复制备份的形式写入磁盘2,DATA1与DATA2被同时存入磁盘1和磁盘2,其他部分依此类推。RAID 1 写入数据的效率会降低,因为相同数据需要同时写入两块磁盘,但RAID 1 读取数据的效率会提升,因为数据可以同时从两块硬盘读取数据。
缺点:RAID 1 写入效率低下。此外,磁盘的利用率极低,为总空间的一般。
3. RAID 2 (位级别的校验式条带存储)
多块磁盘组合为RAID 2 后,数据将以位(bit)为单位同步式分别存储在不同的硬盘上,并采用海明码(海明码是一种具有纠错功能的校验码)对数据进行校验与恢复。
如果一个文件要写入RAID 2 ,则该文件会被分成数据位分别同步写入不同的磁盘中,DATA1和DATA2进行海明码运算后再写入校验盘中,其他部分以此类推。拥有校验位的RAID 2 允许三块磁盘中任何一块磁盘损坏,并能够对未损坏的两块磁盘进行运算后还原已损坏磁盘上额数据,从而实现数据恢复的功能。RAID 2 对大量数据的读写具有很高的性能,但对少量数据的读写时性能反而不好,该磁盘阵列至少需要三块硬盘。
4. RAID 3 (字节级别的校验式条带存储)
该级别的磁盘阵列可以参考RAID 2 的读写原理,仅数据分割的单位为字节。
5. RAID 4 (数据块级别的校验式条带存储)
该级别的磁盘阵列与RAID 2 类似,仅数据分割单位不同。block
6. RAID 5 (数据块级别的分布式校验条带存储)
多块磁盘组合为RAID 5 后,数据将以块(block)为单位同步式分别存储在不同的硬盘上,并对数据进行海明码运算,与其他级别不同的是,该级别的海明码会被写入不同的磁盘。
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。
当数据写入时,首先会以条带的方式同步写入由两个RAID 1 组合而成的RAID 0 中,随后,当数据被写入由具体磁盘组成的RAID 1 时,又可以实现双磁盘镜像功能。
缺点:RAID 10 继承了RAID 0 和RAID 1 的优点,但同时也继承了一些缺点,RAID 10 的磁盘利用率很低,只有50%。
2.4.9 创建与管理RAID实例
1. 创建硬盘分区
Hex code (type L to list codes): fd格式fd为RAID格式
2. 创建RAID(本例将分别创建RAID 0 与RAID 5)
Linux中创建磁盘阵列可以使用mdadm命令,在Centos 6.3中,目前支持的RAID级别有RAID 0 、RAID 1、RAID 4、RAID 5、RAID 6、RAID 10。
mdadm
描述:管理linux软件RAID设备
用法:mdadm [模式] 选项 <RAID设备>
选项:-C创建软件RAID(create)
-l指定RAID级别(level)
-n指定磁盘个数
-x指定备用设备个数
[root@instructor ~]# mdadm -C /dev/md0 -l 0 -n 4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 [root@instructor ~]# mdadm -C /dev/md5 -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}2 [root@instructor ~]# mdadm --detail /dev/md0查看md0信息
3. 格式化与挂载
[root@instructor ~]# mkfs.ext4 /dev/md0 [root@instructor ~]# mkfs.ext4 /dev/md5
将磁盘阵列设备设置为开机自动挂载项,Centos系统开机会读取磁盘阵列的配置文件/etc/mdadm.conf以启动RAID设备。下面两条命令可以帮助我们快速创建这样的配置文件,DEVICE行代表填写所有磁盘阵列的设备成员名称,ARRAY行描述磁盘阵列具体的基本信息,包括名称、级别、UUID等信息。
[root@instructor ~]# echo "DEVICE /dev/sdb1 /dev/sdb2 /dev/sdc1 /dev/sdc2 /dev/sdd1 /dev/sdd2 /dev/sde1 /dev/sde2" > /etc/mdadm.conf [root@instructor ~]# mdadm -Evs >> /dev/mdadm.conf [root@instructor ~]# cat /dev/mdadm.conf ARRAY /dev/md/5 level=raid5 metadata=1.2 num-devices=3 UUID=762e0a76:527fd9d4:2e6ff87d:297dfa17 name=instructor.example.com:5 spares=1 devices=/dev/sdb2,/dev/sdc2,/dev/sdd2,/dev/sde2 ARRAY /dev/md/0 level=raid0 metadata=1.2 num-devices=4 UUID=16eaae13:deb2233a:cf5b1611:b1971321 name=instructor.example.com:0 devices=/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1 [root@instructor ~]# echo "/dev/md0 /raid0 ext4 defaults 0 0" >> /etc/fstab [root@instructor ~]# echo "/dev/md5 /raid5 ext4 defaults 0 0" >> /etc/fstab
2.4.10 RAID性能测试
[root@instructor ~]# time dd if=/dev/zero of=/raid5/1.txt bs=1M count=1500 [root@instructor ~]# time dd if=/dev/zero of=/raid0/1.txt bs=1M count=1500
设备或分区hdparm -t /dev/sd
2.4.11 RAID故障模拟
[root@instructor ~]# mdadm /dev/md5 -f /dev/sdb2 mdadm: set /dev/sdb2 faulty in /dev/md5
注释:使用-f选项(failed)模拟磁盘sdb2的损坏
由于上面做性能测试时已经往RAID 5 中写入了1.5GB的数据,所以使用命令模拟磁盘损坏后,快速查看RAID详细信息可以看出正在使用/dev/sde2重建数据(还原数据),而原来的/dev/sdb2成了损坏的空闲设备。