Linux LVM管理

1、lvm相关概念和理论

参考资料:http://blog.51cto.com/nolinux/1350941

中文名 英文缩写 英文全名 说明
物理卷 PV physical volumes 物理卷处于逻辑卷管理器中的底层,任何的逻辑卷和卷组都必需依靠物理卷来建立。物理卷可以是一个完整的硬盘,也可以是硬盘中的一个分区,并有一个名字 ( 如hdisk0)。
卷组 VG volume group 卷组是建立在物理卷之上的。一个卷组中可以包含一个物理卷或者多个物理卷。
逻辑卷 LV logical volumes 逻辑卷建立在卷组之上,卷组中的空间可以建立多个逻辑卷,并且逻辑卷可以随意在卷组的空闲空间中增减,逻辑卷可以属于一个卷组,也可以属于不同的多个卷组。LV 是位于 PV 上的信息的组合,在 LV 上的数据可以连续或者不连续地出现在 PV。
卷组描述区域 VGDA Volume Group Descriptor Area 用于描述物理卷、卷组、逻辑卷分配的所由信息。和非 LVM 系统将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷起始处的 VGDA( 卷组描述符区域 ) 中。
物理区段 PE physical extent 物理区域是物理卷中可用于分配的最小存储单元(默认4M),物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的pv加入到vg后,pe的大小自动更改为vg中定义的pe大小。
逻辑区段 LE logical extent 逻辑区段是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。

一图胜千言:
硬盘分区组成物理卷(官方建议整个盘分一个区),物理卷组成卷组,卷组分配空间给逻辑卷

在这里插入图片描述

下面用几个范例给大家讲解一下:

在这里插入图片描述

依旧是上面那个图,我们从图中能看到物理磁盘disk 0上的所有四个分区(/dev/hda[1-4])以及完整的物理磁盘1(/dev/hdb)和物理磁盘2(/dev/hdd)作为物理卷添加到卷组VG0中。

卷组是实现n-to-m映射的关键(也就是,将n个PV看作m个LV)。在将PV分配给卷组之后,就可以创建任意大小的逻辑卷(只要不超过VG的大小)。在图中,创建了一个称为LV0的逻辑卷,并给其他LV留下了一些空间(这些空间也可以用来应付LV0以后的增长)。

LVM中的逻辑卷就相当于物理磁盘分区。在实际使用中,它们就是物理磁盘分区。

在创建 LV 之后,可以使用任何文件系统对它进行格式化并将它挂载在某个挂载点上,然后就可以开始使用它了。上图的下面显示了一个经过格式化的逻辑卷LV0被挂载在/var。

通过上面的例子应该对逻辑卷的基本概念有了更加清晰的了解了。下面,我们要再对两个概念进行深入了解,来为后面更好的操作LVM做基础。

区段

为了实现n-to-m物理到逻辑卷映射,PV和VG的基本块必须具有相同的大小。这些基本块被称为物理区段(PE)和逻辑区段(LE)。尽管n个物理卷(PV)映射到m个逻辑卷(LV),但是物理区段(PE)和逻辑区段(LE)总是一对一映射的。

在使用 LVM时,对于每个 PV/LV 的最大区段数量并没有限制。默认的区段大小是 4MB,对于大多数配置不需要修改这个设置,因为区段的大小并不影响I/O性能。但是,区段数量太多会降低LVM的效率,所以可以使用比较大的区段,从而减少区段数量。

然而需要注意的是,在一个VG中不能混用不同的区段大小,而且用LVM修改区段大小是一种不安全的操作,会破坏数据,因此建议在初始设置时选择一个合适的区段大小,以后不要更改。

由于不同的区段大小意味着不同的VG粒度,因此如果选择的区段大小是4GB,那么只能以4GB的整数倍进行缩小或扩展LV。

在这里插入图片描述

上图是用PE和LE显示的与前面示例相同的布局(VG0中的空闲空间也由空闲LE组成,尽管图中没有显示它们),整个图展现了物理到逻辑区段的映射。

