Linux中的LVM存储管理

学习视频推荐

下面这个视频逻辑清晰,还带有操作实例,非常推荐!

什么是 LVM

LVM 是 Logical Volume Manager (逻辑卷管理)的缩写,是 Linux 系统中替代传统基于分区磁盘管理的一种磁盘管理方式。逻辑卷和分区的概念差不多。使用磁盘分区的方式不方便对磁盘容量进行调整,而 LVM 很好的解决了这个问题。

LVM 包含 3 个概念:

  • Physical Volume - 物理卷
  • Volume Group - 卷组(相当于传统概念中的磁盘)
  • Logical Volume - 逻辑卷(相当于传统概念中的分区)

这 3 个概念的关系如下:

结构

物理卷相当于存储空间的一个池子,一个物理卷下可以包含多个卷组,一个卷组下可以又有多个逻辑卷。要想对卷组扩容,卷组所属的物理卷必须要有足够的容量,逻辑卷同理。

Ubuntu 中的 LVM

在安装 ubuntu-20.04.6 桌面系统时记得勾选使用 LVM 的选项。这里遇到个问题,使用 LVM 这个选项只在默认分区下存在,自定义分区时无法指定。

LVM选项

这是本文中使用的安装系统默认分区方案:

Snipaste_2024-07-11_23-59-46

可以看到安装系统会默认创建 vgubuntu 这个卷组,然后在这个卷组下创建 root 和 swap_1 两个逻辑卷。

查看 LVM 信息

使用 pvdisplay 查看物理卷信息:

root@kitazono-vm:/home/kitazono# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  # 卷组名称
  VG Name               vgubuntu
  # 物理卷的容量
  PV Size               <19.50 GiB / not usable 0
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              4991
  Free PE               9
  Allocated PE          4982
  PV UUID               SopW29-0S5M-Oe33-ROb5-aBh7-aZXI-RECLAP

PV Size 为物理卷容量,约等于 PE Size x Total PE / 1024。

使用 vgddisplay 查看卷组信息:

root@kitazono-vm:/home/kitazono# vgdisplay
  --- Volume group ---
  VG Name               vgubuntu
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <19.50 GiB
  PE Size               4.00 MiB
  Total PE              4991
  Alloc PE / Size       4982 / 19.46 GiB
  Free  PE / Size       9 / 36.00 MiB
  VG UUID               qJWlI2-TS2u-fWHT-DSXz-b60b-6Ka1-mA1XfN

本系统中包含一个卷组,就是安装系统时安装程序创建的默认卷组 vgubuntu,VG Size 约等于 20G。

使用 lvdisplay 查看逻辑卷:

root@kitazono-vm:/home/kitazono# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vgubuntu/root
  LV Name                root
  VG Name                vgubuntu
  LV UUID                dCd3rn-q4yn-QHY1-RWfI-dFkt-XzE6-bIthjK
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2024-07-11 23:59:14 +0800
  LV Status              available
  # open                 1
  LV Size                <18.51 GiB
  Current LE             4738
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/vgubuntu/swap_1
  LV Name                swap_1
  VG Name                vgubuntu
  LV UUID                Ru88TV-pasS-4TWp-DjGM-klC7-csnm-A3Pagb
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2024-07-11 23:59:14 +0800
  LV Status              available
  # open                 2
  LV Size                976.00 MiB
  Current LE             244
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

本系统包含 /dev/vgubuntu/root 和 /dev/vgubuntu/swap_1 两个逻辑卷,还可以看到两个逻辑卷的容量、所属卷组等信息。

使用 lsblk 查看磁盘结构:

root@kitazono-vm:/home/kitazono# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                 7:0    0     4K  1 loop /snap/bare/5
loop1                 7:1    0  63.3M  1 loop /snap/core20/1828
loop2                 7:2    0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop3                 7:3    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop4                 7:4    0    46M  1 loop /snap/snap-store/638
loop5                 7:5    0  49.9M  1 loop /snap/snapd/18357
sda                   8:0    0    20G  0 disk
├─sda1                8:1    0   512M  0 part /boot/efi
├─sda2                8:2    0     1K  0 part
└─sda5                8:5    0  19.5G  0 part
  ├─vgubuntu-root   253:0    0  18.5G  0 lvm  /
  └─vgubuntu-swap_1 253:1    0   976M  0 lvm  [SWAP]
