LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。
如果用标准分区在硬盘上创建了文件系统,为已有文件系统添加额外的空间是一种痛苦的体验。你只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有地方了,你就必须再加一个硬盘,然后可能还需要将已有的文件系统移动到新的硬盘上。
逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理的世界里,硬盘称为物理卷PV。多个物理卷集中在一起可以形成一个卷组VG。逻辑卷管理系统将卷组视为一个整体的物理硬盘。在卷组VG上面则是可以创建逻辑卷LV,而这正是文件系统的分区环境,作用类似于Linux中的物理硬盘分区。Linux系统将逻辑卷LV视为物理分区。
基本的LVM管理概念:
PV(Physical Volume)- 物理卷
物理卷在LVM中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。
VG(Volumne Group)- 卷组
VG卷组建立在PV卷之上,一个VG卷组中至少要包括一个PV卷,在VG卷组建立之后可动态添加PV卷到VG卷组中。一个LVM中可以只有一个VG卷组,也可以拥有多个VG卷组。PV卷是用固定大小的物理区域PE(Physical Extent)来定义的。也可以认为PE就是PV卷的单位。PE的大小是在VG卷指定的。
LV(Logical Volume)- 逻辑卷
LV卷建立在VG卷组之上,VG卷组中的未分配空间可以用于建立新的LV卷,LV卷建立后可以动态地扩展和缩小空间。系统中的多个LV卷可以属于同一个VG卷组,也可以属于不同的多个VG卷组。
下图简要的表明了相互的关系和一些常用的指令。
命令太多,仅仅列出一部分。剩下的可以man.
实验系统环境
实验环境:VMware Workstation Pro 14(试用版)
系统平台:
CentOS release 6.9 (Final) 内核 2.6.32-696.el6.x86_64
CentOS Linux release 7.4.1708 (Core) 内核 3.10.0-693.el7.x86_64 (方法基本与6一致)
LVM 版本:
CentOS6:lvm2-2.02.143-12.el6.x86_64
CentOS7:lvm2-2.02.171-8.el7.x86_64
设备类型:
vmware虚拟物理硬盘、分区、raid 设备
硬盘准备:
每个虚拟机,1GB X 4 ,2GB X 4
磁盘规划如下:
由于基本分区是基础知识,我就不列出过程了,RAID分区可以参考我的另外一个贴子。Centos 软Raid创建与管理
创建好的LVM分别以2种命名方式,都是通过软链接指向真正的dm-X设备。
/dev/mapper/VG卷组名-LV卷名
/dev/VG卷组名/LV卷名
准备工作就绪,下面我们使用三种设备/dev/md0、/dev/sdb1、/dev/sdc1 来完成LVM实验。
创建PV卷
语法: pvcreate /dev/设备名
#pvcreate /dev/md0 /dev/sdc1 /dev/sdb1
Physical volume "/dev/md0" successfully created
Physical volume "/dev/sdc1" successfully created
Physical volume "/dev/sdb1" successfully created
注意,创建PV卷的时候,有挂载的话请先umount原来的磁盘分区或设备,否则可能出现以下提示
Can't open /dev/md0 exclusively. Mounted filesystem?
使用命令pvs 和pvscan 查看简略信息
当然,也可以使用pvdisplay查看更详细的信息
创建VG卷
看到下图的PE相关的数字都是0了吗?因为,这些参数是在VG创建的时候指定的
一个物理PV卷只能同时分配给一个VG卷
#vgcreate -s 16M vg0 /dev/md0 /dev/sd{b1,c1}
Volume group "vg0" successfully created
命令解读:
-s 16M 指定PE的大小为16M。默认不指定是的4M
vg0 VG卷组名
/dev/md0 /dev/sd{b1,c1} 加入vg0卷组的PV卷名
此时就可以看到PE的相关信息了
使用vgdisplay查看详细信息
创建LV卷
#lvcreate -n LV0 -L 2G VG0
Logical volume "LV0" created.
命令解读:
-n LV0 指定LV卷名
-L 2G 指定LV0卷的容量为2GB
VG0 指定从VG0卷组中划分容量
使用lvs,lvscan,lvdisplay都可以查看LV卷相关的信息
从VG卷的信息里可以看到数值发生了变化
继续创建第二个LV卷,此时可以有多种方法指定大小了,
-L 指定剩下空间容量
-l 指定剩下的PE数量
-l +100%FREE 指定剩下的Free百分比
#lvcreate -n LV1 -l +100%FREE VG0
Logical volume "LV1" created.
查看存在LV数量
前面讲过创建LV卷后会有2种命令显示,其实都是通过软链接指向了真正的dm-X设备。因此,命名的时候,建议取有意义的名字。
创建LV卷上的文件系统
mkfs.ext4 /dev/VG0/LV0 -L "/mnt/LV0"
mkfs.ext4 /dev/VG0/LV1 -L "/mnt/LV1"
挂载使用
#mount -a
#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VG0-LV0 2.0G 3.0M 1.9G 1% /mnt/LV0
/dev/mapper/VG0-LV1 3.4G 6.9M 3.2G 1% /mnt/LV1
测试下性能(实际中会更可观),毕竟是VG卷的底层就是由多块磁盘构成的,与RAID 0相似
LVM的扩容操作
LVM最大的好处就是可以对磁盘进行动态管理,可以对LVM进行扩容或者缩小。扩容的时候基本不会对数据有影响,缩小的时候,如果存放的数据大于缩小后的空间,将需要提前将数据进行备份。
先扩展VG卷》再扩展LV卷
#vgs
VG #PV #LV #SN Attr VSize VFree
VG0 3 2 0 wz--n- 5.45g 0
想要扩容必须VG卷有空空余容量,既然现在没有空余,那我们就继续从其他设备或分区添加。这里有一个分区/dev/sdb2是空闲的,直接添加会发生什么情况呢?
#pvcreate /dev/sdb2
Device /dev/sdb2 not found (or ignored by filtering).
因此,如果想对磁盘分区进行LVM操作,必须使用分区工具(如fdisk)将此分区的分区类型变为8e Linux LVM
Device Boot Start End Blocks Id System
/dev/sdb2 66 130 522112+ 8e Linux LVM
记录通知内核更新分区信息
#partx -a /dev/sdb
#pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created
变成PV卷了,但是目前此PV卷并没有明确归属给哪个VG卷组使用
扩展VG卷
#vgextend VG0 /dev/sdb2
Volume group "VG0" successfully extended
命令解读:
VG0 指定扩容的VG卷组名
/dev/sdb2 指定添加哪个设备添加到扩容VG卷组
刚好多出了496M的容量,也就是刚才添加的/dev/sdb2
扩展LV卷
扩展前的LV卷
扩展的时候,就要注意了
直接指定数值,就是扩展到XX容量
+数值,就是在原有数值上增加多少容量
比如:
#lvextend -L 5G /dev/VG0/LV0 将 LV0的容量扩展到5G
#lvextend -L +5G /dev/VG0/LV0 将 LV0的容量增加5G
本例中将刚添加的空间全部划分到LV0
#lvextend -l +100%FREE /dev/VG0/LV0
Size of logical volume VG0/LV0 changed from 2.00 GiB (128 extents) to 2.48 GiB (159 extents).
Logical volume LV0 successfully resized.
上面的图确实LV空间增长了,但是使用df -h 命令时,却发现使用的容量并没有增长呢,怎么回事呢?
那是因为空间增加了,文件系统并没有扩展,因此需要使用
#resize2fs /dev/VG0/LV0
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/VG0/LV0 is mounted on /mnt/LV0; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/VG0/LV0 to 651264 (4k) blocks.
The filesystem on /dev/VG0/LV0 is now 651264 blocks long.
看到了吧,扩容是在线添加的,用户是不受影响的哦。
下图就确认了容量确实可以使用上增加的了。
LVM的缩减操作
缩减操作需要离线处理,缩减有风险,请注意备份数据。
缩减LV卷
本示例以缩减LV1为场景,目标是缩小到 2GB
A. umount 文件系统
#umount /mnt/LV1
B. 缩减文件系统
#resize2fs /dev/VG0/LV1 2G 注意,这里的2G是缩小到最终的容量
Please run 'e2fsck -f /dev/VG0/LV1' first.
C. 检查磁盘
#e2fsck -f /dev/VG0/LV1
D. 再次执行缩减文件系统操作
#resize2fs /dev/VG0/LV1 2G
E. 缩减LV
既然是缩小到2GB,那么就有2种方法来处理了。
1.指定目标最终的容量大小
使用命令:#lvreduce /dev/VG0/LV1 -L 2G
2.指定缩小多少到目标容量
使用命令:#lvreduce /dev/VG0/LV1 -L -1.45G
Step E 和Step D 缩减的大小必须保持一致,2种不同的命令产生的最终空间不一致,这些算法上面的小差异,请注意。
看到了吧,lvs的减少,刚好是vgs的VFree增加。
F. 挂载查看
#mount -a
#df -h /dev/VG0/LV1
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VG0-LV1 2.0G 5.2M 1.9G 1% /mnt/LV1
至此,LV卷的缩减完成。
缩减VG卷
xfs文件系统不支持缩减操作。
查看哪个PV卷的PFree是完整的,也就是完全没有PE被使用。这样可以不用umount,直接缩减掉
#vgreduce VG0 /dev/sdb1
Removed "/dev/sdb1" from volume group "VG0"
此时/dev/sdb1已经不属于任何VG卷了
#vgs (缩减前)
VG #PV #LV #SN Attr VSize VFree
VG0 4 2 0 wz--n- 5.94g 1.45g
#vgs (缩减后)
VG #PV #LV #SN Attr VSize VFree
VG0 3 2 0 wz--n- 5.45g 992.00m
如果没有一个完整的磁盘的PFree,则会提示在使用
#vgreduce VG0 /dev/sdb1
Physical volume "/dev/sdb1" still in use
如果发生以下的提示错误,那就是缩减过度,原来的文件系统属性中的block count数值大于缩减后的值,将会无法mount使用。只有lvextend回到合理值才会正常。
#dmesg|tail
EXT4-fs (dm-1): bad geometry: block count 905216 exceeds size of device (131072 blocks)
EXT4-fs (dm-1): bad geometry: block count 905216 exceeds size of device (131072 blocks)
[root@a69 LV1]#du -ah
16K ./lost+found
1001M ./lv1
1001M ./lv3
224M ./lv2
2.2G .
LVM的PV卷替换操作
为什么需要替换PV卷呢?因为LVM卷不像RAID设备,有容错功能,它只是一堆磁盘的集合,因此磁盘的健康度需要随时关注,以防止某块磁盘的损坏而导致数据的丢失。当硬件监控到某块磁盘设备提示异常时,一般可能会报警或亮黄灯。那么这个时候就需要将某个硬盘替换下来,那么这个上面关联的数据就要移走了。
关键要点:
A. 重要数据备份
这个是基本,用你喜欢的方式吧
B. 查看需要替换的磁盘上面的PV卷上的PE数量
本例中以替换/dev/sdb2为例子,一共需要31个PE
#pvdisplay
C.查看需要替换PV卷所属的VG卷是否有大于替换PV卷PE数量的容量
剩余空闲PE 63 > 31个,满足基本条件
#pvmove /dev/sdb1
/dev/sdb1: Moved: 0.0%
/dev/sdb1: Moved: 100.0%
/devsdb1的Free PE数量等于Total PE了,也就是完全腾空了数据。
把/dev/sdb1移出VG0卷组
#vgreduce VG0 /dev/sdb1
Removed "/dev/sdb1" from volume group "VG0"
把PV卷变为普通磁盘
#pvremove /dev/sdb1
Labels on physical volume "/dev/sdb1" successfully wiped
LVM的迁移至新主机操作
可能实际中,原来的LVM卷上的主机由于服役年限长了性能也不如新买的主机好,可靠性也没有新主机高,此时迁移操作就派上用场了。
提前准备好以下措施
1.提前考虑到新主机是否有同名的VG卷或LV卷,建议先在原主机把VG卷和LV卷使用先改名称。
2.备份好重要资料
开始迁移:
A.卸载迁移的LV卷
#umount /dev/VG-NEW/LV-NEW
B.禁用将要迁移的VG卷
#vgchange -an VG-NEW
0 logical volume(s) in volume group "VG-NEW" now active
C.将要迁移的VG卷变为导出状态
#vgexport VG-NEW
Volume group "VG-NEW" successfully exported
#lvdisplay
Volume group VG-NEW is exported
#lvs
Volume group VG-NEW is exported
D.将要迁移的VG卷对应的物理硬盘找到,拆卸并安装至新主机(不支持热拔插的就安心的关机吧)
这里以Centos 7为新主机,新主机增加了一块sdj磁盘
sdk 8:160 0 4G 0 disk
使用pvscan等命令将会发现主机上面的LVM卷信息
E.将迁移的VG导入
#vgimport VG-NEW
Volume group "VG-NEW" successfully imported
F.激活VG卷
#vgchange -ay VG-NEW
1 logical volume(s) in volume group "VG-NEW" now active
G.挂载使用
#mount /dev/VG-NEW/LV-NEW /mnt
数据同时也一起过来了,没有丢失
#cat old_lv_data
this old LV-NEW data
删除LVM
与创建的时候不一样,删除则是把顺序倒过来操作。
A.卸载挂载点
#umount /mnt
B.停止并删除LV卷
#lvchange -an /dev/VG-NEW/LV-NEW
#lvremove /dev/VG-NEW/LV-NEW
Logical volume "LV-NEW" successfully removed
C.停止并删除VG卷
#vgchange -an VG-NEW
0 logical volume(s) in volume group "VG-NEW" now active
#vgremove VG-NEW
Volume group "VG-NEW" successfully removed
D.删除PV卷
#pvremove /dev/sdk
Labels on physical volume "/dev/sdk" successfully wiped.
LVM快照snapshot
LVM允许你创建在线逻辑卷的可读写快照。有了快照,就可以删除原先的逻辑卷,然后将快照作为替代挂载上。这个功能对快速故障转移可涉及修改数据的程序试验(如果失败,需要恢复修改过的数据)非常有用。
快照就是将当时的系统信息记录下来,就好像照相一样,未来若有任何资料变动了,则原始资料会被移动到快照区,没有被改动的区域则由快照区与档案系统共享。
LVM 系统快照区域的备份示意图(虚线为档案系统,长虚线为快照区)
左图为最初建立系统快照区的状况,LVM 快照区域 (左图的左侧三个PE 区块) 作为数据存放处。此时快照区内并没有任何数据,而快照区与系统区共享所有的PE 数据, 因此你会看到快照区的内容与文件系统是一模一样的。等到系统运作一阵子后,假设A 区域的数据被更动了 (上面右图所示),则更动前系统会将该区域的数据移动到快照区,所以在右图的快照区被占用了一块PE 成为A,而其他B~I 的区块则还是与文件系统共享。
由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG卷。创建快照的时候的文件数量不能高于快照区的实际容量
本次实例以操作VG0卷为例,此VG0卷一共2GB容量,以下约定名称以便清晰讲解
#lvcreate -n LV0-snapshot -l 100%FREE -s -p r /dev/VG0/LV0
命令解读:
-n LV0-snapshot 指定创建的快照的名称
-l 100%FREE 指定快照使用的容量,这里是使用VG卷组中剩余容量100%
-p r 指定权限为只读
/dev/VG0/LV0 指定为哪个LV卷生成快照
A区的数据如下:
#cat a b nmu
a 》aaa
b 》bbb
nmu 》123456
把B区数据挂载到一个目录,看下。(xfs文件系统创建了快照后是无法挂载的)
[root@a69 LV0-Snapshot]#ll
total 12
-rw-r--r--. 1 root root 4 Dec 12 20:11 a
-rw-r--r--. 1 root root 4 Dec 12 20:11 b
-rw-r--r--. 1 root root 7 Dec 12 20:11 nmu
咦,不是说刚创建的时候是空的状态吗?怎么回事。快照区内并没有任何数据,而快照区与系统区共享所有的PE 数据, 因此你会看到快照区的内容与文件系统是一模一样的。现在可以深刻理解这段话的意思了吧。
测试开始了
把A区的a文件修改一下
#echo 123 >> a
#cat a
aaa
123
#cat /mnt/LV0-Snapshot/a B区的文件内空还是原来最旧的那个版本
aaa
把A区的b文件删除了
#rm b
rm: remove regular file `b'? y
#cat /mnt/LV0-Snapshot/b B区的文件还在且内空还是原来最旧的那个版本
bbb
在A区的创建一个新文件
#echo newfile > newfile
#cat newfile
ll /mnt/LV0-Snapshot B区并没有新增加的文件
-rw-r--r--. 1 root root 4 Dec 12 20:11 a
-rw-r--r--. 1 root root 4 Dec 12 20:11 b
-rw-r--r--. 1 root root 7 Dec 12 20:11 nmu
由此可以明确的看出来,快照区的内容就是当时创建快照时命令一回车一下去的时候,当时状态数据的完整备份。
现在把A区的文件全部删除,并且再创建一个全新的文件。
#rm -rf *
#echo newfile2 > newfile2
用快照数据恢复,在恢复之前,得把A和B都umount。
#umount /mnt/LV0
#umount /mnt/LV0-Snapshot/
#lvconvert --merge /dev/VG0/LV0-snapshot
Merging of volume LV0-snapshot started.
LV0: Merged: 100.0%
Merge of snapshot into logical volume LV0 has finished.
Logical volume "LV0-snapshot" successfully removed
A区的数据回来了,可是最后创建的新文件却没了。覆盖性的恢复呢
#ls
a b nmu
#cat *
aaa
bbb
123456
另外,快照卷也没有了,到这里,明白了。快照是用自身的数据来顶替原来的LV卷的。
LVM镜像
通过LVM安装文件系统并不意味着不会再出问题。和物理分区一样,LVM逻辑卷也容易受到断电和磁盘故障影响。一旦文件系统损坏,就有可能再也无法恢复。
LVM快照功能提供了一些安慰,你可以随时的创建逻辑卷的备份副本,但对有些环境来说可能还不够。对于涉及大量数据变动的系统,比如你的数据库服务器,自上次快照之后可能要存储成百上千条记录。
这个问题的一个解决方法就是LVM镜像。镜像是一个实时更新的逻辑卷的完整副本。
一旦LVM镜像同步完成,LVM会为文件系统的每次写操作执行2次写入:1次写入到逻辑卷,1次写入镜像卷。这个过程会降低系统的写入性能。这是一种折中的方案,如果原始逻辑卷因为某些原因损坏了,手头上也已经有一个完整的最新的副本。
以下实验待续吧~~~
必要条件,创建镜像的时候,必须在同一个VG卷组里,且这个卷组至少有2块PV卷,被当作镜像盘的PV卷容量需要大于数据盘PV卷。
创建镜像卷的时候,会创建镜像盘,镜像日志盘
#pvs
PV VG Fmt Attr PSize PFree
/dev/sdf VG0 lvm2 a--u 2.00g 1020.00m 数据盘
/dev/sdg VG0 lvm2 a--u 2.00g 2.00g 镜像盘
/dev/sdi VG0 lvm2 a--u 2.00g 2.00g 镜像盘
/dev/sdj VG0 lvm2 a--u 4.00g 4.00g 镜像日志盘
#lvcreate -m 1 -n mirror-VG0 -l 100%FREE VG0 /dev/sd{g,i,j}
Logical volume "mirror-VG0" created.
命令解读:
-m 1 创建镜像卷
-n mirror-VG0 指定镜像卷名字
-l 100%FREE 指定镜像卷容量
VG0 指定镜像哪个卷
/dev/sd{g,i,j} 镜像卷包含的PV卷
移除失效的VG卷
#vgreduce --removemissing --force VG0
Couldn't find device with uuid 525vmy-4JK7-dKEM-crOB-lFaZ-pbYA-iCdVyo.
Couldn't find device for segment belonging to VG0/LV0 while checking used and assumed devices.
Couldn't find device for segment belonging to VG0/LV0 while checking used and assumed devices.
Removing partial LV LV0.
Logical volume "LV0" successfully removed
Wrote out consistent volume group VG0
#lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mirror-VG0 VG0 mwi-a-m--- 3.99g [mirror-VG0_mlog] 100.00