另外,我们需要注意上图的区段分配策略。因为LVM并非总是连续分配PE的,因此运维人员可以设置不同的分配策略,但是一般不需要这么做,因为默认策略(名为一般分配策略(normal allocation policy))使用符合常规的规则,比如不把并行的条带放在同一物理卷上。

大家想下,如果现在创建出第二个LV即LV1的话,最终的PE分配会是什么样子的呢?

在这里插入图片描述

最终的PE分配就如上图一样,中间增加的黄色色块即为新增加的LV即LV1的PE。这样子,大家应该就能理解区段和区块的关系了吧。

设备映射器

设备映射器(也称为dm_mod)是一个Linux内核模块(也可以是内置的),它的作用是对设备进行映射 ——LVM的2.0以上版本必须使用这个模块。通过下面的命令可以查看到该模块。

# lsmod | grep dm_mod
dm_mod

在大多数主流发行版中,设备映射器会被默认安装,常常会在引导时或者在安装或启用 LVM或EVMS包时自动进行装载(EVMS是一种替代LVM的工具)。如果没有启用这个模块,可以使用如下命令进行引导。

# modprobe dm_mod

注意:作为运维人员,在创建VG和LV时,尽量使用便于理解记忆,标注其用途的名字进行命名,千万不要像前面的VG0,LV0之类的。设备映射器的作用就是将这些名称正确地映射到物理设备。

与物理磁盘相反,无法直接访问卷组(这意味着没有/dev/mapper/VG0这样的文件,也不能执行dd if=/dev/VG0 of=dev/VG1)。

2、物理卷(Physical Volumes)管理

如果你想把整个磁盘创建成物理卷,首先要抹除磁盘上的分区信息

# dd if=/dev/zero of=PhysicalVolume bs=512 count=1

2.1、创建物理卷

所有lvm相关的命令都支持-v, -vv, -vvv, -vvvv参数来显示不同级别的详细信息,-vvvv显示最详细的信息。

对整块盘

# pvcreate /dev/sdd /dev/sde /dev/sdf

对某个分区

# pvcreate /dev/hdb1

扫描下块设备

# lvmdiskscan

Displaying物理卷信息

  • pvs命令:

以比较规整的格式显示每个pv的详细信息,方便使用脚本查询并过滤信息。

pvs -a -o +devices
  • pvdisplay命令:

pvdisplay命令为每个物理卷提供详细的多行输出。它以固定的格式显示物理属性(大小、区段、卷组等)。

  • pvscan命令:

pvscan命令扫描系统中所有支持的LVM块设备的物理卷。

2.3、维护或准备删除物理卷

如果发现有盘坏掉,或者准备删除一个物理卷,可以提前做配置,阻止空闲空间分配到该物理卷上。

例如,不允许physical extents分配到磁盘/dev/sdk1:

# pvchange -x n /dev/sdk1

允许分配到该磁盘:

# pvchange -x n /dev/sdk1

2.4、resize/removing物理卷

pvresize

# pvresize /dev/sda2 目标大小
# pvresize --reportformat basic

pvmove

# pvremove /dev/ram15
完成后看下这个pv下是否还有数据
# pvs -o+pv_used

3、卷组(Volume Groups)

3.1、创建卷组

3.1.1、基本创建

# vgcreate vg1 /dev/sdd1 /dev/sde1

默认情况下,extent大小为4M。你可以使用-s参数来指定不同的extent大小。
使用–alloc参数来指定不同的分配策略。

3.1.2、物理extent分配策略(LVM Allocation)

这部分,对于官方的文档解释看的不是很明白,先留下原文

normal 默认的方式

An allocation policy of normal will not choose a physical extent that shares the same physical volume as a logical extent already allocated to a parallel logical volume (that is, a different stripe or mirror image/leg) at the same offset within that parallel logical volume.

contiguous

An allocation policy of contiguous requires that the physical location of any logical extent that is not the first logical extent of a logical volume is adjacent to the physical location of the logical extent immediately preceding it.

cling