sr0                  11:0    1  1024M  0 rom

其中 sda 对应磁盘,sda5 对应物理卷PV,vgubuntu 对应卷组,vgubuntu-root 和 vgubuntu-swap_1 对应该卷组下的两个逻辑卷。

扩容操作

新增一块 10G 的硬盘,然后重新启动虚拟机。使用 lsblk 查看磁盘:

kitazono@kitazono-vm:~$ lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                 7:0    0  63.3M  1 loop /snap/core20/1828
loop1                 7:1    0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop2                 7:2    0     4K  1 loop /snap/bare/5
loop3                 7:3    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop4                 7:4    0    46M  1 loop /snap/snap-store/638
loop5                 7:5    0  49.9M  1 loop /snap/snapd/18357
sda                   8:0    0    20G  0 disk
├─sda1                8:1    0   512M  0 part /boot/efi
├─sda2                8:2    0     1K  0 part
└─sda5                8:5    0  19.5G  0 part
  ├─vgubuntu-root   253:0    0  18.5G  0 lvm  /
  └─vgubuntu-swap_1 253:1    0   976M  0 lvm  [SWAP]
# 新增的磁盘
sdb                   8:16   0    10G  0 disk
sr0                  11:0    1   4.1G  0 rom  /media/kitazono/Ubuntu 20.04.6 LTS amd64

10G 的新硬盘 sdb 已经识别到了。

使用 pvcreate 创建物理卷:

root@kitazono-vm:/home/kitazono# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

查看物理卷:

root@kitazono-vm:/home/kitazono# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               vgubuntu
  PV Size               <19.50 GiB / not usable 0
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              4991
  Free PE               9
  Allocated PE          4982
  PV UUID               SopW29-0S5M-Oe33-ROb5-aBh7-aZXI-RECLAP

  "/dev/sdb" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               a8qLmc-naFa-LVXu-zABA-kOfU-Wp9j-AV0L4r

/dev/sdb 就是刚才创建的物理卷。

然后使用 vgextend 给 vgubuntu 卷组增加容量:

root@kitazono-vm:/home/kitazono# vgextend vgubuntu /dev/sdb
  Volume group "vgubuntu" successfully extended

查看卷组详情:

root@kitazono-vm:/home/kitazono# vgdisplay
  --- Volume group ---
  VG Name               vgubuntu
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               29.49 GiB
  PE Size               4.00 MiB
  Total PE              7550
  Alloc PE / Size       4982 / 19.46 GiB
  Free  PE / Size       2568 / 10.03 GiB
  VG UUID               qJWlI2-TS2u-fWHT-DSXz-b60b-6Ka1-mA1XfN

VG size 已经从 20G 增加到了约 30G,Free PE / Size 容量就是新增的磁盘容量。卷组扩容成功之后就可以给逻辑卷扩容了。

先查看一下 root 卷的容量:

root@kitazono-vm:/home/kitazono# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                 7:0    0  63.3M  1 loop /snap/core20/1828
loop1                 7:1    0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop2                 7:2    0     4K  1 loop /snap/bare/5
loop3                 7:3    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop4                 7:4    0    46M  1 loop /snap/snap-store/638
loop5                 7:5    0  49.9M  1 loop /snap/snapd/18357
sda                   8:0    0    20G  0 disk
├─sda1                8:1    0   512M  0 part /boot/efi
├─sda2                8:2    0     1K  0 part
└─sda5                8:5    0  19.5G  0 part
  ├─vgubuntu-root   253:0    0  18.5G  0 lvm  /
  └─vgubuntu-swap_1 253:1    0   976M  0 lvm  [SWAP]
sdb                   8:16   0    10G  0 disk
sr0                  11:0    1   4.1G  0 rom  /media/kitazono/Ubuntu 20.04.6 LTS amd64

