Home 逻辑卷管理器 LVM
Post
Cancel

逻辑卷管理器 LVM

接触 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

lvm

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
This post is licensed under CC BY 4.0 by the author.