An allocation policy of cling requires that the physical volume used for any logical extent be added to an existing logical volume that is already in use by at least one logical extent earlier in that logical volume.

可以使用vgchange命令来改变物理extent分配策略。

3.1.3、支持在cluster环境创建vg

参考资料:LVM Logical Volumes in a Red Hat High Availability Cluster

# vgcreate -c n vg1 /dev/sdd1 /dev/sde1

3.2、Displaying卷组

vgscan命令

vgscan命令扫描所有磁盘的卷组,并重新构建LVM缓存文件,它还显示卷组信息。

vgs命令

vgs命令以可配置的形式提供卷组信息,每个卷组显示一行。vgs命令提供了大量的格式控制,对于脚本编写非常有用。

vgs -a -o +devices

vgdisplay命令

vgdisplay命令以固定的形式显示卷组属性(例如大小、区段、物理卷的数量等)。如果不指定卷组,则显示所有现有的卷组。

3.3、vg中添加删除物理卷

添加:

# vgextend vg1 /dev/sdf1

如何从vg中删除物理卷

第一步:看下准备删除的pv是否在被lv使用

pvdisplay /dev/hda1

第二步:如果未使用直接vgreduce,若在使用 则使用pvmove把数据挪到其它vg

pvmove命令搬移PV中的资料(只限于同一VG中)。

# pvmove /dev/hda5 /dev/hda6   #将VG中pv hda5的内容搬移到hda6中
# pvmove /dev/hda5   #也可以这样,lvm决定hda5的内容被复制到哪里

第三步:vgreduce删除

# vgreduce my_volume_group /dev/hda1

使用pvremove命令删除物理卷也可以

如果从vg中移除一个有问题的pv时会报错,加参数–removemissing 甚至–force

3.4、修改vg参数

修改vg00中只能有128个逻辑卷:

# vgchange -l 128 /dev/vg00

deactivate or activate 卷组

# vgchange -a n my_volume_group
# vgchange -a y my_volume_group

3.5、删除vg

# vgremove officevg

3.6、分裂/合并 vg

split,原有vg test,新建vg new1

vgsplit test new1 /dev/sdb
  New volume group "new1" successfully split from "test"

split,原有vg test,new1 添加一个pv,当test里面没有pv的时候会自动删除test这个vg

vgsplit test new1 /dev/sdc
  Existing volume group "new1" successfully split from "test"

vgmerge,下面把vg1合并到vgtest里面,注意:vg1必须为inactive状态

命令:vgmerge -v vgtest vg1
[root@onetest ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   3   0 wz--n- <99.00g   4.00m
  vg1      1   0   0 wz--n- <40.00g <40.00g
  vg2      1   0   0 wz--n- <10.00g <10.00g
  vgtest   1   0   0 wz--n- <20.00g <20.00g
[root@onetest ~]# vgmerge -v vgtest vg1
    Checking for volume group "vg1"
    Checking for volume group "vgtest"
    Archiving volume group "vg1" metadata (seqno 2).
    Archiving volume group "vgtest" metadata (seqno 1).
    Writing out updated volume group
    Creating volume group backup "/etc/lvm/backup/vgtest" (seqno 2).
  Volume group "vg1" successfully merged into "vgtest"
[root@onetest ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree  
  centos   1   3   0 wz--n- <99.00g   4.00m
  vg2      1   0   0 wz--n- <10.00g <10.00g
  vgtest   2   0   0 wz--n-  59.99g  59.99g

3.7、重命名&备份&还原&迁移

重命名:

# vgrename vg1 new_volume_group

备份:

系统会自动备份lvm的元数据信息,默认存放在/etc/lvm/archive目录下。可以修改配置文件/etc/lvm/lvm.conf来禁用/启用备份、备份集存放位置等

还原:

参考官方 Recovering Physical Volume Metadata
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/mdatarecover

命令:vgcfgrestore VG1

迁移:

1)确保没有用户访问卷组中活动卷上的文件,然后卸载逻辑卷。

使用vgchange命令的-a n参数将卷组标记为非活动,以防止卷组是活动状态。

vgchange -a n vgtest

2)源系统执行vgexport vgtest命令把vgtest的信息导出,文件默认存放在/etc/lvm/backup/vgtest

