LVM 的全名是 Logical Volume Manager,中文可以翻译作逻辑卷轴管理员。
LVM利用Linux内核的device-mapper来实现存储系统的虚拟化(系统分区独立于底层硬件)。 通过LVM,你可以实现存储空间的抽象化并在上面建立虚拟分区(virtual partitions),可以更简便地扩大和缩小分区,可以增删分区时无需担心某个硬盘上没有足够的连续空间。
LVM是用来方便管理的,不会提供额外的安全保证。
LVM 的优点
比起正常的硬盘分区管理,LVM更富于弹性:
- 使用卷组(VG),使众多硬盘空间看起来像一个大硬盘。
- 使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区。
- 可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小。
- 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。
- 可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作。
LVM上的文件系统也需要重新调整大小,某些文件系统也支持这样的在线操作。 - 无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上。
- 允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小。
LVM的基本组成块(building blocks)如下:
1. 物理卷Physical volume(PV):
我们实际的 partition (或 Disk) 需要调整系统识别码 (system ID) 成为 8e (LVM 的识别码),然后再经过 pvcreate 的指令将他转成 LVM 最底层的实体卷轴 (PV) ,之后才能够将这些 PV 加以利用! 调整 system ID 的方是就是通过 gdisk/fdisk !
2. 卷组Volume group (VG):
所谓的 LVM 大磁盘就是将许多 PV 整合成这个 VG 的东西就是啦!所以 VG 就是 LVM 组合起来的大磁盘!这么想就好了。 那么这个大磁盘最大可以到多少容量呢?这与下面要说明的 PE 以及 LVM 的格式版本有关喔~在默认的情况下, 使用 32位的 Linux 系统时,基本上 LV 最大仅能支持到 65534 个 PE 而已,若使用默认的 PE 为 4MB 的情况下, 最大容量则仅能达到约 256GB 而已~不过,这个问题在 64位的 Linux 系统上面已经不存在了!LV 几乎没有啥容量限制了!
3. 物理区域Physical extent (PE):
LVM 默认使用 4MB 的 PE 区块,而 LVM 的 LV 在 32 位系统上最多仅能含有 65534 个 PE (lvm1 的格式),因此默认的 LVM 的 LV 会有 4M*65534/(1024M/G)=256G(限于lvm1版本)。这个 PE 就有点像文件系统里面的 block 的性质一样。
在使用 lvm2 的版本中,以及系统转为 64 位,因此这个限制已经不存在了。
4. 逻辑卷Logical volume (LV):
虚拟分区,由物理区域(physical extents)组成。
最终的 VG 还会被切成 LV,这个 LV 就是最后可以被格式化使用的类似分区的东西了!那么 LV 是否可以随意指定大小呢? 当然不可以!既然 PE 是整个 LVM 的最小储存单位,那么 LV 的大小就与在此 LV 内的 PE 总数有关。 为了方便使用者利用 LVM 来管理其系统,因此 LV 的设备文件名通常指定为“ /dev/vgname/lvname ”的样式!
快速操作指导步骤:
1.创建物理卷(PV)所在的分区,设置分区格式为'Linux LVM',对应的十六进制码为8e(MBR)或8e00(GPT)。
2.创建物理卷(PV)。如果你只有一个硬盘,那么你最好只创建一个分区一个物理卷;如果你有多个硬盘,你可以创建多个分区,在每个分区上分别创建一个物理卷。
3.创建卷组(VG),并把所有物理卷加进卷组。
4.在卷组上创建逻辑卷(LV)。
5.格式化逻辑卷(LV)。
6.创建挂载点儿,并挂账格式化后的 LV
具体实施:
磁盘阶段(准备 PV)
PV 可以是整块物理磁盘、物理磁盘的一个分区或者是回环文件
检查磁盘设备
可通过以下命令列出可被用作物理卷的设备:
[root@bogon ~]# lvmdiskscan
/dev/sda1 [ 200.00 MiB]
/dev/sda2 [ 5.00 GiB]
/dev/sda3 [ 1.00 GiB]
/dev/sdb [ 8.00 GiB]
1 disk
3 partitions
0 LVM physical volume whole disks
0 LVM physical volumes
警告: 请确认你对正确的设备进行操作,否则会导致文件丢失!
使用分区工具把分区类型改为 8e 或者 8e00,假如是整块硬盘就不用了
PV 阶段涉及到的命令
- pvcreate :将实体 partition 创建成为 PV ;
- pvscan : 搜寻目前系统里面任何具有 PV 的磁盘;
- pvscan --cache: 搜寻目前系统里面任何具有 PV 的磁盘并写入到LVM缓存;
- pvdisplay :显示出目前系统上面的 PV 状态;
- pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性,变为普通分区。
开始创建 PV
[root@bogon ~]# pvcreate /dev/sda4
Physical volume "/dev/sda4" successfully created.
[root@bogon ~]# pvcreate /dev/sdb
WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: y
Wiping dos signature on /dev/sdb.
Physical volume "/dev/sdb" successfully created.
[root@bogon ~]# pvscan
PV /dev/sda4 lvm2 [3.80 GiB]
PV /dev/sdb lvm2 [8.00 GiB]
Total: 2 [11.80 GiB] / in use: 0 [0 ] / in no VG: 2 [11.80 GiB]
这就分别显示每个 PV 的信息与系统所有 PV 的信息。尤其最后一行,显示的是:
整体 PV 的量 / 已经被使用到 VG 的 PV 量 / 剩余的 PV 量
显示每个 PV 更详细的信息
[root@bogon ~]# pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "8.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 8.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID WzUWaN-5wYu-x8Bu-unZA-DAb8-dPLt-FJSgsy
由于 PE 是在创建 VG 时才给予的参数,因此在这里看到的 PV 里头的 PE 都会是 0
而且也没有多余的 PE 可供分配 (allocatable)
VG 阶段
涉及到的命令
- vgcreate :就是主要创建 VG 的指令!他的参数比较多,等一下介绍。
- vgscan :搜寻系统上面是否有 VG 存在?
- vgdisplay :显示目前系统上面的 VG 状态;
- vgextend :在 VG 内增加额外的 PV ;
- vgreduce :在 VG 内移除 PV;
- vgchange :设置 VG 是否启动 (active),通常于当多个节点共享一个 VG 时,节点之间切换使用 VG;
- vgremove :删除一个 VG !
创建 VG
# vgcreate [-s N[mgt]] VG名称 PV名称
选项与参数:
-s :后面接 PE 的大小 (size) ,N 是数字, 单位可以是 m, g, t (大小写均可)
VG 名称自定义,但不能太随便
下面是将 PV /dev/sdb1 分配给名称为 data的VG, 并且指定 PE 大小为 16 M
[root@bogon ~]# vgcreate -s 16M data /dev/sdb1
Volume group "data" successfully created
查看 VG
[root@bogon ~]# vgscan
Reading volume groups from cache.
Found volume group "data" using metadata type lvm2
[root@bogon ~]# vgdisplay
--- Volume group ---
VG Name data
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size 7.98 GiB
PE Size 16.00 MiB
Total PE 511
Alloc PE / Size 0 / 0
Free PE / Size 511 / 7.98 GiB
VG UUID qA4Z1u-CxEo-C075-n5Gv-s80d-M1qw-AYxEWK
向 VG 增加 PV
把 PV /dev/sda4 添加到 VG data中
[root@bogon ~]# vgextend data /dev/sda4
Volume group "data" successfully extended
[root@bogon ~]# vgs
VG #PV #LV #SN Attr VSize VFree
data 2 0 0 wz--n- 11.78g 11.78g
[root@bogon ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda4 data lvm2 a-- <3.80g <3.80g
/dev/sdb1 data lvm2 a-- 7.98g 7.98g
缩减 VG
也就是从 VG 内移除某PV一个或多个 PV
==要首先保证被移出的 PV 中没有数据在使用,可以通过 pvs 查看 PV 的容量使用情况来判断是否有数据使用==
==假如有需要使用 pvmove 命令把数据移动到其他的 PV中==
[root@bogon ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda4 data lvm2 a-- <3.80g <3.80g
/dev/sdb1 data lvm2 a-- 7.98g 7.98g
[root@bogon ~]# vgreduce data /dev/sdb1
Removed "/dev/sdb1" from volume group "data"
[root@bogon ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda4 data lvm2 a-- <3.80g <3.80g
/dev/sdb1 lvm2 --- <8.00g <8.00g
[root@bogon ~]# vgs
VG #PV #LV #SN Attr VSize VFree
data 1 0 0 wz--n- <3.80g <3.80g
删除 VG
[root@bogon ~]# vgremove data
Volume group "data" successfully removed
[root@bogon ~]# vgs
[root@bogon ~]# vgscan
Reading volume groups from cache.
[root@bogon ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda4 lvm2 --- 3.80g 3.80g
/dev/sdb1 lvm2 --- <8.00g <8.00g
删除 VG 时,即使 VG 有 PV 存在,只要此 VG 没有在使用,就可以删除,在此 VG 中的 PV 会自动恢复到没有被分配的状态。
LV 阶段
就是从 VG 这个大的虚拟磁盘中划逻辑卷轴 LV(也就是虚拟分区),对划分出来的 LV 进行格式化后再挂载,就可以想使用普通分区一样在上面存储数据了
涉及到的命令:
- lvcreate :创建 LV 啦!
- lvscan :查询系统上面的 LV ;
- lvdisplay :显示系统上面的 LV 状态啊!
- lvextend :在 LV 里面增加容量!
- lvreduce :在 LV 里面减少容量;
- lvremove :删除一个 LV,就像删除一个分区!
- lvresize :对 LV 进行容量大小的调整!
- lvchange : 改变某一个 LV 的状态 (available/NOT available),通常用于多节点共享一个 LV 时,对 LV 的切换!
创建LV
lvcreate [-L N[mgt]] [-n LV名称] VG名称
lvcreate [-l N] [-n LV名称] VG名称
选项与参数:
-L :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为一个 PE 的大小,
因此这个数量必须要是一个 PE 大小 的倍数,若不相符,系统会自行计算最相近的容量。
-l :后面可以接 PE 的“个数”,而不是容量。若要这么做,得要自行计算 PE 数。
-n :后面接的就是 LV 的名称!
[root@bogon ~]# lvscan
[root@bogon ~]# lvcreate -L 500M -n www data
Logical volume "www" created.
[root@bogon ~]# lvscan
ACTIVE '/dev/data/www' [500.00 MiB] inherit
[root@bogon ~]# lvdisplay
--- Logical volume ---
LV Path /dev/data/www
LV Name www
VG Name data
LV UUID N04J4p-dhD9-LGF2-MghY-YdyU-DPiz-NB0di0
LV Write Access read/write
LV Creation host, time bogon, 2019-08-22 14:59:58 +0800
LV Status available
# open 0
LV Size 500.00 MiB
Current LE 125
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
文件系统阶段
- 先检查 VG 的容量
[root@bogon ~]# vgdisplay
--- Volume group ---
VG Name data
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 3.80 GiB
PE Size 4.00 MiB
Total PE 973
Alloc PE / Size 125 / 500.00 MiB
Free PE / Size 848 / 3.31 GiB
VG UUID 8Itb21-kqOB-3VLh-T3bL-Mmfe-jFdS-S5frRn
从上面信息看到 VG 中的容量已经本占用了一部分了,可我们并没有去使用。原因是,当在 VG 中划分 LV 时,LVM 自身会使用一些空间来保存一下信息,用于记录和管理这个 VG 和 它下面的 LV。
- 格式化、挂载、测试 LV
[root@bogon ~]# lvscan
ACTIVE '/dev/data/www' [500.00 MiB] inherit
[root@bogon ~]# mkfs.xfs /dev/data/www
meta-data=/dev/data/www isize=512 agcount=4, agsize=32000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=128000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@bogon ~]# mkdir -p /data/www
[root@bogon ~]# mount /dev/data/www /data/www
[root@bogon ~]# df -h|sort
/dev/mapper/data-www 497M 26M 472M 6% /data/www
/dev/sda1 197M 108M 90M 55% /boot
/dev/sda2 5.0G 1.3G 3.8G 26% /
devtmpfs 966M 0 966M 0% /dev
Filesystem Size Used Avail Use% Mounted on
tmpfs 196M 0 196M 0% /run/user/0
tmpfs 976M 0 976M 0% /dev/shm
tmpfs 976M 0 976M 0% /sys/fs/cgroup
tmpfs 976M 8.6M 968M 1% /run
[root@bogon ~]# blkid /dev/data/www
/dev/data/www: UUID="92c04f38-60ff-4cc8-b7b5-9a42f915bfb8" TYPE="xfs"
blkid 命令可以查看一个设备的文件系统类型,不论是否挂载均可
LVM 的扩容
当需要更多的 LV,或是在一个 LV 中需要更多的容量时,就需要对 VG 或 LV 进行扩容
由于 LV 的容量是从 VG 中划分出来的,所以不论是需要一个新的 LV, 还是需要对现有的 LV 进行扩容,都需要保证 VG 有总够多的容量。
基本流程是:
VG 阶段:
VG 需要有剩余的容量,
如果 VG 容量不足, 最简单的方法就是再加硬盘!然后将该硬盘使用上面讲过的 pvcreate 及 vgextend 增加到该 VG 内即可!
LV 阶段
向一个现有的 LV 中增加更多的可用容量:如果 VG 的剩余容量足够了, 此时就可以利用 lvresize 这个指令来将剩余容量加入到所需要增加的 LV 设备内!
新创建一个 LV:保证 VG 容量足够,直接用 lvcreate 命令创建即可。
文件系统阶段的放大:
我们的 Linux 实际使用的其实不是 LV !而是 LV 这个设备内的文件系统!
目前在 Linux 环境下,可以放大的文件系统有 XFS 以及 EXT 家族!
至于缩小仅有 EXT 家族,目前 XFS 文件系统并不支持文件系统的容量缩小喔!要注意!要注意!XFS 放大文件系统通过简单的 xfs_growfs 指令即可!
其中最后一个步骤最重要! 整个文件系统在最初格式化的时候就创建了 inode/block/superblock 等信息,要改变这些信息是很难的! 不过因为文件系统格式化的时候创建的是多个 block group ,因此我们可以通过在文件系统当中增加 block group 的方式来增减文件系统的量!而增减 block group 就是利用 xfs_growfs 啰!所以最后一步是针对文件系统来处理的, 前面几步则是针对 LVM 的实际容量大小!
因此,严格说起来,放大文件系统并不是没有进行“格式化”喔!放大文件系统时,格式化的位置在于该设备后来新增的部份,设备的前面已经存在的文件系统则没有变化。 而新增的格式化过的数据,再反馈回原本的 supberblock 这样而已!
实操
现在目标是对现有的 LV /dev/data/www的容量增加 500M,使其总容量为 1000M
- 检查 LV,VG
[root@bogon ~]# pvscan
PV /dev/sda4 VG data lvm2 [3.80 GiB / 3.31 GiB free]
PV /dev/sdb1 lvm2 [<8.00 GiB]
Total: 2 [<11.80 GiB] / in use: 1 [3.80 GiB] / in no VG: 1 [<8.00 GiB]
[root@bogon ~]# vgscan
Reading volume groups from cache.
Found volume group "data" using metadata type lvm2
[root@bogon ~]# vgdisplay
--- Volume group ---
VG Name data
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 3.80 GiB
PE Size 4.00 MiB
Total PE 973
Alloc PE / Size 125 / 500.00 MiB
Free PE / Size 848 / 3.31 GiB
VG UUID 8Itb21-kqOB-3VLh-T3bL-Mmfe-jFdS-S5frRn
- 增加现有 LV 的容量
lvresize -L +-N[mgt] LV的设备名
lvresize -l +-PE个数 LV的设备名
选项和参数:
lvresize 的语法很简单,基本上 -l 或 -L 来增加,其他参数和 lvcreate 基本一样!
若要增加则使用 + ,若要减少则使用 - !( + 是增加多少,不加 +/- 是结果为多少)
详细的选项请参考 man lvresize
[root@bogon ~]# lvresize -L +500M /dev/data/www
Size of logical volume data/www changed from 500.00 MiB (125 extents) to 1000.00 MiB (250 extents).
Logical volume data/www successfully resized.
[root@bogon ~]# lvscan
ACTIVE '/dev/data/www' [1000.00 MiB] inherit
- 把扩容的 LV 容量增加到实际的文件系统中
EXT2,3,4
[root@bogon ~]# df -h /data/www
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-www 477M 2.3M 445M 1% /data/www
[root@bogon ~]# resize2fs /dev/data/www
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/data/www is mounted on /data/www; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 8
The filesystem on /dev/data/www is now 1024000 blocks long.
[root@bogon ~]# df -h /data/www
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-www 961M 2.5M 910M 1% /data/www
XFS
[root@bogon ~]# df -h /dev/data/www
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-www 497M 26M 472M 6% /data/www
[root@bogon ~]# lvextend -L +500M /dev/data/www
Size of logical volume data/www changed from 500.00 MiB (125 extents) to 1000.00 MiB (250 extents).
Logical volume data/www successfully resized.
[root@bogon ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
www data -wi-ao---- 1000.00m
[root@bogon ~]# df -h /dev/data/www
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-www 497M 26M 472M 6% /data/www
[root@bogon ~]# xfs_growfs /dev/data/www
meta-data=/dev/mapper/data-www isize=512 agcount=4, agsize=32000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=128000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 128000 to 256000
[root@bogon ~]# df -h /dev/data/www
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/data-www 997M 26M 972M 3% /data/www
LVM 的缩减
注意:
对逻辑卷缩减,是有分险的,必须做的话,应遵循以下原则
- 不能在线缩减,先卸载文件系统==
- 确保缩减后的容量,仍能存储下原有的所有数据==
- 在缩减之前需要先进行强制性文件系统检查,以保证文件系统处于一致性状态==
基本流程和扩展相反
- 卸载文件系统
- 强制性检查文件系统
- 缩减文件系统
- 缩减 LV
- 缩减 VG
可用命令
使用'lvm help <command>'获取更多信息
config 显示和操作配置信息
devtypes 显示已识别的内置块设备类型
dumpconfig 显示和操作配置信息
格式列出可用的元数据格式
help 显示命令帮助
fullreport 显示完整报告
lastlog 显示最后一个命令的日志报告
lvchange 更改逻辑卷的属性
lvconvert 更改逻辑卷布局
lvcreate 创建逻辑卷
lvdisplay 显示有关逻辑卷的信息
lvextend 为逻辑卷添加空间
lvmchange 使用设备映射器,这是过时的,什么都不做。
lvmconfig 显示和操作配置信息
lvmdiskscan 列出可用作物理卷的设备
lvmsadc 收集活动数据
lvmsar 创建活动报告
lvreduce 减小逻辑卷的大小
lvremove 从系统中删除逻辑卷
lvrename 重命名逻辑卷
lvresize 调整逻辑卷的大小
lvs 显示有关逻辑卷的信息
lvscan 列出所有卷组中的所有逻辑卷
pvchange 更改物理卷的属性
pvresize 调整物理卷的大小
pvck 检查物理卷的一致性
pvcreate 初始化LVM使用的物理卷
pvdata 显示物理卷的磁盘元数据
pvdisplay 显示物理卷的各种属性
pvmove 将范围从一个物理卷移动到另一个物理卷
lvpoll 继续在逻辑卷上启动轮询操作
pvremove 从物理卷中删除LVM标签
pvs 显示有关物理卷的信息
pvscan 列出所有物理卷
segtypes 列出可用的段类型
systemid 显示当前在此主机上设置的系统ID(如果有)
tags 此主机上定义的列表标签
vgcfgbackup 备份卷组配置
vgcfgrestore 还原卷组配置
vgchange 更改卷组属性
vgck 检查卷组的一致性
vgconvert 更改卷组元数据格式
vgcreate 创建卷组
vgdisplay 显示卷组信息
vgexport 从系统中取消注册卷组
vgextend 将物理卷添加到卷组
vgimport 使用system注册导出的卷组
vgimportclone 从克隆的PV导入VG
vgmerge 合并卷组
vgmknodes 在/ dev中为卷组设备创建特殊文件
vgreduce 从卷组中删除物理卷
vgremove 删除卷组
vgrename 重命名卷组
vgs 显示有关卷组的信息
vgscan 搜索所有卷组
vgsplit 将物理卷移动到新的或现有的卷组中
version 显示软件和驱动程序版本信息