Linux LVM(逻辑卷管理器)
LVM是Logical Volume Manager(逻辑卷管理器)的缩写,特点是可以动态扩容和缩容,很灵活。所以使用得很广泛。
LVM原理:
-
将一块或者多块硬盘逻辑上组合在一起形成要给存储池,这个存储池就叫作VG(卷组),存储池的空间大小等于所有硬盘空间的总和。
-
将存储池(VG)中的空间进行重新划分,每个划分出来的空间就叫做逻辑卷(LV)
-
创建好逻辑卷后,可以在上面创建文件系统,进行挂载和正常使用。逻辑卷的大小后面也可以动态调整。
相关概念:
-
物理卷:组成VG(卷组)的物理硬盘就叫作物理卷
-
卷组(VG):多个物理卷的存储空间逻辑上组合成一个大的存储池
-
逻辑卷(LV):可以理解为VG这个逻辑上大硬盘的一个分区
-
物理盘区(PE):是逻辑卷中负责分配空间的最小单位,扩容和缩容都是以PE为单位来操作的。PE大小默认为4M
就是将一块或多块硬盘或分区逻辑的组合在一起形成一个大的硬盘,
创建逻辑卷
要使用逻辑卷,首先就需要将物理硬盘组合成一个大的VG,然后在这个大的VG上切割指定空间出来作为LV,切割的单位是PE。
实现步骤:
1、先将需要加入VG的物理硬盘标记为物理卷,目的就是标识该硬盘要作为物理卷使用了
# 需要安装lvm2这个软件包才有这些命令
sudo pvcreate /dev/sdb
2、将物理卷指定为一个大的卷组
# sudo vgcreate 卷组名称 硬盘1 硬盘2 ...
sudo vgcreate vg0 /dev/sdb /dev/sdc
3、在大的卷组里面划分指定空间的逻辑卷,相当于在于给逻辑硬盘里面创建指定大小空间的分区
# sudo lvcreate -L 分配空间大小 -n 逻辑卷的名称 从哪个VG中割取空间
sudo lvcreate -L 10G -n lv1 vg0
说明:也可以使用 -l(小写)来指定PE的个数,默认一个PE是4M大小,但是这样太麻烦了。直接 -L(大写)指定大小就行了
4、到此逻辑卷就算创建好了,我们可以知道逻辑卷有三个名称你可以用,一个真名,两个软链接。
- 真名: /dev/dm-X(X是一个数字,数字根据创建的顺序和系统中存在的设备映射设备数量来递增)
说明:dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块
软链接:
-
/dev/VG_name/lv_name
-
/dev/mapper/VG_name-lv_name
这三个名字一般用 /dev/VG_name/lv_name这个,这个最直观。
5、逻辑卷创建好了,也知道了对应的文件名字,就可以进行格式化和挂载使用了。
格式化:
sudo mkfs.ext4 /dev/vg0/lv1
挂载:
sudo mount /dev/vg0/lv1 /mnt/VG/
说明:
-
创建swap空间,分区的id要改为82,创建逻辑卷,物理设备分区的id要改成8e fdisk的t选项,如果是使用硬盘的话,就不存在改ID的问题了。
-
通过vgcreate命令创建VG的时候,可以通过-s可以指定PE的大小,不指定默认大小就是4M,一般不用指定。
LV(逻辑卷)扩容
比如原来分了一个LV空间大小是10G,但是即将不够用了,就可以通过扩容的方式增大这个空间。
扩展逻辑卷需要经历两个步骤,空间扩展和文件系统扩展,空间扩展了,还需要将扩展的空间格式化才能正常使用。
实现步骤:
1、空间扩展,使用lvextend这个工具来扩展物理逻辑卷的空间。
# 扩容到指定空间
lvextend -L 具体大小(mMgGtT) /dev/VG_NAME/LV_NAME
# 增加指定空间
lvextend -L +具体大小(mMgGtT) /dev/VG_NAME/LV_NAME
# 将所有可用空间都分配给逻辑卷
sudo lvextend -l +100%FREE /dev/VG_NAME/LV_NAME
# 在原有空间+5G空间
sudo lvextend -L +5G /dev/vg0/lv1
2、将扩展的空间格式化
# resize2fs:对ext系列的文件系统进行扩容,把文件系统同步到空间里面去
# 格式:resize2fs /dev/VG_NAME/LV_NAME
sudo resize2fs /dev/vg0/lv1
说明:
-
如果是xfs格式的逻辑卷,使用xfs_growfs来进行格式化
-
不是所有的文件系统都支持在线扩容,但是ext系列和xfs系列肯定支持
除了上面这种操作方法,还有种简单的方法,就是通过lvextend的 -r 参数来让它自动调整文件系统
# 扩展逻辑卷到100GB,并自动调整文件系统:
sudo lvextend -r -L 100G /dev/VG_NAME/LV_NAME
# 使用所有卷组中的可用空间扩展逻辑卷,并自动调整文件系统:
sudo lvextend -r -l +100%FREE /dev/VG_NAME/LV_NAME
VG(卷组)扩容
VG扩容就是将新的物理硬盘加入到指定的卷组中去。实现步骤就是先给物理硬盘通过pvcreate打上标记,如果是分区还要改分区的ID号,然后再通过vgextend将物理硬盘加入到卷组中就行了。
实现步骤:
1、通过pvcreate给物理硬盘打上标记
2、通过vgextend将物理硬盘加入到卷组中
缩减LV(逻辑卷)
有数据丢失的风险,建议先备份数据再缩减
实现步骤
#xfs文件系统不支持缩减
#五个步骤:
1.卸载
2.检查文件系统完整性(不管是否完整必须)
3.缩减文件系统
4.缩减逻辑卷大小
5.重新挂载
# 1.卸载:
umount /dev/VG_NAME/LV_NAME #首先卸载
# 2.检查文件系统完整性
e2fsck -f /dev/VG_NAME/LV_NAME
# 3.缩减文件系统
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT](缩减后的大小,例如2G表示缩减到2G)
# 4.缩减逻辑卷大小
lvreduce -L [-]#[mMgGtT](这个大小要和上面的大小相匹配) /dev/VG_NAME/LV_NAME(对谁进行缩减)
# 5.重新挂载
mount /dev/VG_NAME/LV_NAME mountpoint
拆除PV(物理卷)
有可能会出现某个PV设备损坏的情况,这个时候就需要将其移除。移除PV设备的前提就是需要将当前PV设备上的数据移到VG中别的PV上去。
实现步骤:
1、查看当前VG中有哪些PV
pvs
1、移动指定pv设备上的所有被占用的pe移动到同一卷组的其他成员上面
sudo pvmove /dev/sdd
2、将这个pv设备从VG卷组中移走
# vgreduce [卷组名] [物理卷路径]
sudo vgreduce vg0 /dev/sdd
3、取消物理硬盘的pv标识
# pvremove 指定的设备
pvremove /dev/sdd
删除LV(逻辑卷)
1、取消挂载
2、使用lvremove删除指定逻辑卷即可
LVM的信息查看
-
物理卷信息查看:pvdisplay和pvs
-
卷组信息查看:vgdisplay和vgs
-
逻辑卷信息查看:lvdisplay和lvs
说明:pvs、vgs和lvs只是提供了简短的摘要信息,xxdisplay是显示详细的信息
LV的快照功能
快照就是将当前的状态做一个备份,逻辑卷的快照是瞬间将逻辑卷做一个备份。这样数据丢失的时候可以利用逻辑卷进行还原。
LV快照的工作逻辑
-
对某个逻辑卷创建快照,会在该逻辑卷所处的卷组中创建一个具有特殊属性的逻辑卷,以此分配一片空间。
-
这块空间会指向原始数据块的引用,采用写实复制的技术,当原始LV的某个数据块第一次被修改时,这个数据块的原始内容(修改之前的内容)会被复制到快照空间。
-
从快照LV读取数据时,LVM会检查所需的数据是否在快照空间中。如果在快照空间中,它会从那里读取。如果不在,它意味着那块数据自从创建快照以来没有被修改,LVM会直接从原始LV读取那块数据
LV快照的创建步骤
1、因为快照也是一块逻辑卷,所以创建快照的方法和创建逻辑卷的方法一样
lvcreate -L size -n snapshot_name -s lv_name
# -s :表示创建的是快照,不加s表示创建的是普通逻辑卷
# lv_name :表示指定的是谁的快照(原始逻辑卷的名称)
2、快照创建好后,可以进行挂载(如果想直接访问快照中的数据,查看或复制它,你需要将快照挂载到文件系统的某个点上。)
-
创建快照后,不需要像普通逻辑卷一样进行格式化,因为快照是原始逻辑卷(LV)的一个精确、只读的复制。因为它包含了原始LV在创建快照时的数据,所以已经有了与原始LV相同的文件系统和数据
-
步骤1把快照创建好了后,就已经能捕捉和保持原始LV的变化
3、快照创建好了后,如果数据有发生变化,会自动存入创建的快照里面的
说明:
在创建快照之后原始逻辑卷的数据发生了大量更改,可能会导致快照空间被完全使用完,如果发生了大量数据更改,以至于快照空间不足以容纳这些更改,那么快照将会“填满”或“溢出”,此时快照将不再有效,并且可能会自动被LVM系统删除或变为不可用状态。
解决方法:
(1)初始分配的时候就分配足够的空间给快照,但是这样浪费空间
(2)快照容量快满了的时候主动扩容
4、如果要使用快照来恢复数据
-
数据恢复前,需要确保快照没有被挂载,如果已经挂载了就是用umount进行卸载。
-
恢复数据的时候,挂载的逻辑卷也需要进行卸载。
# 格式
lvconvert --merge /dev/vg0/data-snapshot
lvconvert --merge /dev/vg0/lv1_snapshot
# 还原以后,快照会自动删除
数据还原后,快照就被删除了