一、逻辑卷管理机制LVM
(一)基本概念
LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备,并允许用户动态调整文件系统的大小
我们在实际使用 Linux 服务器的时候,总会有一个让人头疼的问题,随着业务的增加,文件系统负载会越来越大,当到了空间不足的情况时,如果我们还在使用传统的分区方式管理硬盘,就不得不将现有的所有分区全部删除,并重新规划新的存储方案。
不仅如此,分区到底应该分多大呢?分得太大,会浪费硬盘空间;分得太小,又会面临不够使用的情况。如果在安装系统时规划不合理,这种困扰就会经常出现。如果出现了分区不够用的情况,应该怎么办?
在以往(2.4 内核以前)要想调整分区大小,要么先新建立一个更大的分区,然后复制旧分区中的内容到新分区,最后使用软链接来替代旧分区;要么使用调整分区大小的工具(如 parted),parted 虽然可以调整分区大小,但是它需要卸载分区之后才可以进行,也就是说需要停止服务。
其实,从一开始,我们就需要有一种管理机制来帮助我们动态地管理存储,LVM 就提供了这种功能。LVM 最大的好处就是可以随时调整分区的大小,分区中的现有数据不会丟失,并且不需要卸载分区、停止服务
LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,
可提高磁盘分区管理的灵活性。RHEL5默认安装的分区格式就是LVM逻辑卷的格式,需要注意的是/boot分区不能基于LVM创建,必须独立出来。
- ①PE (Physical Extend) 物理扩展 :每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
- ②PV (Physical Volume) 物理卷:就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
- ③VG (Volume Group) LVM卷组:类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
- ④LV(Logical Volume) 逻辑卷:类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。
- ⑤LE(Logical Extent) :逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
我们知道在使用LVM对磁盘进行动态管理以后,我们是以逻辑卷的方式呈现给上层的服务的。所以我们所有的操作目的,其实就是去创建一个LV(Logical Volume),逻辑卷就是用来取代我们之前的分区,我们通过对逻辑卷进行格式化,然后进行挂载操作就可以使用了。
可以理解为:
PV:是物理的磁盘分区;VG:LVM中的物理的磁盘分区,也就是PV,必须加入VG,可以将VG理解为一个仓库或者是几个大的硬盘;LV:也就是从VG中划分的逻辑分区
所以在建立 LVM 的时候,需要按照以下步骤来进行:
- 把物理硬盘分成分区,当然也可以是整块物理硬盘;
- 把物理分区建立为物理卷(PV),也可以直接把整块硬盘都建立为物理卷。
- 把物理卷整合为卷组(VG)。卷组就已经可以动态地调整大小了,可以把物理分区加入卷组,也可以把物理分区从卷组中删除。
- 把卷组再划分为逻辑卷(LV),当然逻辑卷也是可以直接调整大小的。我们说逻辑卷可以想象为分区,所以也需要格式化和挂载。
(二)物理卷PV
1.建立分区
[root@admin ~]# parted
GNU Parted 3.1
使用 /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) select /dev/sdb
使用 /dev/sdb
(parted) mklabel gpt
(parted) mkpart 1 ext2 0% 25%
(parted) mkpart 2 ext2 25% 50%
(parted) mkpart 3 ext3 50% 75%
(parted) mkpart 4 xfs 75% 100%
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 1049kB 5369MB 5368MB 1
2 5369MB 10.7GB 5369MB 2
3 10.7GB 16.1GB 5369MB 3
4 16.1GB 21.5GB 5368MB 4
2.建立物理卷
#建立物理卷命令如下:
[root@admin ~]# pvcreate [设备文件名]
在建立物理卷时,我们既可以把整块硬盘都建立成物理卷,也可以把某个分区建立成物理卷。如果要把整块硬盘都建立成物理卷,则命令如下:
[root@admin ~]# pvcreate /dev/sdb
在我们的使用中要把分区建立成物理卷,所以执行以下命令:
[root@admin ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[root@admin ~]# pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
[root@admin ~]# pvcreate /dev/sdb3
Physical volume "/dev/sdb3" successfully created.
#也可以一次性创建 pvcreate /dev/sdb1 /dev/sdb2 /dev/sdb3
3.查看物理卷
查看物理卷的命令有三个,用来查询系统中哪些硬盘或分区是物理卷。命令如下:
- pvs
[root@admin ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <99.72g 8.00m
/dev/sdb1 lvm2 --- <5.00g <5.00g
/dev/sdb2 lvm2 --- 5.00g 5.00g
/dev/sdb3 lvm2 --- 5.00g 5.00g
- pvscan
[root@admin ~]# pvscan
PV /dev/sda2 VG centos lvm2 [<99.72 GiB / 8.00 MiB free]
PV /dev/sdb3 lvm2 [5.00 GiB]
PV /dev/sdb1 lvm2 [<5.00 GiB]
PV /dev/sdb2 lvm2 [5.00 GiB]
Total: 4 [<114.72 GiB] / in use: 1 [<99.72 GiB] / in no VG: 3 [<15.00 GiB]
可以看到,在我们的系统中,/dev/sda2和/dev/sdb1~3 这四个分区是物理卷。最后一行的意思是:共有 4 个物理卷[大小]/使用了 1 个卷[大小]/空闲 3 个卷[大小]
- pvdisplay
它可以查看到更详细的物理卷状态
[root@admin ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <99.72 GiB / not usable 0
Allocatable yes
PE Size 4.00 MiB
Total PE 25528
Free PE 2
Allocated PE 25526
PV UUID 0BZ0Fj-Chto-UjJM-1C8c-sllG-LZgX-RchmZs
"/dev/sdb3" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb3
VG Name #属于的VG名,还没有分配,所以空白
PV Size 5.00 GiB #PV 的大小
Allocatable NO #是否已经分配
PE Size 0 #PE大小,因为还没有分配,所以PE大小也没有指定
Total PE 0 #PE总数
Free PE 0 #空闲PE数
Allocated PE 0 #空闲 PE数
PV UUID DDW1V9-pkXb-xsJ5-D2HA-sODp-w0Gp-n0ODwJ #PV的UUID
"/dev/sdb1" is a new physical volume of "<5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size <5.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID ugZFrX-JKHZ-XWUX-9kx0-cfjE-07q5-ljzYrR
"/dev/sdb2" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb2
VG Name
PV Size 5.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 1fm6hC-75P2-sFSx-fRBZ-VvIq-fkrj-eSdijN
4.删除物理卷
格式: pvremove PV …
[root@admin ~]# pvcreate /dev/sdc1 /dev/sdc2
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdc2" successfully created.
[root@admin ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <99.72g 8.00m
/dev/sdb1 lvm2 --- <5.00g <5.00g
/dev/sdb2 lvm2 --- 5.00g 5.00g
/dev/sdb3 lvm2 --- 5.00g 5.00g
/dev/sdc1 lvm2 --- 1.86g 1.86g
/dev/sdc2 lvm2 --- 951.81g 951.81g
[root@admin ~]# pvremove /dev/sdc1 /dev/sdc2
Labels on physical volume "/dev/sdc1" successfully wiped.
Labels on physical volume "/dev/sdc2" successfully wiped.
[root@admin ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <99.72g 8.00m
/dev/sdb1 lvm2 --- <5.00g <5.00g
/dev/sdb2 lvm2 --- 5.00g 5.00g
/dev/sdb3 lvm2 --- 5.00g 5.00g
在删除物理卷时,物理卷必须不属于任何卷组,也就是需要先将物理卷从卷组中删除,再删除物理卷。其实所有的删除就是把创建过程反过来,建立时不能少某个步骤,删除时也同样不能跳过某一步直接删除。
(三)卷组VG
按照建立逻辑卷的步骤,上面已经建立好了物理卷(sdb1~sdb3),接下来就该建立卷组了
可以把卷组想象成基本分区中的硬盘,是由多个物理卷组成的。卷组就已经可以动态地调整空间大小了,当卷组空间不足时,可以向卷组中添加新的物理卷。
1.建立卷组
格式:vgcreate [-s PE数量] 卷组名 物理卷名
[-s PE数量 ] 选项的含义是指定 PE 的大小,单位可以是 MB、GB、TB 等。如果不写,则默认 PE 大小是 4MB。这里的卷组名指的就是要创建的卷组的名称(自己指定的),而物理卷名则指的是希望添加到此卷组的所有硬盘区分或者整个硬盘。
上面我们建立了三个物理卷(/dev/sdb1~/dev/sdb3),将sdb1和sdb2加入卷组
[root@admin ~]# vgcreate -s 5M myvg01 /dev/sdb1 /dev/sdb2
Volume group "myvg01" successfully created
2.查看卷组
查看卷组的命令同样有三个:vgs和vgscan 命令主要用于查看系统中是否有卷组;而 vgdisplay 命令则用于查看卷组的详细状态。
- vgs
[root@admin ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- <99.72g 8.00m
myvg01 2 0 0 wz--n- 9.99g 9.99g
- vgscan
[root@admin ~]# vgscan
Reading volume groups from cache.
Found volume group "centos" using metadata type lvm2
Found volume group "myvg01" using metadata type lvm2
- vgdisplay
[root@admin ~]# vgdisplay
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size <99.72 GiB
PE Size 4.00 MiB
Total PE 25528
Alloc PE / Size 25526 / 99.71 GiB
Free PE / Size 2 / 8.00 MiB
VG UUID J8a7eu-dBD0-1YEp-gHeF-aETn-RnSP-dTRKde
--- Volume group ---
VG Name myvg01 #卷组名
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write #卷组访问状态
VG Status resizable #卷组状态
MAX LV 0 #最大逻辑卷数
Cur LV 0
Open LV 0
Max PV 0 #最大物理卷数
Cur PV 2 #当前物理卷数(即sdb1和sdb2)
Act PV 2
VG Size 9.99 GiB #卷组大小
PE Size 5.00 MiB #PE大小
Total PE 2046 #PE总数
Alloc PE / Size 0 / 0 #已用 PE 数量/大小
Free PE / Size 2046 / 9.99 GiB #空闲PE数量/大小
VG UUID 49BQre-YuON-67vA-QYWY-LN3d-dPqA-baUaqk #VG的UUID
3.卷组的扩容
格式: vgextend VG PV
VG:需要扩容的卷组的卷组名
PV:被添加的物理卷
将/dev/sdb3加入刚才创建的卷组myvg01
[root@admin ~]# vgextend myvg01 /dev/sdb3
[root@admin ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <99.72g 8.00m
/dev/sdb1 myvg01 lvm2 a-- <5.00g <5.00g
/dev/sdb2 myvg01 lvm2 a-- <5.00g <5.00g
/dev/sdb3 myvg01 lvm2 a-- <5.00g <5.00g #添加成功
[root@admin ~]# vgdisplay
……省略……
Max PV 0
Cur PV 3 #物理卷数增加
Act PV 3
VG Size <14.99 GiB #卷组容量增加
PE Size 5.00 MiB
Total PE 3069
Alloc PE / Size 0 / 0
Free PE / Size 3069 / <14.99 GiB
VG UUID 49BQre-YuON-67vA-QYWY-LN3d-dPqA-baUaqk
4.卷组的缩容
既然可以增加卷组容量,当然也可以减少卷组容量
格式: vgreduce VG PV
VG:需要缩容的卷组的卷组名
PV:被移除的物理卷
将卷组myvg01中的物理卷/dev/sdb3删除
[root@admin ~]# vgreduce myvg01 /dev/sdb3
Removed "/dev/sdb3" from volume group "myvg01"
[root@admin ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <99.72g 8.00m
/dev/sdb1 myvg01 lvm2 a-- <5.00g <5.00g
/dev/sdb2 myvg01 lvm2 a-- <5.00g <5.00g
/dev/sdb3 lvm2 --- 5.00g 5.00g #可以看到sdb3不属于myvg01卷组了,但它还是个物理卷
即是以物理卷为单位减小卷组的大小
5.删除卷组
格式: vgremove VG
删除卷组myvg01
[root@admin ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- <99.72g 8.00m
myvg01 2 0 0 wz--n- 9.99g 9.99g
[root@admin ~]# vgremove myvg01
Volume group "myvg01" successfully removed
[root@admin ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- <99.72g 8.00m
(四)逻辑卷LV
1.建立逻辑卷
将卷组划分为逻辑卷,可以把逻辑卷想象成分区,那么这个逻辑卷当然也需要被格式化和挂载。另外,逻辑卷也是可以动态调整大小的,而且数据不会丟失,也不用卸载逻辑卷。
格式: lvcreate [选项] 卷组名
选项:
- -L 容量:指定逻辑卷大小,单位为 MB、GB、TB 等;
- -l PE个数:按照 PE 个数指定逻辑卷大小,这个参数需要换算容量,较麻烦;
- -n 逻辑卷名:指定逻辑卷名;
将上面删除的卷组重新添加回来
[root@admin ~]# vgcreate -s 5M myvg01 /dev/sdb1 /dev/sdb2
Volume group "myvg01" successfully created
[root@admin ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- <99.72g 8.00m
myvg01 2 0 0 wz--n- 9.99g 9.99g
[root@admin ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <99.72g 8.00m
/dev/sdb1 myvg01 lvm2 a-- <5.00g <5.00g
/dev/sdb2 myvg01 lvm2 a-- <5.00g <5.00g
现在已经建立了 10GB 大小的卷组 myvg01,其中物理卷为 /dev/sdb1 和 /dev/sdb2 接下来需要在卷组中建立逻辑卷。
建立一个 2GB 大小名为 mylv01 的逻辑卷:
[root@admin ~]# lvcreate -n mylv01 -L 2G myvg01
Rounding up size to full physical extent 2.00 GiB
Logical volume "mylv01" created.
建立完逻辑卷,还要在格式化和挂载之后才能正常使用。格式化和挂载命令与操作普通分区时是一样的。
需要注意的是,逻辑卷的设备文件名是 “/dev/卷组名/逻辑卷名” ,如以上创建的逻辑卷 mylv01 的设备文件名就是 /dev/myvg01/mylv01
格式化逻辑卷:
[root@admin ~]# mkfs.xfs /dev/myvg01/mylv01
meta-data=/dev/myvg01/mylv01 isize=512 agcount=4, agsize=131200 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载逻辑卷:
[root@admin ~]# mount /dev/myvg01/mylv01 /data
#查看挂载情况
[root@admin ~]# mount | grep mylv01
/dev/mapper/myvg01-mylv01 on /data type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
[root@admin ~]# lsblk -f /dev/myvg01/mylv01
NAME FSTYPE LABEL UUID MOUNTPOINT
myvg01-mylv01 xfs f3c1e6e0-40b5-4d9a-904a-7d34203c81dd /data
[root@admin ~]# df -h /dev/myvg01/mylv01
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/myvg01-mylv01 2.0G 33M 2.0G 2% /data
当然,如果需要开机后自动挂载,则要在 /etc/fstab 文件中写入挂载语句
2.查看逻辑卷
查看逻辑卷的命令有三个
- lvs [LV]
[root@admin ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos -wi-ao---- 9.31g
root centos -wi-ao---- 86.67g
swap centos -wi-ao---- <3.73g
mylv01 myvg01 -wi-ao---- 2.00g
- lvscan [LV]
[root@admin ~]# lvscan
ACTIVE '/dev/centos/swap' [<3.73 GiB] inherit
ACTIVE '/dev/centos/root' [86.67 GiB] inherit
ACTIVE '/dev/centos/home' [9.31 GiB] inherit
ACTIVE '/dev/myvg01/mylv01' [2.00 GiB] inherit
- lvdisplay [LV]
可以查看逻辑卷的详细信息
[root@admin ~]# lvdisplay /dev/myvg01/mylv01
--- Logical volume ---
LV Path /dev/myvg01/mylv01 #逻辑卷的设备文件名
LV Name mylv01 #逻辑卷名
VG Name myvg01 #所属的卷组名
LV UUID ioSq12-4tua-UmA1-CPp1-PwOO-Mfxk-UVyjKq
LV Write Access read/write
LV Creation host, time admin, 2020-10-12 22:01:06 +0800
LV Status available
# open 1
LV Size 2.00 GiB #逻辑卷大小
Current LE 410
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
3.调整逻辑卷大小
Ⅰ.逻辑卷的扩容
格式: lvextend 选项 LV
选项:
- -L 容量:安装容量调整大小,单位为 KB、GB、TB 等。使用 + 増加空间,- 代表减少空间。如果直接写容量,则代表设定逻辑卷大小为指定大小;
- -l PE个数:按照 PE 个数调整逻辑卷大小;
将逻辑卷 /dev/myvg01/mylv01 扩容至7G
[root@admin ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos -wi-ao---- 9.31g
root centos -wi-ao---- 86.67g
swap centos -wi-ao---- <3.73g
mylv01 myvg01 -wi-ao---- 2.00g
[root@admin ~]# vgs /dev/myvg01
VG #PV #LV #SN Attr VSize VFree
myvg01 2 1 0 wz--n- 9.99g <7.99g
可以看到逻辑卷mylv01的大小是2G,而且 mylv01 逻辑卷所属卷组 myvg01 还有7.99G的空间,那么说明可以为该逻辑卷进行扩容。如果该逻辑卷所属卷组没有空余的空间那么便不能直接对该逻辑卷进行扩容,还需要先对卷组进行扩容后才能对 逻辑卷进行扩容
#进行扩容
[root@admin ~]# lvextend -L 7G /dev/myvg01/mylv01
Size of logical volume myvg01/mylv01 changed from 2.00 GiB (410 extents) to 7.00 GiB (1434 extents).
Logical volume myvg01/mylv01 successfully resized.
其实上面的命令也可以这样写: lvextend -L +5G /dev/myvg01/mylv01
#即在原有的基础上再加 5G 就是 7G
查看 mylv01 逻辑卷的大小是否改变
[root@admin ~]# lvs /dev/myvg01/mylv01
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv01 myvg01 -wi-ao---- 7.00g
可以看到,逻辑卷的大小已经改变,但是似乎有些问题:
[root@admin ~]# df -h /dev/myvg01/mylv01
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/myvg01-mylv01 2.0G 33M 2.0G 2% /data
怎么 /data 分区的大小还是 2.0GB ?
刚刚只是逻辑卷的大小改变了,如果要让分区使用这个新逻辑卷,则还要使用相关命令来调整分区的大小。不过这里就体现出了 LVM 的优势:我们不需要卸载分区,直接就能调整分区的大小。
将扩容后的逻辑卷写入分区中:
- 如果对于xfs系统的则使用 xfs_growfs LV 命令
- 如果对于xfs系统的则使用 resize2fs LV 命令
因为前面将逻辑卷mylv01格式化为xfs,所以这里要使用 xfs_growfs 写入分区:
[root@admin ~]# xfs_growfs /dev/myvg01/mylv01
meta-data=/dev/mapper/myvg01-mylv01 isize=512 agcount=4, agsize=131200 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=524800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 524800 to 1835520
[root@admin ~]# df -h /dev/myvg01/mylv01
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/myvg01-mylv01 7.0G 33M 7.0G 1% /data
#如果格式化后的逻辑卷文件系统是ext系列,则为 resize2fs /dev/myvg01/mylv01
并且在扩容前的数据并不会丢失
这样当你系统上的某个磁盘的容量已满,就可以在不删除数据的同时动态的进行磁盘扩容了,当然前提是得支持LVM
Ⅱ.逻辑卷的缩容
如果要减少逻辑卷的容量,则只需把增加步骤反过来再做一遍就可以了。不过我们并不推荐减少逻辑卷的容量,因为这有可能导致数据丟失。
第一种:ext系列文件系统
①创建逻辑卷mylv02,格式化为ext3
[root@admin ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- <99.72g 8.00m
myvg01 2 1 0 wz--n- 9.99g <5.99g
#创建基于卷组myvg01的逻辑卷mylv02,大小为2G
[root@admin ~]# lvcreate -n mylv02 -L 2G /dev/myvg01
Rounding up size to full physical extent 2.00 GiB
Logical volume "mylv02" created.
[root@admin ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos -wi-ao---- 9.31g
root centos -wi-ao---- 86.67g
swap centos -wi-ao---- <3.73g
mylv01 myvg01 -wi-a----- 4.00g
mylv02 myvg01 -wi-a----- 2.00g
[root@admin ~]# mkfs.ext3 /dev/myvg01/mylv02 #将创建好的逻辑卷mylv02格式化为ext3
mke2fs 1.42.9 (28-Dec-2013)
warning: 512 blocks unused.
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131328 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8208 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
②检查逻辑卷空间
[root@admin ~]# e2fsck -f /dev/myvg01/mylv02 #必须强制检测,否则缩减的时候会提示
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/myvg01/mylv02: 11/131328 files (0.0% non-contiguous), 25421/524288 blocks
③挂载
[root@admin ~]# mount /dev/myvg01/mylv02 /data
④在挂载目录/data下创建文件
[root@admin ~]# cd /data
[root@admin data]# touch file
[root@admin data]# ls
file
⑤缩减逻辑卷大小(缩减前先通过umount命令卸载掉逻辑卷)
[root@admin ~]# umount /dev/myvg01/mylv02
[root@admin ~]# lvreduce -L 1G /dev/myvg01/mylv02
Rounding size to boundary between physical extents: 1.00 GiB.
WARNING: Reducing active logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg01/mylv02? [y/n]: y
Size of logical volume myvg01/mylv02 changed from 2.00 GiB (410 extents) to 1.00 GiB (205 extents).
Logical volume myvg01/mylv02 successfully resized.
⑥查看缩减是否成功
[root@admin ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos -wi-ao---- 9.31g
root centos -wi-ao---- 86.67g
swap centos -wi-ao---- <3.73g
mylv01 myvg01 -wi-a----- 4.00g
mylv02 myvg01 -wi-a----- 1.00g
⑦继续挂载至/data目录下,并查看缩容前创建的文件是否还存在
[root@admin ~]# mount /dev/myvg01/mylv02 /data
[root@admin ~]# cd /data
[root@admin data]# ls
file
可以看到之前创建的文件依然存在,但是要是之前的数据文件大小超过1G(即超过缩容后的大小),那么数据便会损坏
ext系列文件系统可以直接进行缩容,只要缩容后的大小不小于源逻辑卷中数据存储大小,那么便不会影响逻辑卷中的数据信息,不会丢失
第二种:xfs文件系统
但是对xfs文件系统的逻辑卷进行缩容,比较麻烦。不能想ext系列直接进行缩容,这样会直接删除源逻辑卷中的所有数据信息,所以需先备份数据,然后缩容后进行格式化,然后进行挂载
①创建大小为3G的逻辑卷mylv03
[root@admin ~]# lvcreate -n mylv03 -L 3G /dev/myvg01
Rounding up size to full physical extent 3.00 GiB
Logical volume "mylv03" created.
[root@admin ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- <99.72g 8.00m
myvg01 2 3 0 wz--n- 9.99g 1.98g
[root@admin ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos -wi-ao---- 9.31g
root centos -wi-ao---- 86.67g
swap centos -wi-ao---- <3.73g
mylv01 myvg01 -wi-a----- 4.00g
mylv02 myvg01 -wi-a----- 1.00g
mylv03 myvg01 -wi-a----- 3.00g
②格式化为xfs系统
[root@admin ~]# mkfs.xfs /dev/myvg01/mylv03
meta-data=/dev/myvg01/mylv03 isize=512 agcount=4, agsize=196800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=787200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
③挂载
[root@admin ~]# mkdir /data3
[root@admin ~]# mount /dev/myvg01/mylv03 /data3
④在挂载目录创建数据信息(模拟数据信息)
[root@admin ~]# cd /data3
[root@admin data3]# touch file1 file2
[root@admin data3]# ls
file1 file2
⑤先将数据进行备份
[root@admin bak]# cp /data3/* /bak
[root@admin bak]# ls
file1 file2
⑥卸载并缩容
[root@admin ~]# umount /dev/myvg01/mylv03
[root@admin ~]# lvreduce -L 1G /dev/myvg01/mylv03
Rounding size to boundary between physical extents: 1.00 GiB.
WARNING: Reducing active logical volume to 1.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg01/mylv03? [y/n]: y
Size of logical volume myvg01/mylv03 changed from 3.00 GiB (615 extents) to 1.00 GiB (205 extents).
Logical volume myvg01/mylv03 successfully resized.
⑦查看缩容情况:
[root@admin ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos -wi-ao---- 9.31g
root centos -wi-ao---- 86.67g
swap centos -wi-ao---- <3.73g
mylv01 myvg01 -wi-a----- 4.00g
mylv02 myvg01 -wi-a----- 1.00g
mylv03 myvg01 -wi-a----- 1.00g #已经缩容为1G
⑧按照ext系列缩容的步骤,下面应该直接进行挂载
[root@admin ~]# mount /dev/myvg01/mylv03 /data3
mount: /dev/mapper/myvg01-mylv03:不能读超级块
可以看到这时是无法进行挂载的,和ext系列文件系统是不同的
⑨所以,这时要进行强制格式化
[root@admin ~]# mkfs.xfs -f /dev/myvg01/mylv03
meta-data=/dev/myvg01/mylv03 isize=512 agcount=4, agsize=65600 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=262400, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
⑩而后进行挂载,并查看/data3缩容之前创建的文件是否存在
[root@admin ~]# mount /dev/myvg01/mylv03 /data3
[root@admin ~]# cd /data3
[root@admin data3]# ls
[root@admin data3]#
那当然是不存在的,因为进行了格式化
⑪下面就需要将之前的备份下来的数据拷贝进来就好
[root@admin data3]# mv /bak/* ./
[root@admin data3]# ls
file1 file2
所以对于xhs文件系统的逻辑卷缩容比ext系列缩容麻烦许多
3.删除逻辑卷
删除了逻辑卷,其中的数据就会丟失,所以要确定你真的需要删除这个逻辑卷
格式: lvremove LV #LV即为逻辑卷的设备文件名
在删除之前切记要先卸载
删除 mylv01逻辑卷
[root@admin ~]# df -h /dev/myvg01/mylv01
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/myvg01-mylv01 7.0G 33M 7.0G 1% /data
[root@admin ~]# umount /dev/myvg01/mylv01
[root@admin ~]# lvremove /dev/myvg01/mylv01
Do you really want to remove active logical volume myvg01/mylv01? [y/n]: y
Logical volume "mylv01" successfully removed ##如果这里选择y,就会执行删除操作,逻辑卷内的所有数据都会被清空
[root@admin ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos -wi-ao---- 9.31g
root centos -wi-ao---- 86.67g
swap centos -wi-ao---- <3.73g
这样逻辑卷就被删除了
(五)LVM快照
快照就是将当时的系统信息记录下来,就好像照相记录一般。未来有任何数据修改,则原始数据会被搬移到快照区,没有被修改的区域则由快照区与文件系统共享
Linux LVM 允许我们在逻辑卷在线的状态下将其复制到另一设备上,此成功被称为快照功能。快照允许我们在复制的同时,保证运行关键任务的 Web 服务器或数据库服务继续工作。此外,LVM 的快照功能可以帮助我们快速备份数据
- 创建/dev/myvg01/mylv01逻辑卷,大小4G,格式化为xfs系统,并挂载至/data
[root@admin ~]# lvcreate -n mylv01 -L 4G /dev/myvg01
Rounding up size to full physical extent 4.00 GiB
WARNING: xfs signature detected on /dev/myvg01/mylv01 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/myvg01/mylv01.
Logical volume "mylv01" created.
[root@admin ~]# mkfs.xfs /dev/myvg01/mylv01
meta-data=/dev/myvg01/mylv01 isize=512 agcount=4, agsize=262400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1049600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@admin ~]# mount /dev/myvg01/mylv01 /data
[root@admin ~]# df -hT /dev/myvg01/mylv01
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/myvg01-mylv01 xfs 4.0G 33M 4.0G 1% /data
- 在/data目录下创建两个文件file1 和 file2
[root@admin ~]# cd /data
[root@admin data]# touch file1 file2
[root@admin data]# ls
file1 file2
- 此时创建mylv01逻辑卷的快照
#首先,要查看该逻辑卷所属卷组myvg01的剩余容量
[root@admin data]# vgdisplay /dev/myvg01
--- Volume group ---
VG Name myvg01
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 7
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 9.99 GiB
PE Size 5.00 MiB
Total PE 2046
Alloc PE / Size 820 / 4.00 GiB #已使用4G
Free PE / Size 1226 / <5.99 GiB #空闲约6G
VG UUID KI0Nlq-CgI7-e4i9-PfXS-cnho-Qesq-1oIsS7
- 创建/dev/myvg01/mylv01逻辑卷的快照,并命名为mylv01snap
[root@admin data]# lvcreate -s -L 4G -n mylv01snap /dev/myvg01/mylv01
Rounding up size to full physical extent 4.00 GiB
Logical volume "mylv01snap" created.
- -s :选项就是指定创建某个逻辑卷的快照
- -n :后面接快照的设备名称,之后的参数为需要被快照的 LV 完整文件名
- -L :后面则是指定此快照的大小
- -l :后面则是接PE数量
一般而言,快照的大小最好要和被快照的逻辑卷的大小相同,因为原始数据会被迁移到快照区,如果快照区不够大,那么快照区便容纳不了,这时候快照功能会失效。要确保最大限度的将数据能够全部快照记录下来。
如果卷组VG的容量不够创建快照,要先对卷组VG进行扩容
- 查看创建的快照
[root@admin data]# lvdisplay /dev/myvg01/mylv01snap
--- Logical volume ---
LV Path /dev/myvg01/mylv01snap
LV Name mylv01snap
VG Name myvg01
LV UUID eExhQo-XJmf-r06r-5MGC-6CJS-KGOz-OzvYIi
LV Write Access read/write
LV Creation host, time admin, 2020-10-13 14:51:28 +0800
LV snapshot status active destination for mylv01
LV Status available
# open 0
LV Size 4.00 GiB #原始盘,就是mylv01的原始容量
Current LE 820
COW-table size 4.00 GiB #此快照能够纪录的最大容量
COW-table LE 820
Allocated to snapshot 0.01% #目前已被用掉的容量
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:6
[root@admin data]# lsblk -f /dev/myvg01/mylv01 /dev/myvg01/mylv01snap
NAME FSTYPE LABEL UUID MOUNTPOINT
myvg01-mylv01 xfs ab95d420-5a75-4ff8-b23a-1fb1f241440e /data
myvg01-mylv01snap xfs ab95d420-5a75-4ff8-b23a-1fb1f241440e
可以看到,这两个文件系统是一模一样的,甚至连UUID都相同
- 下面,在创建了快照之后,我们在/data目录下再创建两个文件
[root@admin data]# touch file3 file4
[root@admin data]# ls
file1 file2 file3 file4
在创建快照之前创建了file1和file2文件,创建快照之后又创建了file3和file4文件
- 还原快照区数据(就是将快照区的数据还原到被快照的逻辑卷中)
还原之前切记要先进行卸载
[root@admin ~]# lvconvert --merge /dev/myvg01/mylv01snap
Merging of volume myvg01/mylv01snap started.
myvg01/mylv01: Merged: 100.00% #如果数据很大,那么此过程较长,耐心等待
[root@admin ~]# mount /dev/myvg01/mylv01 /data #挂载
[root@admin ~]# cd /data
[root@admin data]# ls
file1 file2
可以看到,数据恢复到快照之前了,恢复之后那么快照便不存在
二、RAID磁盘阵列
(一)基本原理
磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。
磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。
-----百度百科
RAID 的初衷是为大型服务器提供高端的存储功能和冗余的数据安全。在整个系统中, RAID 被看作是由两个或更多磁盘组成的存储空间,通过并发地在多个磁盘上读写数据来提高存储系统的 I/O 性能。大多数 RAID 等级具有完备的数据校验、纠正措施,从而提高系统的容错性,甚至镜像方式,大大增强系统的可靠性
RAID类型 | 需要磁盘数 | 利用率 | 优缺点 |
---|---|---|---|
RAID0 条带集 | n≥2 | 100% | 读写性能提升,不容错 |
RAID1 镜像集 | 2n (n≥1) | 50% | 读性能提升,写性能下降,有冗余能力 |
RAID5 奇偶校验条带集 | n≥3 | (n-1)/n | 读写性能提升,容错,允许一块磁盘损坏 |
RAID6奇偶校验条带集双校验 | n≥4 | (n-2)/n | 读写性能提升,容错,允许坏2块盘 |
RAID10 | n≥4 | 50% | 读写性能提升,容错 |
RAID01 | n≥4 | 50% | 读写性能提升,容错 |
RAID50 | 6 | (n-2)/n | 读写性能提升,容错 |
RAID60 | 8 | (n-4)/n | 读写性能提升,容错 |
镜像
镜像是一种冗余技术,为磁盘提供保护功能,防止磁盘发生故障而造成数据丢失。对于 RAID 而言,采用镜像技术 典型地 将会同时在阵列中产生两个完全相同的数据副本,分布在两个不同的磁盘驱动器组上。镜像提供了完全的数据冗余能力,当一个数据副本失效不可用时,外部系统仍可正常访问另一副本,不会对应用系统运行和性能产生影响。而且,镜像不需要额外的计算和校验,故障修复非常快,直接复制即可。镜像技术可以从多个副本进行并发读取数据,提供更高的读 I/O 性能,但不能并行写数据,写多个副本会会导致一定的 I/O 性能降低。
数据条带
磁盘存储的性能瓶颈在于磁头寻道定位,它是一种慢速机械运动,无法与高速的 CPU 匹配。再者,单个磁盘驱动器性能存在物理极限, I/O 性能非常有限。 RAID 由多块磁盘组成,数据条带技术将数据以块的方式分布存储在多个磁盘中,从而可以对数据进行并发处理。这样写入和读取数据就可以在多个磁盘上同时进行,并发产生非常高的聚合 I/O ,有效提高了整体 I/O 性能,而且具有良好的线性扩展性。这对大容量数据尤其显著,如果不分块,数据只能按顺序存储在磁盘阵列的磁盘上,需要时再按顺序读取。而通过条带技术,可获得数倍与顺序访问的性能提升。
数据校验
镜像具有高安全性、高读性能,但冗余开销太昂贵。数据条带通过并发性来大幅提高性能,然而对数据安全性、可靠性未作考虑。数据校验是一种冗余技术,它用校验数据来提供数据的安全,可以检测数据错误,并在能力允许的前提下进行数据重构。
相对镜像,数据校验大幅缩减了冗余开销,用较小的代价换取了极佳的数据完整性和可靠性。数据条带技术提供高性能,数据校验提供数据安全性, RAID 不同等级往往同时结合使用这两种技术。
采用数据校验时, RAID 要在写入数据同时进行校验计算,并将得到的校验数据存储在 RAID 成员磁盘中。校验数据可以集中保存在某个磁盘或分散存储在多个不同磁盘中,甚至校验数据也可以分块,不同 RAID 等级实现各不相同。当其中一部分数据出错时,就可以对剩余数据和校验数据进行反校验计算重建丢失的数据。校验技术相对于镜像技术的优势在于节省大量开销,但由于每次数据读写都要进行大量的校验运算,对计算机的运算速度要求很高,必须使用硬件 RAID 控制器。在数据重建恢复方面,检验技术比镜像技术复杂得多且慢得多。
(二)RAID 等级
1. RAID0
** RAID0 是一种简单的、无数据校验的数据条带化技术。** 实际上不是一种真正的 RAID ,因为它并不提供任何形式的冗余策略。 RAID0 将所在磁盘条带化后组成大容量的存储空间,将数据分散存储在所有磁盘中,以独立访问方式实现多块磁盘的并读访问。由于可以并发执行 I/O 操作,总线带宽得到充分利用。再加上不需要进行数据校验,RAID0 的性能在所有 RAID 等级中是最高的。理论上讲,一个由 n 块磁盘组成的 RAID0 ,它的读写性能是单个磁盘性能的 n 倍,但由于总线带宽等多种因素的限制,实际的性能提升低于理论值。
RAID0 具有低成本、高读写性能、 100% 的高存储空间利用率等优点,但是它不提供数据冗余保护,一旦数据损坏,将无法恢复。 因此, RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的应用,如视频、音频存储、临时数据缓存空间等。
2. RAID1
RAID1 称为镜像,它将数据完全一致地分别写到工作磁盘和镜像 磁盘,它的磁盘空间利用率为 50% 。RAID1 在数据写入时,响应时间会有所影响,但是读数据的时候没有影响。 RAID1 提供了最佳的数据保护,一旦工作磁盘发生故障,系统自动从镜像磁盘读取数据,不会影响用户工作。
RAID1 与 RAID0 刚好相反,是为了增强数据安全性使两块 磁盘数据呈现完全镜像,从而达到安全性
好、技术简单、管理方便。 RAID1 拥有完全容错的能力,但实现成本高。 RAID1 应用于对顺序读写性能要求高以及对数据保护极为重视的应用,如对邮件系统的数据保护。
3. RAID5
RAID5 应该是目前最常见的 RAID 等级, RAID5 具备很好的扩展性。当阵列磁盘数量增加时,并行操作量的能力也随之增长,从而拥有更高的容量以及更高的性能。RAID5 的磁盘上同时存储数据和校验数据,数据块和对应的校验信息存保存在不同的磁盘上,当一个数据盘损坏时,系统可以根据同一条带的其他数据块和对应的校验数据来重建损坏的数据。与其他 RAID等级一样,重建数据时, RAID5 的性能会受到较大的影响。
RAID5 兼顾存储性能、数据安全和存储成本等各方面因素,它可以理解为 RAID0 和 RAID1 的折中方案,是目前综合性能最佳的数据保护解决方案。 RAID5 基本上可以满足大部分的存储应用需求,数据中心大多采用它作为应用数据的保护方案。
4. RAID01 和 RAID10
RAID01 是先做条带化再作镜像,本质是对物理磁盘实现镜像;而 RAID10 是先做镜像再作条带化,是对虚拟磁盘实现镜像。相同的配置下,通常 RAID01 比 RAID10 具有更好的容错能力。
RAID01 兼备了 RAID0 和 RAID1 的优点,它先用两块磁盘建立镜像,然后再在镜像内部做条带化。 RAID01 的数据将同时写入到两个磁盘阵列中,如果其中一个阵列损坏,仍可继续工作,保证数据安全性的同时又提高了性能。 RAID01 和 RAID10 内部都含有 RAID1 模式,因此整体磁盘利用率均仅为 50% 。
5. RAID6
上述各个 RAID 等级都只能保护因单个磁盘失效而造成的数据丢失。如果两个磁盘同时发生故障,数据将无法恢复。 RAID6 引入双重校验的概念,它可以保护阵列中同时出现两个磁盘失效时,阵列仍能够继续工作,不会发生数据丢失。 RAID6 等级是在 RAID5 的基础上为了进一步增强数据保护而设计的一种 RAID 方式,它可以看作是一种扩展的 RAID5 等级。
(三)实现方式
通常计算机功能既可以由硬件来实现,也可以由软件来实现。对于 RAID 系统而言,自然也不例外,它可以采用软件方式实现,也可以采用硬件方式实现,或者采用软硬结合的方式实现
1. 软 RAID
软 RAID 没有专用的控制芯片和 I/O 芯片,完全由操作系统和 CPU 来实现所的 RAID 的功能。现代操作系统基本上都提供软 RAID 支持,通过在磁盘设备驱动程序上添加一个软件层,提供一个物理驱动器与逻辑驱动器之间的抽象层。目前,操作系统支持的最常见的 RAID 等级有 RAID0 、 RAID1 、 RAID10 、 RAID01 和 RAID5 等。
2. 硬 RAID
硬 RAID 拥有自己的 RAID 控制处理与 I/O 处理芯片,甚至还有阵列缓冲,对 CPU 的占用率和整体性能是三类实现中最优的,但实现成本也最高的 。硬 RAID 通常都支持热交换技术,在系统运行下更换故障磁盘。
硬 RAID 包含 RAID 卡和主板上集成的 RAID 芯片, 服务器平台多采用 RAID 卡。 RAID 卡由 RAID 核心处理芯片( RAID 卡上的 CPU )、端口、缓存和电池 4 部分组成。其中,端口是指 RAID 卡支持的磁盘接口类型,如 IDE/ATA 、 SCSI 、 SATA 、 SAS 、 FC 等接口。
3. 软硬混合 RAID
软 RAID 性能欠佳,而且不能保护系统分区,因此很难应用于桌面系统。而硬 RAID 成本非常昂贵,不同 RAID 相互独立,不具互操作性。因此,人们采取软件与硬件结合的方式来实现 RAID ,从而获得在性能和成本上的一个折中,即较高的性价比。
这种 RAID 虽然采用了处理控制芯片,但是为了节省成本,芯片往往比较廉价且处理能力较弱, RAID 的任务处理大部分还是通过固件驱动程序由 CPU 来完成。
三、VDO虚拟数据优化
VDO(Virtual Data Optimize虚拟数据优化):通过压缩或删除存储设备上的数据来优化存储空间
VDO层放置在现有块存储设备例如RAID设备或本地磁盘的顶部。这些块设备也可以是加密设备。存储层(如LVM logic卷和文件系统放置在VDO层的顶部。
VDO工作的三个阶段:
- 零区块的排除
在初始化阶段,整块为0的会被元数据记录下来 - 删除重复数据
在第二阶段,对于输入的数据会判断是不是冗余数据(在写入之前就判断),通过UDS内核模块来判断,被判断为重复数据的部分不会被写入,然后对元数据进行更新,直接指向原始已经存储的数据块即可 - 压缩
一旦消零和重删完成,LZ4压缩会对每个单独的数据块进行处理,然后压缩好的数据块会以固定大小4KB的数据块存储在介质上,由于一个物理块可以包含很多的压缩块,这个也可以加速读取的性能
#1 安装 VDO模块
yum install vdo kmod-kvdo -y
#2 创建VDO卷
[root@admin ~]# vdo create --name=vdo1 --device=/dev/sdc --vdoLogicalSize=10G --force
Creating VDO vdo1
Starting VDO vdo1
Starting compression on VDO vdo1
VDO instance 0 volume is ready at /dev/mapper/vdo1
[root@admin ~]# lsblk -f /dev/sdc
NAME FSTYPE LABEL UUID MOUNTPOINT
sdc vdo 1b6cd281-27d8-47e4-bf20-dc1fdd469b85
└─vdo1
#3 查看VDO状态
[root@admin ~]# vdo status --name=vdo1
VDO status:
Date: '2020-10-13 20:34:30+08:00'
Node: admin
Kernel module:
Loaded: true
Name: kvdo
……省略……
Compression: enabled #vdo数据压缩功能开启
Configured write policy: auto
Deduplication: enabled #vdo检测并删除重复数据功能开启
……省略……
#4 格式化为xfs文件系统
[root@admin ~]# mkfs.xfs -K /dev/mapper/vdo1 #-K选项可防止立即丢弃文件系统中未使用的块,从而使命令返回更快
meta-data=/dev/mapper/vdo1 isize=512 agcount=4, agsize=655360 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
#5 刷新设备
[root@admin ~]# udevadm settle
#6 挂载至/data2目录下
[root@admin ~]# mkdir /data2
[root@admin ~]# mount /dev/mapper/vdo1 /data2
#7 使用vdostats命令查看卷的初始统计信息和状态
[root@admin ~]# vdostats --human-readable #可以看到初始情况下使用了4.0G
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 20.0G 4.0G 16.0G 20% 98% 5.0G 3.0G 2.0G 60% 98%
#8 在挂载目录下创建文件
[root@admin ~]# cp /usr/local/src/jdk-7u79-linux-x64.tar.gz /data2/test1
[root@admin ~]# ll -h /data2/test1
-rw-r--r--. 1 root root 147M 10月 13 22:15 /data2/test1
#9 再次查看vdo卷的初始统计信息和状态
[root@admin ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 20.0G 4.2G 15.8G 20% 51%
#复制一个文件后,使用的内存为4,.2G
#10 将创建的test文件再复制一份
[root@admin ~]# cp /usr/local/src/jdk-7u79-linux-x64.tar.gz /data2/test3
[root@admin ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 20.0G 4.2G 15.8G 20% 66%
#将源文件再复制一边后,可以看到使用内存没有改变
#11 再复制一次进行验证
[root@admin ~]# cp /usr/local/src/jdk-7u79-linux-x64.tar.gz /data2/test4
[root@admin ~]# vdostats --human-readable
Device Size Used Available Use% Space saving%
/dev/mapper/vdo1 20.0G 4.2G 15.8G 20% 74%
#使用内存还是没有改变
[root@admin ~]# ll -h /data2/
总用量 586M
-rw-r--r--. 1 root root 147M 10月 13 22:15 test1
-rw-r--r--. 1 root root 147M 10月 13 22:17 test2
-rw-r--r--. 1 root root 147M 10月 13 22:18 test3
-rw-r--r--. 1 root root 147M 10月 13 22:21 test4
即一个文件复制了四次到/data2下,四个文件是重复的一样的,但实际存储在硬盘上只占用了一个文件的内存,而且四个文件都存在,但是并不是以硬链接的形式存在的
删除vdo设备(必须先取消挂载才可以删除)
[root@admin ~]# vdo remove --name vdo1
Removing VDO vdo1
Stopping VDO vdo1
四、对/分区进行扩容
要求:添加一个新的磁盘,容量20G,并将这单个磁盘全部扩容至/分区
- 查看挂载到 / 所属的设备名
[root@admin ~]# df -Th /
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 87G 2.9G 84G 4% /
[root@admin ~]# lvscan
ACTIVE '/dev/centos/swap' [<3.73 GiB] inherit
ACTIVE '/dev/centos/root' [86.67 GiB] inherit
ACTIVE '/dev/centos/home' [9.31 GiB] inherit
可以看到挂载到/目录所对应的设备名为/dev/mapper/centos-root,且可以看到该设备是逻辑卷,只有确定了该设备为逻辑卷,才能对其进行动态扩容
- 查看该设备 /dev/mapper/centos-root的所对应的卷组名
[root@admin ~]# lvdisplay /dev/mapper/centos-root
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos #所属卷组
LV UUID q12iec-Ww3F-Sn5d-nq0Y-nn8F-ZhRt-dLmYnr
LV Write Access read/write
LV Creation host, time admin, 2020-06-29 16:36:19 +0800
LV Status available
# open 1
LV Size 86.67 GiB
Current LE 22188
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
可以看到该逻辑卷/dev/mapper/centos-root所属卷组为/dev/centos
- 查看其所属卷组 /dev/centos 的信息
[root@admin ~]# vgs /dev/centos
VG #PV #LV #SN Attr VSize VFree
centos 1 3 0 wz--n- <99.72g 8.00m
[root@admin ~]# vgdisplay /dev/centos
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size <99.72 GiB
PE Size 4.00 MiB
Total PE 25528
Alloc PE / Size 25526 / 99.71 GiB
Free PE / Size 2 / 8.00 MiB
VG UUID J8a7eu-dBD0-1YEp-gHeF-aETn-RnSP-dTRKde
可以看到只剩下8MB,因此想要扩容20G,必须向该卷组添加物理卷扩容后,才能对逻辑卷进行扩容
- 添加SCSI硬盘大小20G,这里显示为/sdc
[root@admin ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 286M 0 part /boot
└─sda2 8:2 0 99.7G 0 part
├─centos-root 253:0 0 86.7G 0 lvm /
├─centos-swap 253:1 0 3.7G 0 lvm [SWAP]
└─centos-home 253:3 0 9.3G 0 lvm /home
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 5G 0 part
├─sdb2 8:18 0 5G 0 part
├─sdb3 8:19 0 5G 0 part
└─sdb4 8:20 0 5G 0 part
sdc 8:32 0 20G 0 disk #此为新添加的硬盘
sr0 11:0 1 1024M 0 rom
- 将/dev/sdc全部建立为物理卷
[root@admin ~]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
- 将该物理卷/dev/sdc添加至根目录所对应逻辑卷的卷组/dev/centos中
[root@admin ~]# vgextend /dev/centos /dev/sdc
Volume group "centos" successfully extended
[root@admin ~]# vgdisplay /dev/centos
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 2
Act PV 2
VG Size 119.71 GiB
PE Size 4.00 MiB
Total PE 30647
Alloc PE / Size 25526 / 99.71 GiB
Free PE / Size 5121 / 20.00 GiB
VG UUID J8a7eu-dBD0-1YEp-gHeF-aETn-RnSP-dTRKde
这是可以看到该卷组已经成功扩容20G
- 下面就是需要对挂载到 / 的逻辑卷/dev/mapper/centos-root进行扩容
[root@admin ~]# lvextend -L +20G /dev/mapper/centos-root
Size of logical volume centos/root changed from 86.67 GiB (22188 extents) to 106.67 GiB (27308 extents).
Logical volume centos/root successfully resized.
[root@admin ~]# lvdisplay /dev/mapper/centos-root
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID q12iec-Ww3F-Sn5d-nq0Y-nn8F-ZhRt-dLmYnr
LV Write Access read/write
LV Creation host, time admin, 2020-06-29 16:36:19 +0800
LV Status available
# open 1
LV Size 106.67 GiB
Current LE 27308
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
- 可以看到扩容似乎已经成功,但是还存在问题:
[root@admin ~]# df -Th /
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 87G 2.9G 84G 4% /
怎么 / 分区的大小还是 87GB ?不是已经对逻辑卷扩容成功了吗?
其实刚刚只是逻辑卷的大小改变了,如果要让分区使用这个新逻辑卷,对于xfs文件系统则还要使用xfs_growfs LV命令来调整更新分区的大小。
这里就体现出了 LVM 的优势:我们不需要卸载分区,直接就能调整分区的大小。
- 将扩容后的逻辑卷写入分区中:
[root@admin ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=5680128 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=22720512, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=11094, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 22720512 to 27963392
[root@admin ~]# df -Th /
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 107G 2.9G 104G 3% /
这时就扩容完毕