📓 LVM相关

一、什么是lvm

逻辑卷管理LVM是硬盘的一个系统工具。无论在linux或者其他类似的系统,都是非常的好用。传统分区使用固定大小分区,重新调用大小十分麻烦。但是,LVM可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以让管理员弹性的管理逻辑的扩大缩小,操作简单,而不损坏已存储的数据。可以随意将新到的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在

 

 

 通过LVM技术,可以屏蔽掉磁盘分区到的底层差异,在逻辑上给文件系统提供了一个卷的概念,然后在些卷上建立相应的文件系统。

LVM 所涉及的概念

物理卷(PV):(physical volume)把常规的磁盘设备通过pvcreate命令对其进行初始化,形成了物理卷。其实就是硬盘或分区。(面粉)

卷组(VG):(logical volume)把多个物理卷组成一个逻辑的整体,这样卷组的大小就是多个硬盘之和,或者理解就是由一个或多个pv组成对的整体(面团)

逻辑卷(LV):(logical volume)从卷组中划分需要的空间大小出来,用户仅对其格式化然后即可挂载使用,从VG中切割出的空间用于创建文件系统(切成馒头)

基本单元(PE):(physical extend)分配的逻辑大小的最小单元,默认为4MB的基本块(假设分配100MB逻辑空间,则需要创建25个PE)

二、为何要用lvm

在对磁盘分区的大小进行规划时,往往不能确定每个分区使用的空间大小,只能凭经验分配一个大小,而我们通常使用的fdisk、gdisk等工具对磁盘分区后,每个分区的大小就固定死了,这么做的问题是

# 如果分区设置的过大,就白白浪费了磁盘空间

# 如果分区设置的过小,就会导致空间不够用的情况出现

对于分区过小的问题,我们可以重新划分磁盘的分区,或者通过软连接的方式将此分区的目录链接到另外一个分区。这样做虽然能够临时解决问题,但给管理带来了麻烦

  • 这就要用lvm解决 

 

lvm优缺点

优点:

1、可以在系统运行的状态下动态的扩展文件系统的大小

2、文件系统可以跨多个磁盘,因此文件系统大小不会受物理磁盘的限制

3、可以增加新的磁盘到LVM的存储池中

4、可以以镜像的方式冗余重要的数据到多个物理磁盘

5、可以方便的导出整个卷到另外一台机器

 

缺点:

1、因为加入了额外的操作,存取性能受到影响

2、当卷组中的一个磁盘损坏时,整个卷组都会受到影响

解释:LVM如果有一个磁盘损坏,整个lvm都坏了,lvm只有动态扩展作用

方案:底层用RAID+上层LVM=即有冗余又有动态扩展

3、在从卷组中移除一个磁盘的时候必须使用reducevg命令(该命令要求root权限、并且不允许在快照卷组中使用)

三、lvm的基本使用

 

 0、下载安装软件包

  • yum install lvm2 -y

1、制作pv:可以对分区做,也可以对正块盘做

#制作
[root ~]# pvcreate /dev/sdb1 # 对分区做
[root ~]# pvcreate /dev/sdb2 # 对分区做
[root ~]# pvcreate /dev/sdb3 # 对分区做
[root ~]# pvcreate /dev/sdc   # 对整块盘做

# 查看
[root ~]# pvs
 PV VG Fmt Attr PSize PFree 
 /dev/sdb1     lvm2 ---     1.00g     1.00g
 /dev/sdb2     lvm2 ---     1.00g     1.00g
 /dev/sdb3     lvm2 ---     1.00g     1.00g
 /dev/sdc      lvm2 ---     20.00g     20.00g
[root ~]# pvscan 
 PV /dev/sdb1         lvm2 [1.00 GiB]
 PV /dev/sdc          lvm2 [20.00 GiB]
 PV /dev/sdb2         lvm2 [1.00 GiB]
 PV /dev/sdb3         lvm2 [1.00 GiB]
 Total: 4 [23.00 GiB] / in use: 0 [0 ] / in no VG: 4 [23.00 GiB]    

2、制作vg:将pv划入vg中

#制作一个vg1:
[root ~]# vgcreate vg1 /dev/sdb1 /dev/sdc # 包含dev/sdb1Ө/dev/sdc两个pv
 Volume group "vg1" successfully created
[root ~]# vgs
 VG #PV #LV #SN Attr VSize VFree 
 vg1 2 0 0 wz--n- 20.99g 20.99g