vgubuntu-root 此时容量为 18.5G,下面对 vgubuntu-root 扩容 5G。

root@kitazono-vm:/home/kitazono# lvextend -L +5g /dev/vgubuntu/root
  Size of logical volume vgubuntu/root changed from <18.51 GiB (4738 extents) to <23.51 GiB (6018 extents).
  Logical volume vgubuntu/root successfully resized.

再次查看磁盘容量情况:

root@kitazono-vm:/home/kitazono# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                 7:0    0  63.3M  1 loop /snap/core20/1828
loop1                 7:1    0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop2                 7:2    0     4K  1 loop /snap/bare/5
loop3                 7:3    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop4                 7:4    0    46M  1 loop /snap/snap-store/638
loop5                 7:5    0  49.9M  1 loop /snap/snapd/18357
sda                   8:0    0    20G  0 disk
├─sda1                8:1    0   512M  0 part /boot/efi
├─sda2                8:2    0     1K  0 part
└─sda5                8:5    0  19.5G  0 part
  ├─vgubuntu-root   253:0    0  23.5G  0 lvm  /
  └─vgubuntu-swap_1 253:1    0   976M  0 lvm  [SWAP]
sdb                   8:16   0    10G  0 disk
└─vgubuntu-root     253:0    0  23.5G  0 lvm  /
sr0                  11:0    1   4.1G  0 rom  /media/kitazono/Ubuntu 20.04.6 LTS amd64

此时 vgubuntu-root 容量增加到了 23.5 G。

此时如果使用 df -h 查看磁盘容量,会发现 root 分区的容量没有变化,调整逻辑卷的大小之后还要调整文件系统的大小?

root@kitazono-vm:/home/kitazono# df -h
Filesystem                 Size  Used Avail Use% Mounted on
udev                       1.9G     0  1.9G   0% /dev
tmpfs                      388M  1.9M  386M   1% /run
# 此时还是 19G
/dev/mapper/vgubuntu-root   19G  6.6G   11G  39% /
tmpfs                      1.9G     0  1.9G   0% /dev/shm
tmpfs                      5.0M  4.0K  5.0M   1% /run/lock
tmpfs                      1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/loop0                  64M   64M     0 100% /snap/core20/1828
/dev/loop1                 347M  347M     0 100% /snap/gnome-3-38-2004/119
/dev/loop2                 128K  128K     0 100% /snap/bare/5
/dev/loop3                  92M   92M     0 100% /snap/gtk-common-themes/1535
/dev/loop5                  50M   50M     0 100% /snap/snapd/18357
/dev/loop4                  46M   46M     0 100% /snap/snap-store/638
/dev/sda1                  511M  4.0K  511M   1% /boot/efi
tmpfs                      388M   20K  388M   1% /run/user/1000
/dev/sr0                   4.1G  4.1G     0 100% /media/kitazono/Ubuntu 20.04.6 LTS amd64

使用 resize2fs 调整文件系统的大小,如果是 xfs 格式的话使用 xfs_grows。

root@kitazono-vm:/home/kitazono# resize2fs /dev/vgubuntu/root
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/vgubuntu/root is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 3
The filesystem on /dev/vgubuntu/root is now 6162432 (4k) blocks long.

此时再查看磁盘容量:

root@kitazono-vm:/home/kitazono# df -h
Filesystem                 Size  Used Avail Use% Mounted on
udev                       1.9G     0  1.9G   0% /dev
tmpfs                      388M  1.9M  386M   1% /run
# 容量已经调整为 23 G
/dev/mapper/vgubuntu-root   23G  6.6G   16G  30% /
tmpfs                      1.9G     0  1.9G   0% /dev/shm
tmpfs                      5.0M  4.0K  5.0M   1% /run/lock
tmpfs                      1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/loop0                  64M   64M     0 100% /snap/core20/1828
/dev/loop1                 347M  347M     0 100% /snap/gnome-3-38-2004/119
/dev/loop2                 128K  128K     0 100% /snap/bare/5
/dev/loop3                  92M   92M     0 100% /snap/gtk-common-themes/1535
/dev/loop5                  50M   50M     0 100% /snap/snapd/18357
/dev/loop4                  46M   46M     0 100% /snap/snap-store/638
/dev/sda1                  511M  4.0K  511M   1% /boot/efi
tmpfs                      388M   20K  388M   1% /run/user/1000
/dev/sr0                   4.1G  4.1G     0 100% /media/kitazono/Ubuntu 20.04.6 LTS amd64