vgexport vgtest

pvscan命令可以看到vgtest的pv状态为is in exported

[root@onetest archive]# pvscan
  PV /dev/sda2   VG centos          lvm2 [<99.00 GiB / 4.00 MiB free]
  PV /dev/sdc    VG vg1             lvm2 [<10.00 GiB / <10.00 GiB free]
  PV /dev/sdd     is in exported VG vgtest [<20.00 GiB / <20.00 GiB free]
  PV /dev/sdb     is in exported VG vgtest [<40.00 GiB / <40.00 GiB free]
  PV /dev/sde                       lvm2 [20.00 GiB]
  Total: 5 [188.98 GiB] / in use: 4 [168.98 GiB] / in no VG: 1 [20.00 GiB]

3)把导出的文件以及pv对应的盘挪到新系统上后使用vgimport导入,并激活

vgimport vgtest
vgchange -a y vgtest

4、逻辑卷(Logical Volume)

4.1、创建逻辑卷

创建逻辑卷的顺序:Linux分区/磁盘—物理卷(pv)—卷组(vg)—逻辑卷(lv)

4.1.1、创建线性逻辑卷(Linear Logical Volumes)**

1)创建一个名字为testlv,从卷组vg1上分配50G大小。若-L后面不指定单位,默认单位是M

# lvcreate -L 50G -n testlv vg1

2)使用-l参数指定extents个数或按照百分比指定

分配1000个extent

# lvcreate -l 1000 -n testlv vgtest /dev/sdg1

分配vgtestg总空间的60%

# lvcreate -l 60%VG -n mylv vgtest

分配vgtest全部剩余空间给yourlv

# lvcreate -l 100%FREE -n yourlv vgtest

分配vgtest中pv /dev/sdb的10%空间给mylv

lvcreate -l 10%PVS -n mylv vgtest /dev/sdb

3)在物理卷/dev/sda1的区段0到25之间创建一个线性逻辑卷,然后在区段100处继续分配置逻辑卷,总共分配100个extents

# lvcreate -l 100 -n testlv testvg /dev/sda1:0-25:100-

4.1.2、创建条带逻辑卷(Striped Volumes)

条带化技术就是一种自动的将I/O的负载均衡到多个物理磁盘上的技术,将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的I/O 并行能力,从而获得非常好的性能。

分配50G空间,指定两个条带pv,条带大小为64KB,命名为gfslv

# lvcreate -L 50G -i 2 -I 64 -n gfslv vgtest

4.1.3、创建raid逻辑卷(RAID Logical Volumes)

LVM 支持 RAID0/1/4/5/6/10,使用比较广泛的是raid5和raid10

RAID1

创建一个名为my_lv 大小为1G的raid1逻辑卷,-m参数指定mirrors副本数量,所有副本不能超过卷组下pv的数量,比如有2个pv,-m 只能为1

# lvcreate --type raid1 -m 1 -L 10G -n lv_raid1 vgtest

RAID5 (至少需要2 stripes + 1 implicit parity drive)

raid5至少需要vgtest中有三个pv组建,-i参数指定stripes数量

lvcreate --type raid5 -i 2 -L 10G -n lv_raid5 vgtest

RAID6(至少需要3 stripes + 2 implicit parity drives)

raid6至少需要vgtest中有5个pv组建,-i参数指定stripes数量

lvcreate --type raid6 -i 3 -L 10G -n lv_raid6 vgtest

RAID10

raid10至少需要vgtest中有4个pv组建,-i参数指定stripes数量

lvcreate --type raid10 -i 2 -m 1 -L 10G --maxrecoveryrate 128 -n lv_raid10 vgtest

测试问题:虚拟机测试不成功,命令敲完后卡死

4.1.4、创建镜像卷(Mirrored Volumes)