#也可以在制作一个vg2: 
[root ~]# vgcreate vg2 /dev/sdb2 /dev/sdb3 # 包含/dev/sdb2Ө/dev/sdb3两个pv
 Volume group "vg2" successfully created
[root ~]# vgs
 VG #PV #LV #SN Attr VSize VFree 
 vg1 2 0 0 wz--n- 20.99g 20.99g
 vg2 2 0 0 wz--n- 1.99g 1.99g

3、创建逻辑卷lvm

选项
 -L #逻辑卷大小
 -n #逻辑卷名字
 
# 从vg1中分出来逻辑卷v1_from_vg1、v2_from_vg1
[root ~]# lvcreate -L 100M -n lv1_from_vg1 vg1
[root ~]# lvcreate -L 200M -n lv2_from_vg1 vg1

# 从vg2中分出来逻辑卷v2_from_vg2̵lv1_from_vg2
[root ~]# lvcreate -L 300M -n lv1_from_vg2 vg2
[root ~]# lvcreate -L 400M -n lv2_from_vg2 vg2

# 查看
[root ~]# lvs
 LV         VG     Attr     LSize    Pool     Origin     Data%     Meta%     Move     Log  
Cpy%Sync Convert lv1_from_vg1 vg1 -wi-a----- 100.00m lv2_from_vg1 vg1 -wi-a----- 200.00m lv1_from_vg2 vg2 -wi-a----- 300.00m lv2_from_vg2 vg2 -wi-a----- 400.00m

 4、格式与挂载

[root ~]# mkfs.xfs /dev/vg1/lv1_from_vg1 
[root ~]# mkfs.xfs /dev/vg1/lv2_from_vg1 
[root ~]# mkfs.xfs /dev/vg2/lv1_from_vg2 
[root ~]# mkfs.xfs /dev/vg2/lv2_from_vg2 
[root ~]# mount /dev/vg1/lv1_from_vg1 /test1/
[root ~]# mount /dev/vg1/lv2_from_vg1 /test2/
 
[root ~]# mount /dev/vg2/lv1_from_vg2 /test3/
[root ~]# mount /dev/vg2/lv2_from_vg2 /test4/
# 查看
[root ~]# df
文件系统                                         1K-块       已用           可用       已用%   挂载点
...
/dev/mapper/vg1-lv1_from_vg1     98980        5344      93636      6% /test1
/dev/mapper/vg1-lv2_from_vg1     201380     10464     190916     6% /test2
/dev/mapper/vg2-lv1_from_vg2     303780     15584     288196     6% /test3
/dev/mapper/vg2-lv2_from_vg2     406180     20704     385476     6% /test4

四、在线动态扩容

在线扩容的意思为:在不用卸载的情况下完成扩容

命令:lvextend  -L  [+]MGT   /dev/VG_NAME/VL_NAME

注:-L 100M 与 -L +100M不是一个意思,或者代表在原有的基础上扩容

示例:

# 1、新增一块盘或者一个分区
fdisk /dev/sdb ......
partprobe
ls /dev/sdb4

# 2、新增一个pv
[root ~]# pvcreate /dev/sdb4

# 3、把新增的pv扩到vg2里
[root ~]# vgextend vg2 /dev/sdb4
[root ~]# vgs # 可以看到vg2扩容了

# 4、接下来对lv1_from_vg2
[root ~]# lvextend -L +1000M /dev/vg2/lv1_from_vg2
[root ~]# xfs_growfs /dev/vg2/lv1_from_vg2 # 扩展逻辑卷后需要更新fs文件系统

五、在线动态缩容与删除

不要缩容!!!!并且xfs干脆不支持缩容

  • lvreduce -L [-]MGT /dev/VG_NAME/LV_NAME 

删除

# 删除lv之前需要先卸载挂载点
[root ~]# umount /test3
[root ~]# lvremove /dev/vg2/lv1_from_vg2

删除VG
[root ~]# vgremove vg2

# 删除pv:只能删掉那些不属于任何vg的pv
[root ~]# pvremove /dev/sdb2
[root ~]# pvremove /dev/sdb3

六、快照

LVM机制还提供了对LV做快照的功能,也就是说可以给文件系统做一个备份,这也是设计LVM的主要目的。LVM的快照功能采用写时复制技术(copy-on-write,cow)这比传统的备份技术的效率要高很多。创建快照时不用停止服务,就可以对数据进行备份,说明:LVM还支持thin类型的快照,但是文本中的快照都是指COW类型的快照

