LVM简介

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。 传统分区使用固定大小分区,重新调整大小十分麻烦。但是,LVM可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。

LVM工作机制

LVM通过将底层的物理硬盘封装起来,以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取。而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。

LVM相关概念

物理卷(PV, Physical Volume)

物理卷就是指磁盘、磁盘分区或从逻辑上和磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有和LVM相关的管理参数。

  • 使用pvcreate /dev/sdb1来基于sdb1分区创建PV

卷组(VG, Volume Group)

VG由若干PV组成,能在VG上创建一个或多个LV。VG是PV和LV中间的层,可以通过调整VG中的PV来调整VG的容量,进而调整LV的分配情况。

  • 使用vgcreate vg01 /dev/sdb1创建vg并添加sdb1对应的pv
  • 使用vgextend vg01 /dev/sdb2向vg中继续添加pv

逻辑卷(LV, Logical Volume)

LV是从VG上分配出的一块空间,用于建立文件系统,相当于非LVM模式的磁盘分区。

  • 使用lvcreate -L 10M -n lv01 vg01 在vg上创建lv并指定初始大小为10M
  • 使用lvextend -L +200M /dev/vg01/lv01扩展lv01的大小为100M,前提是vg01中有未使用的空间
  • 创建出的lv需要格式化成指定文件系统,才能进行挂载操作

LVM概念

注意:

  • VG不一定要把全部空间分给LV,可以有剩余空间。LV仍可用这些剩余空间进行扩容,此时文件系统需要使用resize2fs 重新激活才能获得扩容后的大小。
  • 如果VG空间不足以对LV和文件系统扩容,需要向VG添加新的PV。这些PV来自新的磁盘分区。

在已有磁盘上扩容LV

模拟利用磁盘上的未使用空间对已存在的LV进行扩容的场景。

VM的初始磁盘情况为: lsblk 可以看到/dev/sda容量20G,在/dev/sda3上存在一个lv /dev/ubuntu-vg/ubuntu-lv容量18G,并将根目录/挂载在这个lv上。 (ubuntu-vg是VG名,ubuntu-lv是LV名)

我们要做的是,将磁盘/dev/sda扩容10G,并将新空间扩容进ubuntu-lv这个lv,使其容量达到28G,满足根目录需求。

在VMWare中扩容磁盘,制造未使用空间

在VM中将虚拟机关机,将sda磁盘扩容10G,最终扩展到30G。 vmware

lsblk

可以看到,sda磁盘已经变为30G,但是分区sda3的大小没变,上面lv的大小仍然是18G。需要将sda继续分区,并将新分区扩容进lv。

创建新分区

fdisk -l 查看磁盘情况 fdisk

看到待分区的设备/dev/sda。使用fdisk /dev/sda 继续分区

 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
root@common:~# fdisk /dev/sda

Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

GPT PMBR size mismatch (41943039 != 62914559) will be corrected by write.

Command (m for help): m    ## 查看指令说明

Help:

  GPT
   M   enter protective/hybrid MBR

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty DOS partition table
   s   create a new empty Sun partition table


Command (m for help): n    ## 新建分区
Partition number (4-128, default 4):    ## 回车,使用默认分区号
First sector (41940992-62914526, default 41940992):    ## 回车,使用默认起始位置
Last sector, +/-sectors or +/-size{K,M,G,T,P} (41940992-62914526, default 62914526):    ## 回车,默认结束位置,使用剩余全部空间

Created a new partition 4 of type 'Linux filesystem' and of size 10 GiB.

Command (m for help): p    ## 打印当前分区结果
Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: E53D0CFF-41A4-4AA5-83A4-2CBC9478AF63

Device        Start      End  Sectors  Size Type
/dev/sda1      2048     4095     2048    1M BIOS boot
/dev/sda2      4096  3719167  3715072  1.8G Linux filesystem
/dev/sda3   3719168 41940991 38221824 18.2G Linux filesystem
/dev/sda4  41940992 62914526 20973535   10G Linux filesystem    ## 看到新增的分区sda4大小正好是10G

Command (m for help): w    ## 保存分区并退出
The partition table has been altered.
Syncing disks.

root@common:~#

检查分区结果 lsblk

新增的分区为/dev/sda4,大小为10G

将新分区加入到原来的lv

在新分区创建pv

1
2
root@common:~# pvcreate /dev/sda4
  Physical volume "/dev/sda4" successfully created.

扩容VG

查看VG当前情况

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
root@common:~# vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  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               18.22 GiB
  PE Size               4.00 MiB
  Total PE              4665
  Alloc PE / Size       4608 / 18.00 GiB
  Free  PE / Size       57 / 228.00 MiB
  VG UUID               aDRUun-9KCE-ohgP-hhex-qFlC-urdy-hXFRL4

使用vgextend将新pv加入到原来的vg

1
2
root@common:~# vgextend ubuntu-vg /dev/sda4
  Volume group "ubuntu-vg" successfully extended

再次查看vg

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
root@common:~# vgdisplay
  --- Volume group ---
  VG Name               ubuntu-vg
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <28.22 GiB    ## vg已扩容
  PE Size               4.00 MiB
  Total PE              7224
  Alloc PE / Size       4608 / 18.00 GiB
  Free  PE / Size       2616 / <10.22 GiB
  VG UUID               aDRUun-9KCE-ohgP-hhex-qFlC-urdy-hXFRL4

扩容LV

查看之前的lv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
root@common:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                oXiGwK-ggOt-ZFh2-b9qX-H2mV-HAgm-cgVGU6
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2022-09-11 22:08:21 +0000
  LV Status              available
  # open                 1
  LV Size                18.00 GiB  # 之前大小为18G
  Current LE             4608
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

扩容lv

