逻辑卷管理LVM
Logic Volume Manager
盘碟1 ----\ /-----> 分区1
-------> 硬盘 ----->
盘碟2 ----/ \-----> 分区2
物理卷1 ----\ /-----> 逻辑卷1
--------> 卷组(VG)
物理卷2 ----/ \-----> 逻辑卷2
物理卷PV:
一个可以存放数据的块设备都能成为物理卷,只不过它经过命令初始化过,里面包含逻辑卷的相关元数据。它是逻辑卷技术中,最底层用于存放数据的设备,这些是物理设备。
卷组VG:
它由若干个物理卷组成,构成一个容量更大的逻辑组合体(不是实体),这个组合体所有的容量可以分配逻辑卷使用。
逻辑卷LV:
也是逻辑设备(并没有真正对应的硬件),用户格式化,存放数据的时候,操作的就是这个逻辑设备文件.
首先把原本实验中,用来做软raid分区全部清楚raid信息
# umount /dev/md0
# mdadm -S /dev/md0
# mdadm --zero-superblock /dev/sda{7,8,9,10}
可以把分区类型修改成8e
有了四个空闲的设备可以作为物理卷.
例子1: 创建简单的逻辑卷
1、创建pv
# pvcreate /dev/sda{7,8,9}
查看系统哪些设备是物理卷
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda7 lvm2 a-- 2.01g 2.01g
/dev/sda8 lvm2 a-- 2.01g 2.01g
/dev/sda9 lvm2 a-- 2.01g 2.01g
# pvdisplay
2、创建vg
# vgcreate mysql-vg /dev/sda{7,8,9}
Volume group "mysql-vg" successfully created
创建了一个名字为mysql-vg的卷组,它是由sda7,sda8,sda9组成的
查看卷组的信息
# vgs
VG #PV #LV #SN Attr VSize VFree
mysql-vg 3 0 0 wz--n- 6.01g 6.01g
# vgdisplay
3、创建lv
# lvcreate -n data-lv -L 3G mysql-vg
Logical volume "data-lv" created
创建一个名字为data-lv的逻辑卷,它的容量是来自于mysql-vg这个卷组。
# ls /dev/mysql-vg/data-lv
4、格式化、挂载
# mkfs.ext4 /dev/mysql-vg/data-lv
# mount /dev/mysql-vg/data-lv /mnt
例子: 多逻辑卷进行扩容
支持在线扩容: 逻辑卷正在被挂载使用,但能够对它增加容量
# lvextend -L +1G /dev/mysql-vg/data-lv
Extending logical volume data-lv to 4.00 GiB
Logical volume data-lv successfully resized
《--- +1G 就是在原有基础上添加1G容量
# resize2fs /dev/mysql-vg/data-lv <---重新刷新文件系统的元数据,调整为最新的文件系统容量
例子: 对卷组扩容
添加新的物理卷到卷组中
# pvcreate /dev/sda10
# vgextend mysql-vg /dev/sda10
例子: 裁剪逻辑卷lv的容量
1、不支持在线裁剪
2、裁剪后的容量不能低于裁剪前已用容量
1) 取消挂载
# umount /dev/mysql-vg/data-lv
2) 对逻辑卷上文件系统进行检查,如果有错误先修复
# fsck -f /dev/mysql-vg/data-lv
3) 先使用resize2fs调整为新的容量: 裁剪后逻辑卷应该是2G
# resize2fs /dev/mysql-vg/data-lv 2G
4) 使用lvreduce指令对逻辑卷裁剪量
# lvreduce /dev/mysql-vg/data-lv -L 2G
WARNING: Reducing active logical volume to 2.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce data-lv? [y/n]: y
Reducing logical volume data-lv to 2.00 GiB
Logical volume data-lv successfully resized
5) 重新再去对文件系统进行检查,保证没错
# fsck -f /dev/mysql-vg/data-lv
6) 挂载使用
# mount /dev/mysql-vg/data-lv /mnt
例子:对卷组裁剪容量
就是把没有使用过的物理卷从卷组中移除。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 mysql-vg lvm2 a-- 2.00g 2.00g
/dev/sda7 mysql-vg lvm2 a-- 2.00g 4.00m <---很明显它已经被使用了
/dev/sda8 mysql-vg lvm2 a-- 2.00g 2.00g
/dev/sda9 mysql-vg lvm2 a-- 2.00g 2.00g
所以以上能够移除的就是 sda8,sda9,sda10
# vgreduce mysql-vg /dev/sda8
Removed "/dev/sda8" from volume group "mysql-vg"
例子:把故障的物理卷从卷组中移除。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 mysql-vg lvm2 a-- 2.00g 2.00g
/dev/sda7 mysql-vg lvm2 a-- 2.00g 4.00m
/dev/sda8 lvm2 a-- 2.01g 2.01g
/dev/sda9 mysql-vg lvm2 a-- 2.00g 2.00g
模拟有物理卷损坏了。
# dd if=/dev/zero of=/dev/sda10 bs=1M count=1024
# pvs
Couldn't find device with uuid 1HM3OV-nYid-bBXi-t7RD-Z0R9-ZnVj-3SqKiu.
PV VG Fmt Attr PSize PFree
/dev/sda7 mysql-vg lvm2 a-- 2.00g 4.00m
/dev/sda8 lvm2 a-- 2.01g 2.01g
/dev/sda9 mysql-vg lvm2 a-- 2.00g 2.00g
unknown device mysql-vg lvm2 a-m 2.00g 2.00g
强制把丢失的物理卷从卷组中移除
# vgreduce --removemissing --force mysql-vg
Couldn't find device with uuid 1HM3OV-nYid-bBXi-t7RD-Z0R9-ZnVj-3SqKiu.
Wrote out consistent volume group mysql-vg
之后就不会报错
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda7 mysql-vg lvm2 a-- 2.00g 4.00m
/dev/sda8 lvm2 a-- 2.01g 2.01g
/dev/sda9 mysql-vg lvm2 a-- 2.00g 2.00g
# vgs
VG #PV #LV #SN Attr VSize VFree
mysql-vg 2 1 0 wz--n- 4.01g 2.01g
逻辑卷的其他特性:
可以实现逻辑卷的条带化:相当于raid0
可以实现逻辑卷的镜像: 相当于raid1
可以使用逻辑卷的快照功能,实现数据的“瞬间备份”
例子:实现逻辑卷的条带化,提高数据的读写效率
前提: 卷组中至少有两个不同的物理卷,而且要真正意义上提高速度,肯定这两个物理卷应该是独立硬盘
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 mysql-vg lvm2 a-- 2.00g 2.00g
/dev/sda7 mysql-vg lvm2 a-- 2.00g 4.00m
/dev/sda8 mysql-vg lvm2 a-- 2.00g 2.00g
/dev/sda9 mysql-vg lvm2 a-- 2.00g 2.00g
# lvcreate -n web-lv -L 2G -i 2 mysql-vg
Using default stripesize 64.00 KiB
Logical volume "web-lv" created
创建了一个名字为web-lv ,条带化到2个物理卷,逻辑卷的容量是2G,所以根据条带化的原理,每个物理其实是贡献了1G的空间
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 mysql-vg lvm2 a-- 2.00g 1.00g 《---
/dev/sda7 mysql-vg lvm2 a-- 2.00g 4.00m
/dev/sda8 mysql-vg lvm2 a-- 2.00g 2.00g
/dev/sda9 mysql-vg lvm2 a-- 2.00g 1.00g 《---
格式化、挂载、测试
# mkfs.ext4 /dev/mysql-vg/web-lv
# mount -o sync /dev/mysql-vg/web-lv /mnt
例子:实现镜像逻辑卷
实现数据的冗余,尽管有部分物理卷损坏,数据照样可以访问
至少要有两个可用物理卷来创建镜像逻辑卷。
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 mysql-vg lvm2 a-- 2.00g 1.00g
/dev/sda7 mysql-vg lvm2 a-- 2.00g 2.00g
/dev/sda8 mysql-vg lvm2 a-- 2.00g 2.00g
/dev/sda9 mysql-vg lvm2 a-- 2.00g 1.00g
# lvcreate -n lv-mirror -L 1500M -m 1 --mirrorlog core mysql-vg
Logical volume "lv-mirror" created
创建了一个逻辑卷名字为lv-mirror,大小为1.5G,
-m 1 分别把数据同时保存到两个不同物理卷,保存的数据是一样的。
或者指定使用哪些物理卷进行镜像
# lvcreate -n lv-mirror -L 500M -m 1 --mirrorlog core mysql-vg /dev/sda{9,10}
Logical volume "lv-mirror" created
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv-mirror mysql-vg mwi-a- 1.46g 100.00 <--完全同步状态
web-lv mysql-vg -wi-ao 2.00g
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 mysql-vg lvm2 a-- 2.00g 1.00g
/dev/sda7 mysql-vg lvm2 a-- 2.00g 552.00m 《--
/dev/sda8 mysql-vg lvm2 a-- 2.00g 552.00m 《---说明数据是镜像在sda7,sda8上
/dev/sda9 mysql-vg lvm2 a-- 2.00g 1.00g
如果镜像的逻辑卷中涉及到其中一个物理卷损坏了,如何处理?
模拟故障: dd 命令把其中一个物理卷损坏掉
逻辑卷就无法挂载了
# mount /dev/mysql-vg/lv-mirror /mnt
mount: wrong fs type, bad option, bad superblock on /dev/mapper/mysql--vg-lv--mirror,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
# lvs
Couldn't find device with uuid kCJ3NC-BLeu-FkD7-OQyJ-dcnv-tU4u-KpCcji.
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv-mirror mysql-vg mwi-a- 1.46g 100.00
web-lv mysql-vg -wi-a- 2.00g
把故障设备移除后,才能继续访问原来的镜像逻辑卷,由于原来的其中一个物理卷已经损害了,所以原来镜像逻辑卷就变成了普通逻辑卷了。
# vgreduce --removemissing --force mysql-vg 《--移除损坏掉的物理卷
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv-mirror mysql-vg -wi-a- 1.46g <-- 属性中的m已经没有了,说明已经变成普通的逻辑卷
web-lv mysql-vg -wi-a- 2.00g
现在逻辑卷可以恢复访问:
# mount /dev/mysql-vg/lv-mirror /mnt
把故障的设备修复后,重新加入卷组,然后让逻辑卷重新恢复到镜像状态:
# pvcreate /dev/sda7
Writing physical volume data to disk "/dev/sda7"
Physical volume "/dev/sda7" successfully created
# vgextend mysql-vg /dev/sda7
Volume group "mysql-vg" successfully extended
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda10 mysql-vg lvm2 a-- 2.00g 1.00g
/dev/sda7 mysql-vg lvm2 a-- 2.00g 2.00g 《--加入了卷组了
/dev/sda8 mysql-vg lvm2 a-- 2.00g 552.00m
/dev/sda9 mysql-vg lvm2 a-- 2.00g 1.00g
恢复成镜像逻辑卷
# lvconvert -m 1 --mirrorlog core /dev/mysql-vg/lv-mirror
mysql-vg/lv-mirror: Converted: 1.3%
mysql-vg/lv-mirror: Converted: 35.7%
mysql-vg/lv-mirror: Converted: 68.8%
mysql-vg/lv-mirror: Converted: 100.0%
# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv-mirror mysql-vg mwi-ao 1.46g 100.00 《--恢复
web-lv mysql-vg -wi-a- 2.00g