1、LVM 的核心概念

LVM 通过将底层的物理磁盘抽象化,形成一个更易于管理和扩展的逻辑层。其核心由三个部分组成:

  1. Physical Volume - PV
  2. Volume Group - VG
  3. Logical Volume - LV

它们之间的关系可以这样理解:
物理硬盘 -> 做成 PV -> 合并到 VG -> 从 VG 中划分出 LV -> 格式化并挂载 LV 使用


1. 物理卷

  • 是什么:PV 是 LVM 的基本存储单元,通常对应一个硬盘、一个分区,或者一个 RAID 设备。在使用之前,必须将这些块设备初始化为 PV。
  • 关键命令:
    • pvcreate /dev/sdb1 /dev/sdc1:将分区 /dev/sdb1 和 /dev/sdc1 初始化为物理卷。
    • pvdisplay:显示物理卷的详细信息。
    • pvs 或 pvscan:简要显示所有物理卷。
    • pvmove /dev/sdb1:将数据从 PV /dev/sdb1 移动到同 VG 中的其他 PV。
    • pvremove /dev/sdb1:删除物理卷属性(删除前需确保数据已移走或不再需要)。

2. 卷组

  • 是什么:VG 是一个或多个 PV 的集合,可以看作是一个大的“存储池”。LVM 的管理操作主要在 VG 层面进行。系统上的 VG 名字必须唯一。
  • 关键命令:
    • vgcreate my_vg /dev/sdb1 /dev/sdc1:创建一个名为 my_vg 的卷组,并包含两个 PV。
    • vgextend my_vg /dev/sdd1:将新的 PV /dev/sdd1 扩展到 my_vg 卷组中。
    • vgreduce my_vg /dev/sdb1:从 my_vg 卷组中移除 PV /dev/sdb1(移除前需用 pvmove 移走数据)。
    • vgdisplay:显示卷组的详细信息。
    • vgs:简要显示所有卷组。
    • vgremove my_vg:删除一个卷组。

3. 逻辑卷

  • 是什么:LV 是从 VG 中划分出来的一块空间,相当于传统分区。我们可以对这个“逻辑分区”进行格式化、挂载和使用。LV 可以动态调整大小,是用户最终操作的对象。
  • 关键命令:
    • lvcreate -L 20G -n my_data my_vg:从卷组 my_vg 中创建一个大小为 20G,名为 my_data 的逻辑卷。
      • -L:指定大小(如 10G, 500M)。
      • -l:指定 PE 的个数或百分比(如 100%FREE 使用所有剩余空间)。
      • -n:指定 LV 的名称。
    • lvdisplay:显示逻辑卷的详细信息。
    • lvs:简要显示所有逻辑卷。
    • lvextend -L +5G /dev/my_vg/my_data:为 LV my_data 增加 5G 空间。
      • 注意:lvextend 只扩展了 LV 的物理边界,文件系统的大小还需要用 resize2fs(ext3/4)或 xfs_growfs(XFS)来扩展。
    • lvreduce -L -5G /dev/my_vg/my_data:减小 LV 5G 空间(危险操作!必须先缩减文件系统并确保数据无损)。
    • lvremove /dev/my_vg/my_data:删除一个逻辑卷。

4. LVM 的常用操作流程

创建并使用一个 LVM
  1. 准备物理磁盘/分区:使用 fdisk/gdisk 创建分区,并将分区类型标记为 8e(MBR)或 8e00(GPT)的 Linux LVM。
  2. 创建 PV:pvcreate /dev/sdb1
  3. 创建 VG:vgcreate my_volgroup /dev/sdb1
  4. 创建 LV:lvcreate -L 10G -n my_logvol my_volgroup
  5. 格式化 LV:mkfs.ext4 /dev/my_volgroup/my_logvol
  6. 挂载使用:mount /dev/my_volgroup/my_logvol /mnt/data
扩展一个 LV(最常见操作)
  1. 确保 VG 有空间:使用 vgs 查看 Free PE / Size。
    • 如果 VG 空间不足,先添加新硬盘,创建 PV,然后 vgextend my_volgroup /dev/new_pv。
  2. 扩展 LV:lvextend -L +5G /dev/my_volgroup/my_logvol(增加 5G)
    或 lvextend -l +100%FREE /dev/my_volgroup/my_logvol(使用所有剩余空间)
  3. 扩展文件系统(关键步骤!):
    • 对于 ext2/3/4:resize2fs /dev/my_volgroup/my_logvol
    • 对于 XFS:xfs_growfs /mnt/data(XFS 只能在挂载状态下扩展)

5. LVM 的高级特性

  • PE:物理扩展块。是 PV 和 VG 分配空间的最小单位,默认为 4MB。在创建 VG 时可以通过 -s 选项指定大小(如 vgcreate -s 8M my_vg ...)。
  • LE:逻辑扩展块。是 LV 分配空间的最小单位,大小与 PE 相同。
  • 快照:
    • 瞬间为一个 LV 创建一个“冻结”的镜像,常用于备份或在测试时保存状态。
    • 创建快照:lvcreate -L 1G -s -n snap_of_my_data /dev/my_vg/my_data
    • 挂载快照:mount /dev/my_vg/snap_of_my_data /mnt/snapshot
    • 完成后可合并或删除。
  • 条带化:类似 RAID 0,将数据分散存储在多个 PV 上,提高性能。
    • lvcreate -i 2 -I 64 -L 10G -n striped_lv my_vg
      • -i 2:使用 2 个 PV 进行条带化。
      • -I 64:条带大小(Stripe Size)为 64KB。
  • 镜像:类似 RAID 1,为 LV 创建镜像副本,提供数据冗余。
    • lvcreate -m 1 -L 10G -n mirrored_lv my_vg (-m 1 表示 1 个镜像副本)