1
2
3
root@common:~# lvextend -L +10G /dev/ubuntu-vg/ubuntu-lv
  Size of logical volume ubuntu-vg/ubuntu-lv changed from 18.00 GiB (4608 extents) to 28.00 GiB (7168 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.

再次查看lv

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
root@common:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                oXiGwK-ggOt-ZFh2-b9qX-H2mV-HAgm-cgVGU6
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2022-09-11 22:08:21 +0000
  LV Status              available
  # open                 1
  LV Size                28.00 GiB    ## lv已扩容
  Current LE             7168
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

激活扩容后的LV

LV扩容后,文件系统显示的大小还未改变,需要使用resize2fs激活扩容后的LV。 df

1
2
3
4
5
6
7
root@common:~# resize2fs /dev/ubuntu-vg/ubuntu-lv
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 7340032 (4k) blocks long.

root@common:~#

检查扩容结果

lsblk

df

可以看到:

  • 新分区/dev/sdb4的容量为10G
  • 分区/dev/sdb4/dev/sdb3共同组成了LV /dev/ubuntu-vg/ubuntu-lv,这个LV大小为28G,挂载了根目录/
  • 根目录容量已经达到28G

在新磁盘上使用LV

演示在新的磁盘上使用LVM分区

VMWare上挂载新的硬盘

vmware

vmware

在虚拟机上可以看到新增的20G磁盘

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
root@common:~# lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                         2:0    1    4K  0 disk
loop0                       7:0    0   62M  1 loop /snap/core20/1611
loop1                       7:1    0 67.8M  1 loop /snap/lxd/22753
loop2                       7:2    0   47M  1 loop /snap/snapd/16292
sda                         8:0    0   30G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1.8G  0 part /boot
├─sda3                      8:3    0 18.2G  0 part
│ └─ubuntu--vg-ubuntu--lv 253:0    0   28G  0 lvm  /
└─sda4                      8:4    0   10G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   28G  0 lvm  /
sdb                         8:16   0   20G  0 disk    ## 新增的磁盘
sr0                        11:0    1 1024M  0 rom
sr1                        11:1    1 1024M  0 rom

对新磁盘分区

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@common:~# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x496d280f.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039):    # 默认配置,新分区使用全部空间

Created a new partition 1 of type 'Linux' and of size 20 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
root@common:~# lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                         2:0    1    4K  0 disk
loop0                       7:0    0   62M  1 loop /snap/core20/1611
loop1                       7:1    0 67.8M  1 loop /snap/lxd/22753
loop2                       7:2    0   47M  1 loop /snap/snapd/16292
sda                         8:0    0   30G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1.8G  0 part /boot
├─sda3                      8:3    0 18.2G  0 part
│ └─ubuntu--vg-ubuntu--lv 253:0    0   28G  0 lvm  /
└─sda4                      8:4    0   10G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   28G  0 lvm  /
sdb                         8:16   0   20G  0 disk
└─sdb1                      8:17   0   20G  0 part    ## 新分区
sr0                        11:0    1 1024M  0 rom
sr1                        11:1    1 1024M  0 rom
root@common:~#

创建逻辑卷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@common:~# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
root@common:~# vgcreate vg-data /dev/sdb1
  Volume group "vg-data" successfully created
root@common:~# lvcreate -L 5G -n lv-data vg-data    # 使用VG中的一部分空间创建LV
  Logical volume "lv-data" created.
root@common:~# lvdisplay vg-data     ## 查看vg vg-data下的lv
  --- Logical volume ---
  LV Path                /dev/vg-data/lv-data
  LV Name                lv-data
  VG Name                vg-data
  LV UUID                aE1kTJ-fZAK-GNWf-2q3w-klR9-oXB2-cad4LC
  LV Write Access        read/write
  LV Creation host, time common, 2022-09-18 08:29:03 +0000
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

格式化逻辑卷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
root@common:~# mkfs.ext4 /dev/vg-data/lv-data
Creating filesystem with 1310720 4k blocks and 327680 inodes
Filesystem UUID: e3c869d1-14f7-4b71-8741-3f585e9196e6
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

挂载逻辑卷

1
2
root@common:~# mkdir /data
root@common:~# mount /dev/vg-data/lv-data /data

查看结果

lsblk

df

可以看到:

  • 新磁盘容量20G,sdb1分区大小10G,LV用了5G,挂载了/data目录

配置自动挂载

在/etc/fstab 中添加新的挂载信息,防止重启丢失挂载点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
root@common:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-aDRUun9KCEohgPhhexqFlCurdyhXFRL4oXiGwKggOtZFh2b9qXH2mVHAgmcgVGU6 / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/3f643662-d868-4bf6-83d9-ad31aed0366a /boot ext4 defaults 0 1
/swap.img	none	swap	sw	0	0
/dev/vg-data/lv-data /data ext4 defaults 0 2    ## 新的挂载点信息

扩展逻辑卷

vg-data的容量有20G,目前lv-data只分配了5G,接下来再扩容进去5G。

查看vg-data和lv-data

vg

lv

扩容LV

目前vg有足够的空闲空间,直接扩容LV即可

1
2
3
4
root@common:~# lvextend -L +5G /dev/vg-data/lv-data
  Size of logical volume vg-data/lv-data changed from 5.00 GiB (1280 extents) to 10.00 GiB (2560 extents).
  Logical volume vg-data/lv-data successfully resized.
root@common:~#

激活扩容后的LV

1
2
3
4
5
6
root@common:~# resize2fs /dev/vg-data/lv-data
Filesystem at /dev/vg-data/lv-data is mounted on /data; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/vg-data/lv-data is now 2621440 (4k) blocks long.

root@common:~#

查看结果

res

res

res

res

Reference

LVM基础操作步骤梳理

Linux LVM简明教程