一,为什么出现lvm?
对于每个linux使用者来说,如何正确的评估各个分区的大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好后就无法改变其大小。所以当一个分区存放不了过大的文件的时候,会因为上层文件系统的限制不能跨多个分区来存储,即不能存放在多个磁盘上。当当前磁盘分区已经存放满了的时候,解决的办法是使用符号连接或者使用调整分区大小的工具,但这些只是临时的解决方法,不能根本的解决问题。所以产生了一种新的对磁盘分区进行管理的机制,即LVM。
二,LVM的工作原理:
LVM是建立在硬盘和分区上的一个逻辑层。原理如下:将多个磁盘分区连接成一个整个的卷组,好比一个存储池,随后在整个的物理卷组上可以随意创建逻辑卷组,并进一步在逻辑卷组上创建文件系统。然后就可以方便的方便的调整存储卷组的大小,并且可以对磁盘存储按照组的形式进行命名,管理和分配。LVM实现了在线扩充存储空间,在线扩展文件系统的功能。
举例说明:假设这里有两个橘子,一个20g,一个40g,现在要求均分给四个人,如何能做到平均分配呢?何不将其榨成果汁分配?这就和LVM的道理很相似了。榨成的“果汁“装在两个小杯子里,每杯果汁的量当然是不一样了,每整杯果汁就相当于“pv“,而小杯子果汁里的组成单元就是“pe“,然后将两个不同量的果汁倒进一个大的瓶子里,大瓶子里的果汁相当于“vg“,将大瓶果汁再倒进小杯子时,此时小杯子的果汁即是”lv”了。如果还没明白,继续看下文:
三。LVM的基本术语:
1,物理存储介质:这里指存储设备,如硬盘,/dev/sda,/dev/vdb等,相当于上例子中的橘子。
2,物理卷(PV):指的是硬盘分区或者是和硬盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本物理存储介质相比,有更多的LVM相关的管理参数。相当于上例子中被榨好的不相等的两杯果汁。
3,卷组(VG):类似非LVM管理机制的物理硬盘。由物理卷组成,可以是一个物理卷或者多个物理卷。相当于上例子中的大瓶果汁。
4,逻辑卷(LV):类似非LVM管理机制的磁盘分区。可以在其上建立文件系统。相当于上例子中从大瓶倒入小杯的果汁。
5,PE,物理卷的每个组成单元或者每个物理卷的划分,PE的大小可配置,最小为4M。
至此相信你已经明白了LVM的大致情况,接下来是LVM的使用:
四,LVM的操作使用:
1.LVM的建立:
首先创建目录:/lvm,供lvm分区挂载!
[root@LVM ~]# fdisk -l #查看当前的磁盘分区信息
可以看见/dev/vda1为系统分区,/dev/vdb为可用的分区,实验将从/dev/vdb上进行。
[root@LVM ~]# fdisk /dev/vdb #划分两个磁盘分区(n为创建),并为其修改分区标签(t,标签为LVM)
[root@LVM ~]# pvcreate /dev/vdb1 ##创建物理卷
[root@LVM ~]# vgcreate vg1 /dev/vdb1 #创建物理卷组
[root@LVM ~]# lvcreate -L 50M -n lv1 vg1 #创建逻辑卷,-L是指定lvm的大小,-n是指定lvm的名字
[root@LVM ~]# mkfs.xfs /dev/vg1/lv1 #格式化lvm
[root@LVM ~]# mount /dev/vg1/lv1 /lvm/ #将其挂载到先前创建的目录上供使用
2,LVM的拉伸:
LVM的拉伸分两种情况:当vg中剩余的容量充足,可以满足需要时:
[root@LVM ~]# lvextend -L 80M /dev/vg1/lv1 #将lv1扩展为80M
[root@LVM ~]# xfs_growfs /dev/vg1/lv1 #新增的lvm容量需要重新格式化文件系统,用此命令
当vg中剩余容量不满足需求时,这里以扩展为150M为例,此时需要重新“榨橘子汁“,即新增物理卷。
[root@LVM ~]# pvcreate /dev/vdb2 #将/dev/vdb2加入物理卷中
[root@LVM ~]# vgextend vg1 /dev/vdb2 #扩展vg
[root@LVM ~]# lvextend -L 150M /dev/vg1/lv1 #拉伸LVM
[root@LVM ~]# xfs_growfs /dev/vg1/lv1 #重新格式化文件系统
至此完成LVM的拉伸!
3,在ext系统中的拉伸:
[root@LVM ~]# umount /lvm/ #卸载
[root@LVM ~]# mkfs.ext4 /dev/vg1/lv1 #重新格式化lvm为ext文件系统
[root@LVM ~]# bklid #查看磁盘分区的文件系统
root@LVM ~]# lvextend -L 160M /dev/vg1/lv1 #拉伸lvm
[root@LVM ~]# resize2fs /dev/vg1/lv1 #同步拉伸的lvm的文件系统
[root@LVM ~]# mount /dev/vg1/lv1 /lvm/ #重新挂载使用
4,lvm的缩减:
注意:xfs文件系统不可缩减,而ext文件系统可以,所以需要对逻辑卷重新格式化文件系统
设备缩减:
[root@LVM ~]# umount /lvm/
[root@LVM ~]# e2fsck -f /dev/vg1/lv1 #扫描逻辑卷,防止缩减时数据丢失
[root@LVM ~]# resize2fs /dev/vg1/lv1 60M #缩减为60M并重新格式化文件系统
[root@LVM ~]# mount /dev/vg1/lv1 /lvm/ #重新挂载
[root@LVM ~]# lvreduce -L 60M /dev/vg1/lv1 #缩减未格式化的lvm
卷组缩减:
[root@LVM ~]# pvmove /dev/vdb1 /dev/vdb2 #缩减卷组时就要去除pv,去除pv之前要做数据的转移
[root@LVM ~]# vgreduce vg1 /dev/vdb1 #从vg0中删除vdb1
[root@LVM ~]# pvremove /dev/vdb1 #移除物理卷
5,LVM快照(snapshot):
原理:写时复制原理。创建快照时仅仅拷贝原始卷里数据的元数据,并不是真正的物理拷贝,所以快照的创建几乎是实时的,当原始卷有写操作时,快照就跟随原始卷变化,原始卷会将要改变的数据在改变之前拷贝到快照预留的空间里,称为写时复制原理。
因为在写操作写入块之前,cow就将元数据移动到快照空间里,这就保证了所有的数据
在快照创建时把持一致。而对于快照的读操作,如果是读取数据块没有修改过的,那么会将读操作直接重定向到原始卷上,如果是读取已经修改过的块,那么就会读取拷贝在快照中的数据。
快照的大小并不需要和原始卷一样大,从两方面生命周期考虑:1,从快照创建到释放这段时间内,古迹浩块的改变量有多大,一旦数据记录满了快照预留的空间或者是快照周期结束那么快照就失效了,如果快照和原始卷大小一样,或者比原始卷更大,那么他的寿命就很长了。
快照不需要格书化文件系统,可以直接挂载。
[root@LVM ~]# mount /dev/vg1/lv1 /lvm/ #将原始卷组挂载在/lvm上
[root@LVM ~]# cd /lvm/
[root@LVM lvm]# touch sfile{1..5}
[root@LVM lvm]# umount /lvm/
[root@LVM lvm]# lvcreate -L 50M -n lv1backup -s /dev/vg1/lv1 #创建50M的快照
说明:此处创建50M的快照失败的原因在于vg1的剩余空间过小:
[root@LVM lvm]# lvcreate -L 20M -n lv1backup -s /dev/vg1/lv1 #创建20M的快照
创建成功!
[root@LVM lvm]# mount /dev/vg1/lv1backup /lvm/ #将快照挂载
[root@LVM lvm]# cd /lvm/
[root@LVM lvm]# ls
lost+found sfile1 sfile2 sfile3 sfile4 sfile5 #快照挂载后依然可以看见原始卷组的内容
上图验证了再次创建快照时,依然可以看见原始卷组里的内容
此图完成的是删除lv2backup,重建lv1backup,并查看快照预留空间的使用率
Allocated to snapshot 0.06% #快照预留空间的使用率为0.06%
[root@LVM ~]# umount /lvm/
[root@LVM ~]# mount /dev/vg1/lv1 /lvm
[root@LVM lvm]# dd if=/dev/zero of=testfile bs=1M count=10 #原始卷组挂载并创建10M的文件testfile
此图说明在原始卷组创建文件时快照也跟着同步,即在原始文件里创建了10M的文件后,快照预留空间的占用率达到了50.37%。
Allocated to snapshot 50.37% #此时快照预留空间的使用率
此图完成的是再次在原始卷组里创建20M的文件(快照本身是20M,此时已经超出了快照的预留空间了!),快照失效的实验。
LV snapshot status INACTIVE destination for lv1 #此说明快照失效
快照已经失效,并且不能恢复!
6.LVM的删除:
正确删除做法:
错误删除做法:
即直接利用fdisk /dev/vdb,删除/dev/vdb2时将会出现错误,此处重建LVM完成此实验!
错误删除后使用 partprobe 同步分区表,监控端会出现上图错误!
如何删除残留的卷组呢?
使用命令;
vgreduce vg1 –removemissing 即可完成残留卷组的删除。