Linux LVM管理机制
欢迎来到 来到大浪涛天的博客 !
一、Linux LVM管理机制
1. Linux LVM 介绍
LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制。LVM是利用了Linux内核中的dm模块,将底层的一个或多个设备组织成一个逻辑块的模块,注意RAID是利用内核的md模块。
LVM的卷的原始目录是在/dev/dm-#,因为我们不好区分所以有两个软链接路径分别为:
- /dev/mapper/VG_NAME-LV_NAME
- /dev/VG_NAME/LV_NAME
2. Linux LVM 的源由
在对未来的业务无法预知的情况下,直接使用fdisk分区挂载的话,随着时间的推移,数据量越来越大,硬盘空间越来越小,要想扩充容量的话,就必须挂载新硬盘然后做数据迁移,这就必然导致前台业务的停止,不符合企业需求,因此完美的解决方法应该是在零停机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。Linux提供的逻辑盘卷管理(LVM,Logical Volume Manager)机制就是一个完美的解决方案。LVM逻辑卷管理通过将底层物理硬盘抽象封装起来,以逻辑卷的形式表现给上层系统,逻辑卷的大小可以动态调整,而且不会丢失现有数据。新加入的硬盘也不会改变现有上层的逻辑卷,大大提高了磁盘管理的灵活性。
3. Linux LVM 的机制
3-1. Linux相关术语如下:
- 物理存储介质(The physical media):这里指系统的存储设备:硬盘,如:/dev/hda、/dev/sda等等,是存储系统最低层的存储单元。
- 物理卷(physical volume):物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
- 卷组(Volume Group):LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
- 逻辑卷(logical volume):LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。
- PE(physical extent):每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
- LE(logical extent):逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
3-2. Linux LVM原理
- 一块硬盘(物理存储介质)被格式化为物理卷(physical volume),其内部被分成若干个可以自定义大小的存储块的PE(physical extent)。
- PV的基础上创建卷组(Volume Group),可以把一个或者多个PV加到VG中,VG就好像一个空间池,假如多少个PV,VG就有多大的容量。
- 最后基于VG创建逻辑卷(logical volume),一个逻辑卷就是若干个LE。
- 将LV格式化再挂载(将LV当成是分区),这个就是我们日常使用的卷,格式化的过程当然也是整个存储空间划分block和inode的过程。
4. Linux LVM相关的命令
4-1. PV管理相关的命令:
- pvcreate:创建pv卷。
[root@test01 ~]# pvcreate /dev/sdb1
- pvdisplay:详细显示pv的信息,可以直接pvdisplay,也可以后面跟设备,单独显示某设备的详细信息。
[root@test01 ~]# pvdisplay /dev/sde
"/dev/sde" is a new physical volume of "2.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sde
VG Name
PV Size 2.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 7E0Xej-RZUE-uUZt-psed-53dF-N2oW-TBwG0Y
- pvmove:移除设备上的pe,用于vgreduce掉vg中的设备前的操作,如:
[root@test01 ~]# pvmove /dev/sdb1
No data to move for myvg
- pvremove:删除pv卷
[root@test01 ~]# pvremove /dev/sde
Labels on physical volume "/dev/sde" successfully wiped.
- pvs:简要显示pv的信息。
[root@test01 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sde lvm2 --- 2.00g 2.00g
[root@test01 ~]# pvs /dev/sde
PV VG Fmt Attr PSize PFree
/dev/sde lvm2 --- 2.00g 2.00g
4-2. VG管理工具相关命令
- vgdisplay:显示vg的详细信息,和pvdisplay类似,如:
[root@test01 ~]# vgdisplay myvg
--- Volume group ---
VG Name myvg
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size <5.99 GiB
PE Size 4.00 MiB
Total PE 1533
Alloc PE / Size 0 / 0
Free PE / Size 1533 / <5.99 GiB
VG UUID 9hA9hh-Mz3x-pJsK-b27b-wEKk-9dQH-29bRiI
- vgextend:添加未使用的设备来扩展vg池,例如:
[root@test01 ~]# vgextend myvg /dev/sde1
Volume group "myvg" successfully extended
[root@test01 ~]# vgs myvg
VG #PV #LV #SN Attr VSize VFree
myvg 4 0 0 wz--n- 7.98g 7.98g
- vgs:显示vg的简要信息,和pvs类似,如:
[root@test01 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos_centos7-tmp 1 2 0 wz--n- 30.30g 4.00m
myvg 3 0 0 wz--n- <5.99g <5.99g
- vgcreate:创建vg,常用参数-s 指定pe的大小,-s后面直接加数字及单位(M,m,K,k,G,g),例如
[root@test01 ~]# vgcreate myvg -s 4M /dev/sdb1 /dev/sdc1 /dev/sdd1
Volume group "myvg" successfully created
- vgreduce:移除vg池中的设备,记住移除前必须先将此设备上的pe移走,具体命令如下:
[root@test01 ~]# pvmove /dev/sdb1
No data to move for myvg
[root@test01 ~]# vgreduce myvg /dev/sdb1
Removed "/dev/sdb1" from volume group "myvg"
4-3. LV的管理工具相关命令
- lvcreate:lvcreate -L #[mM,gG,tT] -n name volumegroup,lv创建完成后可以直接格式化并使用。
[root@test01 ~]# lvcreate -L 1g -n mylv-test myvg
Logical volume "mylv-test" created.
[root@test01 ~]# lvs /dev/myvg/mylv-test
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv-test myvg -wi-a----- 1.00g
- lvextend:lvextend -L [+]#[mM,gG,tT] /dev/myvg/mylv-test,注意带+代表扩展多少,不带+表示,扩展到多少。扩展的步骤,先扩展物理边界,然后再扩展逻辑边界,例如:
[root@test01 ~]# lvextend -L +1G /dev/myvg/mylv-test
Size of logical volume myvg/mylv-test changed from 1.00 GiB (256 extents) to 2.00 GiB (512 extents).
Logical volume myvg/mylv-test successfully resized.
[root@test01 ~]# df -h |grep "/mnt"
/dev/mapper/myvg-mylv--test 976M 2.6M 907M 1% /mnt
[root@test01 ~]# res
reset resize2fs resizecons resizepart restorecon
[root@test01 ~]# resize2fs /dev/myvg/mylv-test
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylv-test is mounted on /mnt; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/myvg/mylv-test is now 524288 blocks long.
[root@test01 ~]# df -h |grep "/mnt"
/dev/mapper/myvg-mylv--test 2.0G 3.1M 1.9G 1% /mnt
- lvreduce:
lvreduce -L [-]#[mM,gG,tT] /dev/myvg/mylv-test
,注意带-代表缩减多少,不带+表示,缩减到多少。
缩减lv的大小,一般不建议使用,使用的时候文件系统必须先卸载,然后强制性fsck,然后缩减逻辑边界,最后再缩减物理边界
[root@test01 /]# umount /mnt
[root@test01 /]# e2fsck -f /dev/myvg/mylv-test
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/myvg/mylv-test: 12/131072 files (0.0% non-contiguous), 17197/524288 blocks
[root@test01 /]# resize2fs /dev/myvg/mylv-test 500M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/mylv-test to 128000 (4k) blocks.
The filesystem on /dev/myvg/mylv-test is now 128000 blocks long.
[root@test01 /]# lvreduce /dev/myvg/mylv-test -L 500m
WARNING: Reducing active logical volume to 500.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv-test? [y/n]: y
Size of logical volume myvg/mylv-test changed from 2.00 GiB (512 extents) to 500.00 MiB (125 extents).
Logical volume myvg/mylv-test successfully resized.
[root@test01 /]# df -h |grep "/mnt"
[root@test01 /]# mount /dev/myvg/mylv-test /mnt
[root@test01 /]# df -h |grep "/mnt"
/dev/mapper/myvg-mylv--test 460M 1.6M 426M 1% /mnt
5. LVM 快照卷
5-1. LVM快照卷的机制
LVM 快照卷机制如下图所示:
- LVM对LV提供的快照功能,只对LVM有效。
- 当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的。
- 当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。
- 在写操作写入块之前,将原始数据移动到 snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。
- 对于snapshot的读操作,如果是读取数据块是没有修改过的,那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。
- 一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。
- 创建snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:
- 从shapshot创建到释放这段时间内,估计块的改变量有多大;
- 数据更新的频率。
5-2. 快照卷的创建
语法:
lvreduce -L [-]#[mM,gG,tT] -p r -s -n snapshot_lv_name original_lv_name
注意:快照卷一般只读,如果要设置为读写,则-p rw,original_lv_name为原卷的卷名
例如,对mylv-test做快照卷,预计变化的部分不超过500M,权限设置为只读
[root@test01 myvg]# lvcreate -s -L 500M -p r -n snap_mylvtest /dev/myvg/mylv-test
Using default stripesize 64.00 KiB.
Logical volume "snap_mylvtest" created.
[root@test01 mylvtest]# mount /dev/myvg/snap_mylvtest /mnt
如果需要对快照卷进行卸载,则先umount
[root@test01 mylvtest]# umount /mnt
[root@test01 mylvtest]# lvremove /dev/myvg/snap_mylvtest
Do you really want to remove active logical volume myvg/snap_mylvtest? [y/n]: y
Logical volume "snap_mylvtest" successfully removed