- 什么是逻辑卷?
LVM(Logical Volume Manager)逻辑卷管理器version2,逻辑卷管理器是在Linux2.4内核以上实现的磁盘管理技术。它是Linux环境下对磁盘分区进行管理的一种机制。LVM通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。传统的分区方式主要缺点是当磁盘空间不足时,无法实现直接对分区进行扩展,然后数据需要迁移的话业务会受到一定程度的影响,而磁盘以逻辑卷的方式在系统使用时,当面临分区空间不足时,逻辑卷可以支持在线扩展,业务不会受到影响。而且逻辑卷在读写速率上有一定的优势。
- 逻辑卷的优点
①支持逻辑卷分区的在线扩展
②逻辑卷不关心数据存储在底层哪个磁盘,文件系统大小不受物理磁盘大小的限制
③支持新加磁盘至卷组中,只有有物理磁盘槽位就行
④支持快照功能
⑤支持导出整个卷组,方便硬盘迁移
- 逻辑卷:
①Linux Block Device 可以是磁盘单个分区,整个磁盘,硬件实现RAID,大小可以不相同。磁盘分区需要修改分区类型为8e,整块磁盘可以直接添加标签。
②physical volumes 物理设备,相当于在block device上添加一个标签,设备数目不改变。
③Volume Group PV的组合,可以PV的部分,也可以是全部PV,相当于将磁盘逻辑上组合成一个大的磁盘。
④logical volumes逻辑卷,逻辑卷不关心它的具体空间来自于哪一物理设备,而且当逻辑卷的空间不足时,可以支持在线扩展,前提是卷组有剩余空间。因为直观上逻辑卷直接从卷组中拿空间。
⑤Physical Extent – PE:每个物理卷被划分基本单元称为physical extents,具有唯一编号的PE是可以被LVM寻址的最小单元,默认每个PE的大小是4M。
⑥logical extent – LE:逻辑区域是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。
- PV管理工具
①显示pv信息:
pvs:简要pv信息显示
pvdisplay 详细显示PV信息
②创建pv :pvcreate /dev/sd*
③删除pv :pvremove /dev/sd*
- vg管理工具
①显示卷组:vgs | vgdisplay
②创建卷组
vgcreate [-s #[kKmMgGtTpPeE]] VGName /dev/sd*
③管理卷组
vgextend VGName /dev/sd*
vgreduce VGName /dev/sd*
④删除卷组
先做pvmove,再做vgremove
- 扩展逻辑卷:
lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME
- 缩减逻辑卷:只针对于EXT系列文件系统
umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
mount
- 跨主机迁移卷组
1)逻辑卷的使用:
①先创建PV,先创建了两个分区,修改分区表示8e,
[root@centos7 ~]# pvcreate /dev/sdb1 /dev/sdc1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
[root@centos7 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 --- 2.00g 2.00g
/dev/sdc1 lvm2 --- 1.00g 1.00g
可以看到此时PV并未创建为VG
[root@centos7 ~]# lsblk
.....此时查看设仍然还是多块设备,但在后面有TYPE="LVM2_member" 标签
/dev/sdb1: UUID="ZdGBmG-4f51-ZY9Z-rUY2-Am1F-HctA-XSgr1X" TYPE="LVM2_member"
/dev/sdc1: UUID="TEbpj5-4gJ2-cK2R-BQxQ-dYx4-qDUa-6fZDO6" TYPE="LVM2_member"
②利用现有PV组合成一块大的磁盘,即生成VG
[root@centos7 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 lvm2 --- 2.00g 2.00g
/dev/sdc1 lvm2 --- 1.00g 1.00g
[root@centos7 ~]# vgcreate vg0 /dev/sdb1 /dev/sdc1
Volume group "vg0" successfully created
[root@centos7 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg0 2 0 0 wz--n- 2.99g 2.99g
[root@centos7 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 vg0 lvm2 a-- <2.00g <2.00g
/dev/sdc1 vg0 lvm2 a-- 1020.00m 1020.00m
此时一个逻辑上的由/dev/sdb1和/dev/sdc1组合成的磁盘已经被创建
当然此时创建时默认没有指明PE大小,默认为4M
③在创建好的VG可以再划分小块的LV使用,LV大小由PE个数决定,而且建议将
LV的名称与实际应用名称保存一致,并在创建时指明大小:
[root@centos7 ~]# lvcreate -n mysql -L 1.5G /dev/vg0
Logical volume "mysql" created.
[root@centos7 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% ....
mysql vg0 -wi-a----- 1.50g
至此LV已经创建完成
④LV创建完成之后,类似于硬盘分区创建,之后就是创建文件系统,然后挂载使用。
pvdisplay:查看PV的详细信息
vgdisplay:查看VG的信息
lvdisplay :查看LV的信息
逻辑卷创建后的信息:
2)逻辑卷的扩展
[root@centos7 ~]# mount -L '/mnt/mysql' /mnt/mysql/
对上述逻辑卷进行文件系统创建之后,挂载使用
[root@centos7 ~]# df -TH (H单位是1000)
....当此时
/dev/mapper/vg0-mysql ext4 1.6G 4.8M 1.5G 1% /mnt/mysql
~]# dd if=/dev/zero of=/mnt/mysql/f1 bs=1M count=1024
~]# df -TH
...(生成个大文件,然后查看逻辑卷的空间不足,打算扩展逻辑卷的空间)
/dev/mapper/vg0-mysql ext4 1.6G 1.1G 376M 75% /mnt/mysql
①分析卷组是否有空闲的PE数可供/dev//vg0/mysql这个逻辑卷使用
②若无剩余空闲PE,需先扩展VG空间,选择直接添加磁盘生成PV,再组合成同一VG
③有剩余空闲PE时,直接在线扩展LV空间,
[root@centos7 ~]# lvextend -L +1G /dev/vg0/mysql
...扩展成功
[root@centos7 ~]# df -TH
....(显示扩展成功,但是df -TH查看空间时并未扩展)
/dev/mapper/vg0-mysql ext4 1.6G 1.1G 376M 75% /mnt/mysql
此时需要注意:df查看的是文件系统的使用情况,而且是文件系统实际使用
空间(稀疏文件显示实际使用空间)
④同步扩展逻辑卷的文件系统
~]# resize2fs /dev/vg0/mysql ext系列文件系统
~]# xfs_growfs /dev/vg0/mysql xfs文件系统
或者扩展时一步到位: lvextend -r 加 -r选项
lvextend -r -l +100%free /dev/vg0/mysql
3)逻辑卷的缩减 (只针对ext系列逻辑卷、xfs文件系统只支持扩展)
缩减要考虑实际使用情况,当缩减后逻辑卷空间小于上面存储的数据的空间,将导
致数据丢失,因此一般不会缩减逻辑卷,此处也不再实验啦~
注意:逻辑卷缩减首先需要离线状态
即①取消挂载
②检查文件系统(不检查会报错,会提示检查文件系统)
③resize2fs /dev/LVMName #G 缩减至#G(先缩文件系统)
④~]# lvreduce -L 1.8G /dev/vg0/mysql
⑤重新挂载使用
4)逻辑卷磁盘的删除
当构成逻辑卷的其中一块硬盘故障时,会影响整个卷组,解决办法是,当发现构成
逻辑卷的硬盘组中有硬盘显示指示灯出现变黄时(绿色正常,红色故障,黄色预警),
此时应将此硬盘正在使用的PE找同一卷组中的空闲PE存放。
关键词:硬盘即将故障;转移PE;同一卷组;空闲PE
①若空余空间不足,添加物理磁盘,将物理设备生成PV
②将卷组的空间扩展,是空闲PE数足够容纳剔除磁盘使用的PE数
③执行:pvmove /dev/Device(同一卷组中剩余PE不够时,此命令不能执行)
注意:此命令搬的是空间,当然数据跟随空间一起搬移了。
④将此硬盘从卷组中移除:~]# vgreduce VGName /dev/sd*
⑤将设备的物理卷删除:~]# pvremove /dev/sd*
⑥此时可以拔出磁盘
5)逻辑卷扩主机迁移
1、 源计算机上
①在旧系统中,umount所有卷组上的逻辑卷
②禁用卷组
vgchange –an vg0
lvdisplay
③导出卷组
vgexport vg0
pvscan
vgdisplay
拆下旧硬盘
2、 在目标计算机上
④在新系统中安装旧硬盘,并导入卷组:vgimport vg0
⑤vgchange –ay vg0 启用
⑥mount所有卷组上的逻辑卷
- 逻辑卷快照的实现原理:
在逻辑卷同一卷组中创建一个快照逻辑卷,创建时指定容量和名称。 此时命令一
敲一回车快照就生成了,但是生成的快照并非是备份原逻辑卷中的文件,快照只是
在卷组中生成了指定容量的空间而已,此空间用于存储逻辑卷中变化的文件(删除、或者修改等)—相对于刚才创建时那瞬间。最初的版本在逻辑卷快照中,最后的版本在逻辑卷中,中间改过的其他版本不知道在哪…快照会影响性能,现在修改文件的话会先复制一份去快照空间中,因此快照用完之后,建议直接删除。快照中只保存执行命令时的当前状态内容…
- 关键词:快照是逻辑卷,要求快照与逻辑卷在同一卷组,快照可以指定大小(可以跟原始状态大小不一样,看你需要变化的数据大小),快照空间保存内容的命令回车那一瞬间的原始数据(要求这些原始数据会发生变化时复制至快照空间)
- 适用场景:在逻辑卷中临时性的修改一些文件,修改的东西用于测试使用,当
测试完成之后,希望回到逻辑卷的原有状态,此时可以考虑快照。快照比较适合这样的场景。生成快照比数据备份花费的时间更少。
快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝
对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适
的选择
快照只有在它们和原来的逻辑卷不同时才会消耗空间
在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照
快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享
由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG中.系统恢复的时候的文件数量不能高于快照区的实际容量
- 使用LVM快照
1)为现有逻辑卷创建快照
lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data
2)挂载快照
mkdir -p /mnt/snap
mount -o ro /dev/vg0/data-snapshot /mnt/snap
3)恢复快照
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot
4)删除快照
umount /mnt/databackup
lvremove /dev/vg0/databackup
创建快照:
①指定对哪个逻辑卷创建快照,一般设置为只读属性,或者挂载是设置为只读
因为快照中将保存的快照瞬间的文件。
~]# ls -lh
...(目前我逻辑卷下文件,数目较少文件也不大,因此我创建一个500M的快照)
-rw-r--r-- 1 root root 595 Aug 13 14:26 fstab
-rw-r--r-- 1 root root 94 Aug 13 14:26 issue
-rw-r--r-- 1 root root 0 Aug 13 14:26 motd
-rw-r--r-- 1 root root 2.4K Aug 13 14:26 passwd
创建快照,并设置大小,指定名称(便于识别是哪个逻辑卷的快照)
~l]# lvcreate -n mysql_snapshot -s -L 500M /dev/vg0/mysql
查看创建的快照信息:lvdisplay
--- Logical volume ---
LV Path /dev/vg0/mysql
....
LV snapshot status source of mysql_snapshot [active]
.... mysql_snapshot快照的源
--- Logical volume ---
LV Path /dev/vg0/mysql_snapshot
LV Name mysql_snapshot
.........
LV snapshot status active destination for mysql
..... (mysql 逻辑卷的快照)
创建扩展命令一回车,快照就创建完成了,因为相当于创建一个逻辑卷,只分
配了空间
~]blkid (看到快照的UUID与源逻辑卷的UUID是一样的)
/dev/mapper/vg0-mysql: UUID="1e388039-5e05-4b25-955d-3c2b6a1c65b8" TYPE="xfs"
/dev/mapper/vg0-mysql_snapshot: UUID="1e388039-5e05-4b25-955d-3c2b6a1c65b8" TYPE="xfs"
将快照挂载一个目录下,观察刚创建的快照是否有文件?
~]mkdir /mnt/snap;mount -o nouuid /dev/vg0/mysql_snapshot /mnt/snap
(因为UUID一样,xfs默认只允许挂载一个,挂载时需要设置挂载选项)
[root@centos7 snap]# ll /mnt/mysql/
total 12
-rw-r--r-- 1 root root 595 Aug 13 14:56 fstab
-rw-r--r-- 1 root root 94 Aug 13 14:55 issue
-rw-r--r-- 1 root root 0 Aug 13 14:56 motd
-rw-r--r-- 1 root root 2443 Aug 13 14:56 passwd
[root@centos7 snap]# ll /mnt/snap/
total 12
-rw-r--r-- 1 root root 595 Aug 13 14:56 fstab
-rw-r--r-- 1 root root 94 Aug 13 14:55 issue
-rw-r--r-- 1 root root 0 Aug 13 14:56 motd
-rw-r--r-- 1 root root 2443 Aug 13 14:56 passwd
可以看见快照中存在文件?但是这个文件实际上来自于原有逻辑卷
当我对源逻辑卷中数据进行修改时:
[root@centos7 mysql]# ll /mnt/mysql/
total 8
-rw-r--r-- 1 root root 0 Aug 13 15:07 f5
-rw-r--r-- 1 root root 595 Aug 13 14:56 fstab
-rw-r--r-- 1 root root 22 Aug 13 15:07 issue
[root@centos7 mysql]# ll /mnt/snap/
total 12
-rw-r--r-- 1 root root 595 Aug 13 14:56 fstab
-rw-r--r-- 1 root root 94 Aug 13 14:55 issue
-rw-r--r-- 1 root root 0 Aug 13 14:56 motd
-rw-r--r-- 1 root root 2443 Aug 13 14:56 passwd
②将快照数据恢复
取消挂载;快照和逻辑卷挂载均取消
然后执行~]# lvconvert --merge /dev/vg0/mysql_snapshot
还原之后逻辑卷的快照就被删除了。
由于上述实验:创建快照时默认里面文件,感觉像是直接拷贝,因此我创建了
一个小于文件大小快照:挂载快照查看文件内容,仍然有源逻辑卷的文件---
[root@centos7 ~]# lvcreate -s -n mysql_snapshot -L 2K /dev/vg0/mysql
Rounding up size to full physical extent 4.00 MiB
Logical volume "mysql_snapshot" created.
[root@centos7 ~]# mount -o nouuid /dev/vg0/mysql_snapshot /mnt/snap/
[root@centos7 ~]# ll -h /mnt/snap/
total 12K
-rw-r--r-- 1 root root 595 Aug 13 14:56 fstab
-rw-r--r-- 1 root root 94 Aug 13 14:55 issue
-rw-r--r-- 1 root root 0 Aug 13 14:56 motd
-rw-r--r-- 1 root root 2.4K Aug 13 14:56 passwd
xfs文件系统只允许挂载一次,快照本身应该是只读的,可以在创建快照时设
置只读,但是系统对xfs文件系统只读挂载不支持,因此还是建议在挂载时设
置只读选项。