总结与优势

特性传统分区LVM优势
容量固定大小可动态在线扩展/缩减灵活性高,避免初期规划失误
名称设备名(如 /dev/sda1)自定义名称(如 /dev/vg_data/lv_mysql)更直观,易于管理
跨磁盘一个分区只能在一个磁盘上一个 VG/LV 可以跨多个物理磁盘轻松整合多块硬盘空间
快照不支持支持零 downtime 备份,系统恢复利器

核心思想:LVM 将存储管理的物理层面(PV)和逻辑层面(LV)分离,通过在中间加入卷组(VG)这个抽象层,实现了前所未有的灵活性。对于服务器管理和需要灵活调整存储空间的场景,LVM 几乎是必备技能。

2、实例操作

1、查看信息

root@server:~# lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0                       7:0    0 63.3M  1 loop /snap/core20/1828
loop1                       7:1    0 49.9M  1 loop /snap/snapd/18357
loop2                       7:2    0 91.9M  1 loop /snap/lxd/24061
sr0                        11:0    1  1.4G  0 rom
vda                       252:0    0  120G  0 disk
├─vda1                    252:1    0    1M  0 part
├─vda2                    252:2    0    2G  0 part /boot
└─vda3                    252:3    0  118G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   59G  0 lvm  /
vdb                       252:16   0  500G  0 disk
root@server:~#
root@server:~#
root@server:~# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               7.8G     0  7.8G   0% /dev
tmpfs                              1.6G  1.1M  1.6G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   58G  7.0G   48G  13% /
tmpfs                              7.9G     0  7.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/loop0                          64M   64M     0 100% /snap/core20/1828
/dev/loop2                          92M   92M     0 100% /snap/lxd/24061
/dev/loop1                          50M   50M     0 100% /snap/snapd/18357
/dev/vda2                          2.0G  108M  1.7G   6% /boot
tmpfs                              1.6G     0  1.6G   0% /run/user/0
root@server:~# df -h /
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv   58G  7.0G   48G  13% /
root@server:~#
root@server:~# df -T /
Filesystem                        Type 1K-blocks    Used Available Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  60575596 7257248  50208872  13% /
root@server:~#
root@server:~#

2、LVM操作

root@server:~# pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created.
root@server:~#
root@server:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/vda3
  VG Name               ubuntu-vg
  PV Size               <118.00 GiB / not usable 0
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              30207
  Free PE               15104
  Allocated PE          15103
  PV UUID               krw0yc-AlUh-Nvmy-mkkq-8qEY-n5ig-JvuHMX

  "/dev/vdb" is a new physical volume of "500.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/vdb
  VG Name
  PV Size               500.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               vEKT34-BZUu-IcN8-pFkD-Bkjc-Tqxz-sWGBtX

root@server:~# 
root@server:~# vgextend ubuntu-vg /dev/vdb
  Volume group "ubuntu-vg" successfully extended
root@server:~#
root@server:~#
root@server:~# 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               617.99 GiB
  PE Size               4.00 MiB
  Total PE              158206
  Alloc PE / Size       15103 / <59.00 GiB
  Free  PE / Size       143103 / <559.00 GiB
  VG UUID               SQ962A-Eecc-svcJ-bjnh-gKcc-KC7h-x6zhWm

root@server:~#
root@server:~#
root@server:~# lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
  Size of logical volume ubuntu-vg/ubuntu-lv changed from <59.00 GiB (15103 extents) to 617.99 GiB (158206 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.
root@server:~#
root@server:~#
root@server:~# lvs
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- 617.99g
root@server:~#
root@server:~#
root@server:~# 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 = 8, new_desc_blocks = 78
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 162002944 (4k) blocks long.

root@server:~#
root@server:~#
root@server:~#
root@server:~#
root@server:~# lvs
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  ubuntu-lv ubuntu-vg -wi-ao---- 617.99g
root@server:~#
root@server:~#

3、最终查看

root@server:~# df -h /
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv  608G  7.0G  576G   2% /
root@server:~#
root@server:~#
root@server:~#
root@server:~# df -Th
Filesystem                        Type      Size  Used Avail Use% Mounted on
udev                              devtmpfs  7.8G     0  7.8G   0% /dev
tmpfs                             tmpfs     1.6G  1.1M  1.6G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv ext4      608G  7.0G  576G   2% /
tmpfs                             tmpfs     7.9G     0  7.9G   0% /dev/shm
tmpfs                             tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs                             tmpfs     7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/loop0                        squashfs   64M   64M     0 100% /snap/core20/1828
/dev/loop2                        squashfs   92M   92M     0 100% /snap/lxd/24061
/dev/loop1                        squashfs   50M   50M     0 100% /snap/snapd/18357
/dev/vda2                         ext4      2.0G  108M  1.7G   6% /boot
tmpfs                             tmpfs     1.6G     0  1.6G   0% /run/user/0
root@server:~#
root@server:~#
root@server:~#

更多推荐