类似于raid1 可以设置不同的副本创建镜像卷,但是raid卷只能创建在本地,不支持集群。对于不支持raid的系统可以用镜像卷。在做数据同步复制的时候也可以考虑使用镜像卷。

创建一个50G大小,2份数据的镜像卷,默认region大小是512KB,如果是集群可能要根据逻辑卷大小设置region,参数-R

# lvcreate --type mirror -L 50G -m 1 -n mirrorlv vg0

备注:可以使用lvconvert 命令来修改镜像卷的策略,详见官网文档。

4.1.5、创建预分配逻辑卷(Thinly-Provisioned Logical Volumes)

Thinly-Provisioned Logical Volumes核心思想是实际用多少空间,就动态分配多少空间,意味着你可以为卷组上所有的逻辑卷分配的空间总和超过卷组总大小。这种策略类似vmwareworkstation添加的硬盘"不立即分配空间"。

# lvcreate -L 100M -T vgtest/mythinpool -V 1G -n lv_thinvolume

解释:-L参数 为“瘦池”指定大小100M

-T参数 在vgtest卷组下创建一个mythinpool的“瘦池”

-V参数 在mythinpool上分配1G空间

-n参数 逻辑卷名称lv_thinvolume

可以看出为lv分配的空间其实是可以超出pool的大小的。

4.1.6、快照逻辑卷(Snapshot Volumes)

快照逻辑卷比较好玩,在已经存在的逻辑卷上创建一些快照,可以方便的时候快照把文件恢复到之前的状态。类似于虚拟机的快照功能或者docker的分层文件系统。

1)创建一个lv_test

lvcreate -L 2g -n lv_test vgtest

2)把lv_test创建为xfs文件系统

mkfs.xfs /dev/vgtest/lv_test 

3)准备好挂载点,并挂载lv_test作为原始可读写目录

mkdir -p /backup/{lv_test,lv_snap1,lv_snap2}
mount /dev/vgtest/lv_test /backup/lv_test/ -onouuid,rw

4)创建快照逻辑卷lv_snap1
创建快照lv_snap1之前,先在目录/backup/lv_test下存放文件lv_snap1.txt

echo snap1 > /backup/lv_test/lv_snap1.txt
lvcreate --size 100M --snapshot --name lv_snap1 /dev/vgtest/lv_test

5)创建快照逻辑卷lv_snap2
创建快照lv_snap2之前,先在目录/backup/lv_test下存放文件lv_snap2.txt

echo snap2 > /backup/lv_test/lv_snap2.txt
lvcreate --size 100M --snapshot --name lv_snap2 /dev/vgtest/lv_test

6)挂载逻辑卷lv_snap1和lv_snap2,并验证数据
验证:/backup/lv_snap1目录下有一个文件lv_snap1.txt,/backup/lv_snap2目录下有两个文件lv_snap1.txt、lv_snap2.txt

mount /dev/vgtest/lv_snap1 /backup/lv_snap1/ -onouuid,ro
mount /dev/vgtest/lv_snap2 /backup/lv_snap2/ -onouuid,ro

[root@onetest lv_test]# ls /backup/lv_snap1
lv_snap1.txt
[root@onetest lv_test]# ls /backup/lv_snap2
lv_snap1.txt  lv_snap2.txt

4.2、Displaying逻辑卷

lvs命令

以可配置的形式提供逻辑卷信息,每个逻辑卷显示一行。lvs命令提供了大量的格式控制,对于脚本编写非常有用。

查看设备状况

# lvs -a -o +devices

lvdisplay命令

以固定的格式显示逻辑卷属性(例如大小、布局和映射),默认显示所有逻辑卷信息。可以显示某个:

# lvdisplay -v /dev/vg00/lvol2

lvscan命令

扫描系统中的所有逻辑卷并列出它们。

4.3、删除&重命名&合并快照&改参数

删除逻辑卷

删除之前先umount挂载目录
# lvremove /dev/testvg/testlv

重命名逻辑卷

