逻辑卷管理LVM是硬盘的⼀个系统⼯具。⽆论在Linux或者其他类似的系统,都是⾮常的好⽤。传统分区使⽤固定⼤⼩分区,重新调整⼤⼩⼗分麻烦。但是,LVM可以创建和管理“逻辑”卷,⽽不是直接使⽤物理硬盘。可以让管理员弹性的管理逻辑卷的扩⼤缩⼩,操作简单,⽽不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。
当刚开始安装Linux系统时,往往不能确定每个分区使用的空间大小,只能凭经验分配不科学。
如果分区设置的过大,就浪费了磁盘空间,
如果分区设置的过小,就会导致空间不够
如何希望分配的空间过大或过小,都能动态调整,则需要使用到 LVM 逻辑卷
LVM 是 Logical Volume Manager 逻辑卷管理的简写,它是对磁盘分区管理的一种机制
优点:
缺点:
解决办法:底层用 RAID + 上层用LVM = 既有冗余又有动态扩展;
物理卷(PV):(physical volume),把常规的磁盘设备通过pvcreate命令对其进⾏初始化,形成了物理卷。其实就是硬盘或分区。(⾯粉)
卷组(VG):(volume group),把多个物理卷组成⼀个逻辑的整体,这样卷组的⼤⼩就是多个硬盘之和。或者理解就是由⼀个或多个PV组成的整体。(⾯团)
逻辑卷(LV):(logical volume),从卷组中划分需要的空间⼤⼩出来。⽤户仅需对其格式化然后即可挂载使⽤。从VG中切割出的空间⽤于创建⽂件系统。(切成馒头)
基本单元(PE):(physical extend),分配的逻辑大小的最小单元,默认为4MB的基本块。(假设分配100MB逻辑空间,则需要创建25个PE)
注意:制作pv,可以对分区做、也可以对整块盘做
二、LVM配置实操
环境与步骤
1、下载安装包
yum install -y lvm2
查看磁盘状态
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─centos-root 253:0 0 47G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 10G 0 part
└─sdb2 8:18 0 10G 0 part
sdc 8:32 0 100G 0 disk
sr0 11:0 1 4.4G 0 rom
[root@localhost ~]#
我们用/dev/sdb1分区 和 /dev/sdc整个磁盘做pv
1.制作pv
pvcreate 设备名
root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
2.查看pv
pvs
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <49.00g 4.00m # 系统自己创建的
/dev/sdb1 lvm2 --- 10.00g 10.00g # 我们创建的
/dev/sdc lvm2 --- 100.00g 100.00g # 我们创建的
[root@localhost ~]#
3.制作卷组vg
vgcreate 卷组名 pv名
[root@localhost ~]# vgcreate test_vg /dev/sdb1 /dev/sdc
Volume group "test_vg" successfully created
4.查看vg
vgs
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <49.00g 4.00m # 系统默认创建的
test_vg 2 0 0 wz--n- 109.99g 109.99g # 我们自己创建的
[root@localhost ~]#
5.创建逻辑卷lvm(也可以创建多个逻辑卷)
lvcreate 选项
选项
-L #逻辑卷⼤⼩
-n #逻辑卷名字
分配50g大小给lv1_from_test_vg
[root@localhost ~]# lvcreate -L 50G -n lv1_from_test_vg test_vg
Logical volume "lv1_from_test_vg" created.
6.查看vg
lvs
lvscan
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- 46.99g
swap centos -wi-ao---- 2.00g
lv1_from_test_vg test_vg -wi-a----- 50.00g
或者
[root@localhost ~]# lvscan
ACTIVE '/dev/test_vg/lv1_from_test_vg' [50.00 GiB] inherit # 自己创建的
ACTIVE '/dev/centos/swap' [2.00 GiB] inherit # 系统默认
ACTIVE '/dev/centos/root' [46.99 GiB] inherit # 系统默认
7.创建文件系统
mkfs.xfs 逻辑卷名
[root@localhost ~]# mkfs.xfs /dev/test_vg/lv1_from_test_vg
8.创建目录挂载使用
[root@localhost ~]# mkdir /lv1
[root@localhost ~]# mount -t xfs /dev/test_vg/lv1_from_test_vg /lv1
9.查看挂载情况
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 47G 1.3G 46G 3% /
/dev/sda1 1014M 138M 877M 14% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/test_vg-lv1_from_test_vg 50G 33M 50G 1% /lv1
[root@localhost ~]#
不要缩容!!!并且xfs⼲脆不⽀持缩容
不要缩容!!!并且xfs⼲脆不⽀持缩容
不要缩容!!!并且xfs⼲脆不⽀持缩容
所以下面的缩容纯属了解
1.准备新的硬盘加入到pv,检查pv大小。
这里我们还有/dev/sdb2,可以将其加入卷组,方法都一样,为了简化就不插入新硬盘了。
[root@localhost ~]# pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <49.00g 4.00m
/dev/sdb1 test_vg lvm2 a-- <10.00g <10.00g
/dev/sdb2 lvm2 --- <10.00g <10.00g
/dev/sdc test_vg lvm2 a-- <100.00g <50.00g
[root@localhost ~]#
使用vgextend
扩展卷组 在已经存在的卷组test_vg(上面我们自己创建的)上扩展卷组
vgextend 原卷组名 创建的新pv
[root@localhost ~]# vgextend test_vg /dev/sdb2
Volume group "test_vg" successfully extended
再次检查卷组,发现已经变大了(之前总大小是110G),说明扩容成功
现在总大小是120G,正好是/dev/sdb 和/dev/sdc大小之和。
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <49.00g 4.00m
test_vg 3 1 0 wz--n- <119.99g <69.99g
假设想移除 /dev/sdb(/dev/sdb1) 磁盘,建议先将 sdb 磁盘数据先迁移到 sdc 磁盘,然后在移除
注意:同一卷组的磁盘才可以进行在线迁移
1.检查当前逻辑卷 VG 中 PV 使用情况
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <49.00g 4.00m
/dev/sdb1 test_vg lvm2 a-- <10.00g <10.00g
/dev/sdb2 test_vg lvm2 a-- <10.00g <10.00g
/dev/sdc test_vg lvm2 a-- <100.00g <50.00g
2.pvmove 在线数据迁移,将 sdb1 的数据迁移至 其他盘(可以是sdb2也可以是sdc,随机的)
# 因为我们现在所有的磁盘都是空的,模拟写入点数据方便迁移
否则会报错No data to move for test_vg
[root@localhost ~]# touch /lv1/{a..z}.txt
[root@localhost ~]# pvmove /dev/sdb1 # 实际业务中如果这个磁盘有数据,那它就会执行成功
3.检查是否将 sdb1 数据迁移至 其他盘
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <49.00g 4.00m
/dev/sdb1 test_vg lvm2 a-- <10.00g <10.00g
/dev/sdb2 test_vg lvm2 a-- <10.00g <10.00g
/dev/sdc test_vg lvm2 a-- <100.00g <50.00g
[root@localhost ~]#
4.从卷组中移除 sdb 磁盘
vgreduce vg名 设备名
[root@localhost ~]# vgreduce test_vg /dev/sdb1
Removed "/dev/sdb1" from volume group "test_vg"
5.查看
root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <49.00g 4.00m
/dev/sdb1 lvm2 --- 10.00g 10.00g
/dev/sdb2 test_vg lvm2 a-- <10.00g <10.00g
/dev/sdc test_vg lvm2 a-- <100.00g <50.00g
[root@localhost ~]#
扩展逻辑卷:取决于 vg 卷中是否还有剩余的容量
注意扩展逻辑卷不能超过卷组 VG 的总大小
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <49.00g 4.00m
test_vg 2 1 0 wz--n- 109.99g 59.99g
[root@localhost ~]#
可以看到vg还有60G剩余
再看看lv
[root@localhost ~]# lvscan
ACTIVE '/dev/test_vg/lv1_from_test_vg' [50.00 GiB] inherit
ACTIVE '/dev/centos/swap' [2.00 GiB] inherit
ACTIVE '/dev/centos/root' [46.99 GiB] inherit
[root@localhost ~]#
给lv1_from_test_vg逻辑卷扩容+10G
[root@localhost ~]# lvextend -L +10G /dev/test_vg/lv1_from_test_vg
Size of logical volume test_vg/lv1_from_test_vg changed from 50.00 GiB (12800 extents) to 60.00 GiB (15360 extents).
Logical volume test_vg/lv1_from_test_vg successfully resized.
[root@localhost ~]#
#也可以选择分配卷组中多少百分比给逻辑卷
[root@localhost ~]# lvextend -l +50%FREE /dev/test_vg/lv1_from_test_vg
查看扩展后lv
[root@localhost ~]# lvscan
ACTIVE '/dev/test_vg/lv1_from_test_vg' [60.00 GiB] inherit
ACTIVE '/dev/centos/swap' [2.00 GiB] inherit
ACTIVE '/dev/centos/root' [46.99 GiB] inherit
[root@localhost ~]#
可以看到,/dev/test_vg/lv1_from_test_vg 确实增大了10G
扩展逻辑卷后需要更新fs文件系统
xfs_growfs 具体的lv名称
# xfs文件格式扩容
resize2fs 具体的lv名称
# ext文件格式扩容
[root@localhost ~]# xfs_growfs /dev/test_vg/lv1_from_test_vg
[root@localhost ~]# umount /dev/test_vg/lv1_from_test_vg
lvremove
[root@localhost ~]# lvremove /dev/test_vg/lv1_from_test_vg
Do you really want to remove active logical volume test_vg/lv1_from_test_vg? [y/n]: y
Logical volume "lv1_from_test_vg" successfully removed
[root@localhost ~]#
3.删除 vg
vgremove vg名称
[root@localhost ~]# vgremove test_vg
Volume group "test_vg" successfully removed
[root@localhost ~]#
4.删除pv
pvremove
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <49.00g 4.00m
/dev/sdb1 lvm2 --- 10.00g 10.00g
/dev/sdb2 lvm2 --- <10.00g <10.00g
/dev/sdc lvm2 --- 100.00g 100.00g
[root@localhost ~]# pvremove /dev/sdb1
Labels on physical volume "/dev/sdb1" successfully wiped.
[root@localhost ~]# pvremove /dev/sdb2
Labels on physical volume "/dev/sdb2" successfully wiped.
[root@localhost ~]# pvremove /dev/sdc
Labels on physical volume "/dev/sdc" successfully wiped.
[root@localhost ~]#
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,创建快照后,如果源数据卷中的⽂件被更新了,会将⽼数据赋给快照的