可以看到 root 分区的容量已经调整为 23G。

创建自己的卷组和逻辑卷

新增一块 5G 的硬盘然后重启虚拟机,然后查看磁盘详情:

root@kitazono-vm:/home/kitazono# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0                 7:0    0     4K  1 loop /snap/bare/5
loop1                 7:1    0  63.3M  1 loop /snap/core20/1828
loop2                 7:2    0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop3                 7:3    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop4                 7:4    0    46M  1 loop /snap/snap-store/638
loop5                 7:5    0  49.9M  1 loop /snap/snapd/18357
sda                   8:0    0    20G  0 disk
├─sda1                8:1    0   512M  0 part /boot/efi
├─sda2                8:2    0     1K  0 part
└─sda5                8:5    0  19.5G  0 part
  ├─vgubuntu-root   253:0    0  23.5G  0 lvm  /
  └─vgubuntu-swap_1 253:1    0   976M  0 lvm  [SWAP]
sdb                   8:16   0    10G  0 disk
└─vgubuntu-root     253:0    0  23.5G  0 lvm  /
# 新增的 5G 硬盘
sdc                   8:32   0     5G  0 disk
sr0                  11:0    1   4.1G  0 rom  /media/kitazono/Ubuntu 20.04.6 LTS amd64

然后创建物理卷:

root@kitazono-vm:/home/kitazono# pvcreate /dev/sdc
  Device vgkitazono not found.
  Physical volume "/dev/sdc" successfully created.

查看物理卷信息:

root@kitazono-vm:/home/kitazono# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda5
  VG Name               vgubuntu
  PV Size               <19.50 GiB / not usable 0
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4991
  Free PE               0
  Allocated PE          4991
  PV UUID               SopW29-0S5M-Oe33-ROb5-aBh7-aZXI-RECLAP

  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               vgubuntu
  PV Size               10.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              2559
  Free PE               1288
  Allocated PE          1271
  PV UUID               a8qLmc-naFa-LVXu-zABA-kOfU-Wp9j-AV0L4r

  "/dev/sdc" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               eSW0dn-QU6U-V8vj-KcG1-S6IF-bVBb-M34S4O

第三部分就是刚才创建成功的物理卷。然后再创建新的卷组:

root@kitazono-vm:/home/kitazono# vgcreate vgkitazono /dev/sdc
  Volume group "vgkitazono" successfully created

查看卷组信息:

root@kitazono-vm:/home/kitazono# vgdisplay
  --- Volume group ---
  VG Name               vgkitazono
  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               <5.00 GiB
  PE Size               4.00 MiB
  Total PE              1279
  Alloc PE / Size       0 / 0
  Free  PE / Size       1279 / <5.00 GiB
  VG UUID               JP7PLR-a3Iy-w4ox-zDDO-3eiR-MoPG-zoznfl

  --- Volume group ---
  VG Name               vgubuntu
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               29.49 GiB
  PE Size               4.00 MiB
  Total PE              7550
  Alloc PE / Size       6262 / 24.46 GiB
  Free  PE / Size       1288 / 5.03 GiB
  VG UUID               qJWlI2-TS2u-fWHT-DSXz-b60b-6Ka1-mA1XfN

可以看到 vgkitazono 已经创建成功,容量约为 5G。接下来创建一个 2G 的逻辑卷:

root@kitazono-vm:/home/kitazono# lvcreate -L 2g -n kitazono vgkitazono
  Logical volume "kitazono" created.

-L 参数指定容量大小,-n 指定逻辑卷名称,最后一个参数是卷组名。

查看此时的逻辑卷信息:

root@kitazono-vm:/home/kitazono# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vgkitazono/kitazono
  LV Name                kitazono
  VG Name                vgkitazono
  LV UUID                UviiLK-ywm0-jTxP-ZtoR-IbDB-M7f3-DCIoah
  LV Write Access        read/write
  LV Creation host, time kitazono-vm, 2024-07-12 01:56:52 +0800
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

  --- Logical volume ---
  LV Path                /dev/vgubuntu/root
  LV Name                root
  VG Name                vgubuntu
  LV UUID                dCd3rn-q4yn-QHY1-RWfI-dFkt-XzE6-bIthjK
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2024-07-11 23:59:14 +0800
  LV Status              available
  # open                 1
  LV Size                <23.51 GiB
  Current LE             6018
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/vgubuntu/swap_1
  LV Name                swap_1
  VG Name                vgubuntu
  LV UUID                Ru88TV-pasS-4TWp-DjGM-klC7-csnm-A3Pagb
  LV Write Access        read/write
  LV Creation host, time ubuntu, 2024-07-11 23:59:14 +0800
  LV Status              available
  # open                 2
  LV Size                976.00 MiB
  Current LE             244
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

可以看到逻辑卷 /dev/vgkitazono/kitazono 已经创建成功,容量为 2G。

逻辑卷创建成功之后还需要使用 mkfs.ex4 进行格式化:

root@kitazono-vm:/home/kitazono# mkfs.ext4 /dev/vgkitazono/kitazono
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 524288 4k blocks and 131072 inodes
Filesystem UUID: 0f25921a-4f2f-4f37-b014-b89fb79f7aeb
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912

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

格式化成功。

创建挂载点:

mkdir /mnt/kitazono

将刚才创建的逻辑卷挂载到挂载点:

mount /dev/vgkitazono/kitazono /mnt/kitazono

挂载完成后再查看磁盘容量信息:

root@kitazono-vm:/home/kitazono# df -h
Filesystem                       Size  Used Avail Use% Mounted on
udev                             1.9G     0  1.9G   0% /dev
tmpfs                            388M  1.9M  386M   1% /run
/dev/mapper/vgubuntu-root         23G  6.6G   16G  30% /
tmpfs                            1.9G     0  1.9G   0% /dev/shm
tmpfs                            5.0M  4.0K  5.0M   1% /run/lock
tmpfs                            1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/loop0                       128K  128K     0 100% /snap/bare/5
/dev/loop1                        64M   64M     0 100% /snap/core20/1828
/dev/loop2                       347M  347M     0 100% /snap/gnome-3-38-2004/119
/dev/loop3                        92M   92M     0 100% /snap/gtk-common-themes/1535
/dev/loop4                        46M   46M     0 100% /snap/snap-store/638
/dev/loop5                        50M   50M     0 100% /snap/snapd/18357
/dev/sda1                        511M  4.0K  511M   1% /boot/efi
tmpfs                            388M   20K  388M   1% /run/user/1000
/dev/sr0                         4.1G  4.1G     0 100% /media/kitazono/Ubuntu 20.04.6 LTS amd64
# 刚才挂载的逻辑卷
/dev/mapper/vgkitazono-kitazono  2.0G   24K  1.8G   1% /mnt/kitazono

2G 容量的逻辑卷就可以正常使用了。

删除操作

删除命令:

  • lvremove
  • vgremove
  • pvremove

卸载逻辑卷:

umount /mnt/kitazono/

删除逻辑卷:

root@kitazono-vm:/home/kitazono# lvremove /dev/vgkitazono/kitazono
Do you really want to remove and DISCARD active logical volume vgkitazono/kitazono? [y/n]: y
  Logical volume "kitazono" successfully removed

删除卷组:

root@kitazono-vm:/home/kitazono# vgremove vgkitazono
  Volume group "vgkitazono" successfully removed

删除物理卷:

root@kitazono-vm:/home/kitazono# pvremove /dev/sdc
  Labels on physical volume "/dev/sdc" successfully wiped.

参考

The Complete Beginner’s Guide to LVM in Linux

Linux 中 LVM 的完整初学者指南 [带实践]