# lvrename /dev/vg02/lvold /dev/vg02/lvnew
或者
# lvrename vg02 lvold lvnew

逻辑卷修改参数

激活/禁用lv

激活
lvchange -a y vgtest/lv_test
禁用
lvchange -a n vgtest/lv_test

设置为readonly

lvchange -pr vgtest/lv_test

合并快照卷
接着上面的测试,我把lv_snap2重新挂载为可写,然后添加文件test.txt,最后把lv_snap2合并到原始分支。再来个干扰项(lv_snap2里面的文件删除,lv_test里面的文件删除)

验证1:lv_snap2是合并到lv_snap1还是lv_test? lv_test

验证2:原始分支中的文件如何变化? lv_snap2中的文件覆盖到lv_test中

设置测试环境:

umount /backup/lv_snap1/
umount /backup/lv_snap2/
mount /dev/vgtest/lv_snap1 /backup/lv_snap1/ -onouuid,rw
mount /dev/vgtest/lv_snap2 /backup/lv_snap2/ -onouuid,rw
rm /backup/lv_snap1/lv_snap1.txt
echo 123 > /backup/lv_snap2/test.txt
[root@onetest ~]# ls /backup/lv_snap1
[root@onetest ~]# ls /backup/lv_snap2
lv_snap1.txt  lv_snap2.txt  test.txt
[root@onetest ~]# ls /backup/lv_test

把lv_snap2合并到原始分支:lvconvert --merge vgtest/lv_snap2

# lvconvert --merge vgtest/lv_snap2
  Delaying merge since origin is open.
  Merging of snapshot vgtest/lv_snap2 will occur on next activation of vgtest/lv_test.
提示中看到合并到lv_test中,并发现lv_snap2消失,/backup/lv_test目录下并无新增文件test.txt

重新激活下lv_test

[root@onetest ~]# lvchange -a n vgtest/lv_test
  Logical volume vgtest/lv_test contains a filesystem in use.
[root@onetest ~]# umount /backup/lv_test/
[root@onetest ~]# lvchange -a n vgtest/lv_test
  Logical volume vgtest/lv_snap1 contains a filesystem in use.
  Logical volume vgtest/lv_snap2 contains a filesystem in use.
  LV vgtest/lv_test has open 2 snapshot(s), not deactivating.
[root@onetest ~]# umount /backup/lv_snap1
[root@onetest ~]# umount /backup/lv_snap2
[root@onetest ~]# umount /backup/lv_test/
umount: /backup/lv_test/: not mounted
[root@onetest ~]# lvchange -a y vgtest/lv_test
[root@onetest ~]# vgchange -a n vgtest
[root@onetest ~]# vgchange -a y vgtest
[root@onetest ~]# mount /dev/vgtest/lv_test /backup/lv_test/ -onouuid,rw
[root@onetest ~]# mount /dev/vgtest/lv_snap1 /backup/lv_snap1/ -onouuid,rw
[root@onetest ~]# ls /backup/lv_test/
lv_snap1.txt  lv_snap2.txt  test.txt

可以看到lv_snap2中的文件成功覆盖到lv_test中

4.4、扩展逻辑卷(Growing Logical Volumes)

把lv_test扩展到10G

# lvextend -L10G /dev/vgtest/lv_test

在原有容量上再添加1G空间

# lvextend -L+1G  /dev/vgtest/lv_test

和vgextend一样,通过-l参数设置extents个数或者相应百分比来扩展,比如扩展VG上剩余所有空间:

# lvextend -l +100%FREE /dev/vgtest/lv_test

4.5、缩容逻辑卷(Shrinking Logical Volumes)

缩容操作不支持GFS2和XFS文件系统。在使用lvreduce命令缩容时,如果逻辑卷上包含文件系统,强烈建议使用–resizefs。

把逻辑卷lv_test缩容到5GB

# lvreduce --resizefs -L 5G vgtest/lv_test

把逻辑卷lv_test减少100M空间

# lvreduce --resizefs -L -100M vgtest/lv_test
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章