LVM采用的写时复制,是指当LVM快照创建的时候,仅创建到实际数据的inode的硬链接(hark-link)而已。只要实际的数据没有改变,快照就只包含指向数据的inode的指针,而非数据本身。快照会跟踪原始卷中块的改变,一旦更改了快照对应的文件或目录,这个时候原始卷上将要改变的数据会在改变之前拷贝到快照预留的空间

lvm快照原理:

 

 

创建快照实际上也是创建了一个逻辑卷,只不过该卷的属性与普通逻辑卷的属性有些不一样。可以通过上图来理解快照数据卷(图中的实线框表示快照区域,虚线框表示文件系统)

#左图为最初创建的快照 数据卷状况,LVM会预留一个区域(比如左图的左侧三个PE区块)作为数据存放处。此时快照数据卷内并有任何数据,而快照数据卷与源数据卷共享所有的PE数据,因此会看到快照数据的内容与源数据卷的内容一模一样。等到系统运行一阵后,假设A区域的数据被更新了(右图所示),则更新前前系统会将该区域的数据移动到快照数据卷中,所以在右图的快照数据卷中被占用了一块PE成为A,而其他B到I的区块还是与源数据卷共享

强调:

由于快照区域原本的LV共享很多PE区块,因此快照区域被快照区的LV必须要在同一个VG上面,

#1、VG中需要预留存放快照本身的空间,不能全部被占满

#2、快照所在的VG必须与备份的LV相同,否则创建快照会失败

总结:

快照的本质就是一个特殊的LV,创建快照后,如果源数据卷的文件被更新了,会将老数据赋给快照的空间,这就要求快照的空间也是够用的

示例:利用快照恢复单个文件

# 1、准备好初始数据
[root ~]# df
文件系统                                     1k -块        已用      可用      已用%      挂载点

/dev/mapper/vg1-lv1_from_vg1 98980         5348     93632     6%        /test1
[root ~]# echo "hello coco" > /test1/1.txt
# 2、查看vg1容量是否充足
lv1_from_vg1  属于卷vg1,而vg1有足够的容量来分配给快照卷
[root ~]# vgs
 VG #PV #LV #SN   Attr    VSize    VFree 
 vg1   2     2     0    wz--n- 20.99g <20.70g 

# 3、在lvg1卷组里创建一个lv1_from_vg1的逻辑卷
[root ~]# lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
# 4查看
[root ~]# lvs
 LV               VG Attr               LSize          Pool  Origin         Data% Meta%
Move Log Cpy%Sync Convert
 lv1_from_vg1 vg1 owi-aos--- 100.00m 
 
 lv1_from_vg1_snap vg1 swi-a-s--- 104.00m lv1_from_vg1 0.01 
 
 

# 5修改文件/test/1.txt
[root ~]# echo "coco say ladygaga" >> /test1/1.txt
[root ~]# cat /test1/1.txt
hello  coco
coco say ladygaga


# 6、恢复数据
挂载快照,注意:快照在挂载的时候由于和原来的lvm是同一个UUID,而XFS是不允许相同的UUID的文件系统挂载,所以需要加选项 -o nouuid
[root ~]# mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/
[root ~]# cat /opt/1.txt
hello coco
[root ~]# cp /opt/1.txt /test1/1.txt
cp是否覆盖 "/test1/1.txt"Ҙ y 
[root ~]# cat /test1/1.txt
hello coco
            

示例2:如果要恢复的文件个数过多,可以直接合并

mount /dev/vg1/lv1_from_vg1 /test1/
echo hello coco > /test1/1.txt
lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
echo aaaa >> /test1/1.txtecho aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
echo aaaa >> /test1/1.txt
mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/
[root ~]# cat /opt/1.txt
hello coco
[root ~]# cat /test1/1.txt
hello  coco
aaaa
aaaa
aaaa
aaaa
aaaa

先卸载数据源与快照,再进行合并,快照会自动删除,一次行的

[root ~]# umount /test1
[root ~]# umount /opt
[root ~]# lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_snap
[root ~]# mount /dev/vg1/lv1_from_vg1 /test1/
[root ~]# cat /test1/1.txt # 数据还原回来了
hello coco
posted @ 2020-11-09 21:51  沐灵修  阅读(258)  评论(0编辑  收藏  举报
/* 点击爆炸效果*/
/*鼠标跟随效果*/