LVM逻辑卷管理工具(Logical Volume Manager)
逻辑卷管理LVM是硬盘的一个系统工具。传统分区使用固定大小分区,重新调整大小十分麻烦。但是LVM可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以弹性管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据。可以将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。
-
PE(Physical Extend)
物理扩展块,LVM中的最小存储单位。默认为4M的基本块。
-
物理存储空间:
实际的物理硬盘或分区。需要使用gdisk工具将分区的System ID调整 为8e,然后才能转成PV。(不过寡人用gdisk分区时用默认的8300也行)
-
物理卷(Physical Volume)
把实际的存储空间通过pvcreate命令对其进行初始化,形成物理卷。
-
卷组(Volume Group):
把多个物理卷组成一个逻辑的整体,这样卷组的大小就是多个存储空间之和。
-
逻辑卷(Logical Volume)
从卷组中划分需要的空间大小出来。可以对其像实际的分区一样格式化挂载使用。
LVM优缺点
# 优点
1、可以在系统运行的状态下动态的扩展文件系统的大小。
2、文件系统可以跨多个磁盘,因此文件系统大小不受物理磁盘限制。
3、可以增加新的磁盘到LVM的存储池中。
4、可以以镜像的方式冗余重要的数据到多个物理磁盘。
5、可以方便的到处整个卷组到另外一台汲机器。
# 缺点:
1、因为在文件系统物理硬盘之间加入了额外一层,存取性能受到影响。
2、当卷组中的一个磁盘损坏时,整个卷组都会受到影响。
LVM如果有一个磁盘损坏,则整个LVM都坏了,LVM只有动态扩容作用。
解决方案:底层RAID + 上层LVM = 既有冗余又有动态扩展
3、在从卷组中移除一个磁盘的时候必须使用reducevg命令(该命令要求root权限,且不允许在快照卷组中使用)
LVM基本使用
1、把物理硬盘分成分区,当然也可以是整块物理硬盘。
# 使用gdisk命令,在分区时要指定ID为8e00
Hex code or GUID (L to show codes, Enter = 8300): 8e00
2、把物理分区建立为物理卷(PV),也可以直接把整块硬盘都建立为物理卷。
pvcreate:将指定的分区初始化为PV,也可以是整块硬盘。
[root@Duorou ~ ]# pvcreate /dev/sdd /dev/sdb2
Physical volume "/dev/sdd" successfully created.
Physical volume "/dev/sdb2" successfully created.
pvs:查看PV信息
[root@Duorou ~ ]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- 31.25g 0
/dev/sdb1 vg1 lvm2 a-- 1020.00m 1020.00m
/dev/sdb2 lvm2 --- 1.00g 1.00g
/dev/sdc vg1 lvm2 a-- <15.00g <4.00g
/dev/sdd lvm2 --- 30.00g 30.00g
pvremove:擦除分区的PV属性。
[root@Duorou ~ ]# pvremove /dev/sdd
Labels on physical volume "/dev/sdd" successfully wiped.
3、把物理卷整合为卷组(VG)。卷组就已经可以动态地调整大小了,可以把物理分区加入卷组,也可以把物理分区从卷组中删除。
vgcreate:创建VG
vgcreate 指定VG名 指定使用的PV名
[root@Duorou ~ ]# vgcreate vg1 /dev/sdb1
Volume group "vg1" successfully created
vgs:显示系统VG信息。
[root@Duorou ~ ]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- 31.25g 0
vg1 1 0 0 wz--n- <10.00g <10.00g
vgextend:扩容,向VG添加PV
vgextend VG名 PV名
[root@Duorou ~ ]# vgextend vg1 /dev/sdc1
Volume group "vg1" successfully extended
[root@Duorou ~ ]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- 31.25g 0
vg1 2 0 0 wz--n- 12.99g 12.99g
[root@Duorou ~ ]# vgextend vg1 /dev/sdc2 /dev/sdc3
Volume group "vg1" successfully extended
[root@Duorou ~ ]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- 31.25g 0
vg1 4 0 0 wz--n- 24.98g 24.98g
vgreduce:移除VG内的PV
vgreduce VG名 PV名
[root@Duorou ~ ]# vgreduce vg1 /dev/sdc3
Removed "/dev/sdc3" from volume group "vg1"
vgremove:删除整个VG
4、把卷组再划分为逻辑卷(LV),当然逻辑卷也是可以直接调整大小的。我们说逻辑卷可以想象为分区,所以也需要格式化和挂载。
lvcreate:创建LV
-L:指定容量{M,G,T},最小单位为PE
-n:指定LV名称
lvcreate -L LV容量 -n LV名 VG名
[root@Duorou ~ ]# lvcreate -L 10G -n lv1_from_vg1 vg1
Logical volume "lv1_from_vg1" created.
lvs:查看系统LV信息
[root@Duorou ~ ]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- 29.25g
swap centos -wi-ao---- 2.00g
lv1_from_vg1 vg1 -wi-a----- 10.00g
lvextend:扩容,增加LV容量。
[root@Duorou ~ ]# lvextend -L +2G /dev/vg1/lv1_from_vg1
Size of logical volume vg1/lv1_from_vg1 changed from 10.00 GiB (2560 extents) to 12.00 GiB (3072 extents).
Logical volume vg1/lv1_from_vg1 successfully resized.
[root@Duorou ~ ]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- 29.25g
swap centos -wi-ao---- 2.00g
lv1_from_vg1 vg1 -wi-a----- 12.00g
lvreduce:缩容,减少LV的容量。
lvremove:删除整个lv。
5、格式化写入文件系统,挂载即可正常使用
mkfs.xfs /dev/vg1/lv1_from_vg1
mount /dev/vg1/lv1_from_vg1 /mnt
/dev/mapper/vg1-lv1_from_vg1 xfs 12G 33M 12G 1% /opt
在实际生产环境中,只会进行扩容,不会进行缩容(为了避免数据丢失),所以此处不考虑缩容操作。并且xfs干脆不支持缩容。
在线动态扩容:
意思是在不用卸载的情况下完成扩容。
# 1、首先增加PV
[root@Duorou ~ ]# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created.
[root@Duorou ~ ]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- 31.25g 0
/dev/sdb1 vg1 lvm2 a-- <10.00g 0
/dev/sdc1 vg1 lvm2 a-- <3.00g 1016.00m
/dev/sdc2 vg1 lvm2 a-- <5.00g <5.00g
/dev/sdc3 vg1 lvm2 a-- <7.00g <7.00g
/dev/sdd lvm2 --- 30.00g 30.00g
# 2、再括展VG
[root@Duorou ~ ]# vgextend vg1 /dev/sdd
Volume group "vg1" successfully extended3
[root@Duorou ~ ]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- 31.25g 0
vg1 5 1 0 wz--n- 54.98g 42.98g
# 3、扩容LV
[root@Duorou ~ ]# lvextend -L +10G /dev/vg1/lv1_from_vg1
Size of logical volume vg1/lv1_from_vg1 changed from 12.00 GiB (3072 extents) to 22.00 GiB (5632 extents).
Logical volume vg1/lv1_from_vg1 successfully resized.
[root@Duorou ~ ]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- 29.25g
swap centos -wi-ao---- 2.00g
lv1_from_vg1 vg1 -wi-ao---- 22.00g、
# 4、扩展逻辑卷后需要更新xfs文件系统
[root@Duorou ~ ]# xfs_growfs /dev/vg1/lv1_from_vg1
meta-data=/dev/mapper/vg1-lv1_from_vg1 isize=512 agcount=8, agsize=786432 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=5767168, 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
[root@Duorou ~ ]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
。。。。。。
/dev/mapper/vg1-lv1_from_vg1 xfs 22G 33M 22G 1% /opt
快照
LVM提供了对LV做快照的功能,也就是说可以给文件系统做一个备份,这也是设计LVM快照的主要目的。LVM的快照功能采用写时复制技术(Copy-On-Write,COW),这比传统的备份技术的效率要高很多。创建快照时不用停止服务,就可以对数据进行备份。LVM还支持thin类型的快照。
LVM采用的写时复制,是指当LVM快照创建的时候,仅创建到实际数据的iNode的硬链接。快照会跟踪原始卷中块的改变,一旦更改了快照对应的文件或目录,这个时候原始卷上将要改变的数据会在改变之前拷贝到快照预留的空间。
创建快照实际上也是创建一个逻辑卷,只不过属性有些不同。
左图为最初创建的快照数据卷状况,LVM会预留一个区域作为数据存放处。此时快照数据卷内并没有任何数据,而快照数
据卷与源数据共享所有的PE数据,因此你会看到快照数据卷的内容与源数据卷的内容是一模一样的。假设A区域的数据被更新了(有图所示),则更新前系统会将该区域的数据迁移到快照数据卷中,所以在有图的快照数据卷中被占用了一块PE成为A,而其他B到I的区块则还是与源数据卷共享。
由于快照区与原本的LV共享很多PE区块,因此快照区与被快照的LV必须要在同一个VG上:
1、VG中需要预留存放快照本身的空间,不能全部被占满。
快照的本质就是一个特殊的LV,创建快照后,如果源数据卷中的文件被更新了,会将老数据赋给快照的空间,这就要求
快照的空间必须足够。
2、快照所在的VG必须与被备份的LV相同,否则创建快照会失败。
示例1:利用快照恢复单个文件。
# 1、准备好初识数据
[root@Duorou ~ ]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
。。。。。。
/dev/mapper/vg1-lv1_from_vg1 xfs 22G 33M 22G 1% /opt
[root@Duorou ~ ]# echo 1111 > /opt/f1
# 2、检查VG容量是否充足。
[root@Duorou ~ ]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- 31.25g 0
vg1 5 1 0 wz--n- 54.98g 32.98g
# 3、在VG里创建一个lv1_from_vg1_snap的逻辑卷
[root@Duorou ~ ]# lvcreate -L 10G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
Logical volume "lv1_from_vg1_snap" created.
[root@Duorou ~ ]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move 。。。。。。
lv1_from_vg1 vg1 owi-aos--- 22.00g
lv1_from_vg1_snap vg1 swi-a-s--- 10.00g lv1_from_vg1 0.00
# 4、修改/opt/f1
[root@Duorou ~ ]# echo 22222 > /opt/f1
# 5、恢复数据
挂载快照,快照在挂载的时候由于和原来的LVM是同一个UUID,而xfs不允许相同UUID的文件系统挂载,所以需要加
选项-o nouuid
[root@Duorou ~ ]# mount -o nouuid /dev/vg1/lv1_from_vg1_snap /mnt
[root@Duorou ~ ]# cp /mnt/f1 /opt/f1
cp:是否覆盖"/opt/f1"? y
[root@Duorou ~ ]# cat /opt/f1
1111
示例2:如果要恢复的文件个数过多,可以直接合并
mount /dev/vg1/lv1_from_vg1 /test1/
echo hello > /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@egon ~]# cat /opt/1.txt
hello
[root@egon ~]# cat /test1/1.txt
hello
aaaa
aaaa
aaaa
aaaa
aaaa
先卸载数据源与快照,再进行合并,快照会自动删除,一次性的。
[root@egon ~]# umount /test1
[root@egon ~]# umount /opt
[root@egon ~]# lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_snap
[root@egon ~]# mount /dev/vg1/lv1_from_vg1 /test1/
[root@egon ~]# cat /test1/1.txt # 数据还原了
hello