接触 Linux 的同学应该多少都听过 LVM 这个词,LVM 英文是 Logical Volume Manager,翻译过来就是逻辑卷管理器。
LVM 的作用用一句话说可以概括为:传统分区大小固定,重新调整大小十分麻烦,LVM 通过在硬盘和分区之上再建一个逻辑层,提高了磁盘分区管理的灵活性。
LVM 几个概念:
- PV:物理卷,PV 处于 LVM 系统最低层,它可以是整个硬盘,或者与磁盘分区具有相同功能的设备(如RAID),但和基本的物理存储介质相比较,多了与 LVM 相关管理参数
- VG:卷组,创建在 PV 之上,由一个或多个 PV 组成,可以在 VG 上创建一个或多个 LVM分区(逻辑卷),功能类似非 LVM 系统的物理硬盘
- LV:逻辑卷,从 VG 中分割出的一块空间,创建之后其大小可以伸缩,在 LV 上可以创建文件系统(如 /var /home)
- PE:物理区域,每一个 PV 被划分为基本单元(也被称为 PE),具有唯一编号的 PE 是可以被 LVM 寻址的最小存储单元,默认为 4MB
How to use LVM in Linux 说明了怎么使用 LVM。
Linux LVM简明教程 是中文翻译版。
第一部分,先在一个硬盘上创建多个逻辑卷,将它们挂载在 /mnt/lvm
目录,然后对创建好的卷调整大小。
第二部分,从另外一块硬盘增加额外的卷到 LVM 中。
1. 准备磁盘分区
创建 3 个 1G 分区,用于 LVM 的分区需要使用 8e 类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 分区
$ sudo fdisk /dev/sdc
Command (m for help): n ## 新建
Partition number (1-128, default 1): 1 ## 分区号
First sector (34-7847902, default 2048): ## 回车用默认值
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-7847902, default 7845887): +1G ## 大小
Created a new partition 1 of type 'Linux filesystem' and of size 1 GiB.
Command (m for help): t ## 改变类型
Selected partition 1
Partition type or alias (type L to list all): lvm ## LVM 的分区代码
Changed type of partition 'Linux filesystem' to 'Linux LVM'.
# 验证
$ sudo fdisk -l
Device Start End Sectors Size Type
/dev/sdc1 2048 2099199 2097152 1G Linux LVM
/dev/sdc2 2099200 4196351 2097152 1G Linux LVM
/dev/sdc3 4196352 6293503 2097152 1G Linux LVM
2. 准备物理卷(PV)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建
$ sudo pvcreate /dev/sdc1
$ sudo pvcreate /dev/sdc2
$ sudo pvcreate /dev/sdc3
# 验证
$ sudo pvdisplay
"/dev/sdc1" is a new physical volume of "1.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc1
VG Name
PV Size 1.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID vemTMl-pRab-1leh-5agG-mzkq-gOiV-JfYegS
...
# 删除
$ sudo pvremove /dev/sdc1
3. 准备卷组(VG)
创建名为 volume-group1
的卷组,使用 /dev/sdb1
、 /dev/sdb2
和 /dev/sdb3
创建。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 创建
$ sudo vgcreate volume-group1 /dev/sdc1 /dev/sdc2 /dev/sdc3
# 验证
$ sudo vgdisplay
--- Volume group ---
VG Name volume-group1
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 <2.99 GiB
PE Size 4.00 MiB
Total PE 765
Alloc PE / Size 0 / 0
Free PE / Size 765 / <2.99 GiB
VG UUID pEy4MV-BEod-gFel-xs8N-2akF-0vok-gg4RjI
# 删除
$ sudo vgremove volume-group1
4. 创建逻辑卷(LV)
创建一个名为 logical-volume1
大小为 100MB 的逻辑卷,这个逻辑卷使用之前创建的卷组的空间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建
$ sudo lvcreate -L 100M -n logical-volume1 volume-group1
# 验证
$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/volume-group1/logical-volume1
LV Name logical-volume1
VG Name volume-group1
LV UUID jT3M5S-fXFe-YfGS-mJMM-cMMQ-iCtY-IBMNHB
LV Write Access read/write
LV Creation host, time pi, 2022-06-13 22:47:01 +0800
LV Status available
# open 0
LV Size 100.00 MiB
Current LE 25
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:0
逻辑卷准备好了,可以格式化和挂载逻辑卷。逻辑卷挂载后,就可以到挂载点 /mnt/lvm
上读写了。
1
2
3
$ sudo mkfs.ext4 /dev/volume-group1/logical-volume1
$ sudo mkdir /mnt/lvm
$ sudo mount /dev/volume-group1/logical-volume1 /mnt/lvm
删除逻辑卷:
1
2
$ sudo umount /lvm-mount/
$ sudo lvremove /dev/volume-group1/logical-volume1
5. 扩展 LVM 卷
调整逻辑卷大小的功能是 LVM 最有用的功能,将先前创建的逻辑卷 logical-volume1
扩大到 200MB。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ sudo umount /mnt/lvm
# 设置卷的大小为 200M
$ sudo lvresize -L 200M /dev/volume-group1/logical-volume1
# 检查磁盘错误
$ sudo e2fsck -f /dev/volume-group1/logical-volume1
# 扩展文件系统
$ sudo resize2fs /dev/volume-group1/logical-volume1
$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/volume-group1/logical-volume1
LV Name logical-volume1
VG Name volume-group1
LV UUID jT3M5S-fXFe-YfGS-mJMM-cMMQ-iCtY-IBMNHB
LV Write Access read/write
LV Creation host, time pi, 2022-06-13 22:47:01 +0800
LV Status available
# open 0
LV Size 200.00 MiB
Current LE 50
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:0
$ sudo mount /dev/volume-group1/logical-volume1 /mnt/lvm
6. 缩减 LVM 卷
减少逻辑卷的大小值若小于储存的数据大小,存储在后面的数据会丢失。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ sudo umount /mnt/lvm
# 检测磁盘错误
$ sudo e2fsck -f /dev/volume-group1/logical-volume1
# 缩小文件系统
$ sudo resize2fs /dev/volume-group1/logical-volume1 100M
# 减少逻辑卷大小
$ sudo lvresize -L 100M /dev/volume-group1/logical-volume1
$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/volume-group1/logical-volume1
LV Name logical-volume1
VG Name volume-group1
LV UUID jT3M5S-fXFe-YfGS-mJMM-cMMQ-iCtY-IBMNHB
LV Write Access read/write
LV Creation host, time pi, 2022-06-13 22:47:01 +0800
LV Status available
# open 0
LV Size 100.00 MiB
Current LE 25
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:0
7. 扩展卷组
假设卷组 volume-group1
已经满了需要扩大,硬盘(sdc)已经没有其他空闲分区,需要添加另外一个硬盘(sdd)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 检测当前卷组状态
$ sudo vgdisplay volume-group1
--- Volume group ---
VG Name volume-group1
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size <2.99 GiB
PE Size 4.00 MiB
Total PE 765
Alloc PE / Size 25 / 100.00 MiB
Free PE / Size 740 / 2.89 GiB
VG UUID pEy4MV-BEod-gFel-xs8N-2akF-0vok-gg4RjI
# 创建 2GB 分区 sdd1
$ sudo fdisk /dev/sdd
# 创建物理卷 /dev/sdd1
$ sudo pvcreate /dev/sdd1
# 增加物理卷到已存在的卷组
$ sudo vgextend volume-group1 /dev/sdd1
# 验证
$ sudo vgdisplay
--- Volume group ---
VG Name volume-group1
System ID
Format lvm2
Metadata Areas 4
Metadata Sequence No 9
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 4
Act PV 4
VG Size <4.99 GiB
PE Size 4.00 MiB
Total PE 1287
Alloc PE / Size 25 / 100.00 MiB
Free PE / Size 1262 / 4.89 GiB
VG UUID pEy4MV-BEod-gFel-xs8N-2akF-0vok-gg4RjI