🗒️告别分区烦恼:为什么你应该拥抱 LVM 及其最佳实践
2025-4-28
| 2025-6-17
Words 3765Read Time 10 min
type
status
date
slug
summary
tags
category
icon
password
URL
 
在使用 Linux 时,我们经常会遇到磁盘空间管理的问题。传统的固定分区方式一旦设定,后期调整(尤其是扩大或缩小)往往非常麻烦,甚至需要借助 Live CD 并承担数据丢失的风险。如果你看到过类似 ubuntu--vg-ubuntu--lv 这样的设备名,或者正在为如何调整 / 根分区大小而头疼,那么了解逻辑卷管理 (LVM, Logical Volume Management) 就显得尤为重要。
LVM 不是文件系统,而是一个位于物理磁盘分区和文件系统之间的抽象层。 它允许你将一个或多个硬盘(或分区)组合起来,形成一个或多个卷组 (Volume Group, VG),然后在这个卷组的“存储池”中创建逻辑卷 (Logical Volume, LV)。这些逻辑卷就像虚拟的、可灵活调整大小的分区,你可以在其上创建文件系统(如 ext4, xfs)。

LVM 的核心组件

理解 LVM 需要知道这三个基本概念:
  1. 物理卷 (Physical Volume, PV): 底层的物理存储单元。这通常是整个硬盘(如 /dev/sda/dev/nvme0n1)或一个硬盘分区(如 /dev/sda2/dev/nvme0n1p3)。你需要先将这些设备初始化为 PV,才能被 LVM 使用。
  1. 卷组 (Volume Group, VG): 一个或多个 PV 组合成的存储池。你可以把它想象成一个大的虚拟硬盘。例如,你可以将两个 1TB 的硬盘合并成一个 2TB 的 VG。在你的例子中,ubuntu-vg 就是卷组名。
  1. 逻辑卷 (Logical Volume, LV): 从 VG 中划分出来的、可供使用的“虚拟分区”。你可以根据需要创建任意大小的 LV(只要 VG 中有足够空间),并在其上创建文件系统。LV 的大小可以动态调整。在你的例子中,ubuntu--vg-ubuntu--lv 就是一个挂载在 / 上的 LV。
它们的关系是:PV -> VG -> LV -> 文件系统

为什么要使用 LVM?(核心优势)

相比传统分区,LVM 提供了显著的优势:
  1. 无与伦比的灵活性 (Resizing): 这是 LVM 最吸引人的特点。
      • 在线扩大: 你可以轻松地扩大 LV 的大小,通常无需卸载文件系统(对于 ext4/xfs 等)。如果 VG 中有可用空间,只需 lvextend 和 resize2fs/xfs_growfs 两条命令即可。
      • 缩小 (需谨慎): 缩小 LV 也是可能的(XFS 不支持缩小文件系统),但通常需要先缩小文件系统,并且建议在离线状态下(如 Live CD)操作,以防数据丢失。
      • 跨越物理界限: 当 VG 空间不足时,你可以添加新的硬盘(或分区)作为 PV 加入到现有的 VG 中,然后继续扩大 LV。你的根目录 / 可以跨越多个物理磁盘!
  1. 聚合存储空间 (Spanning Disks): 将多个物理磁盘或分区合并到一个 VG 中,创建一个统一的大存储池,简化空间管理。
  1. 快照 (Snapshots): LVM 允许你为 LV 创建即时的时间点快照。这对于备份前的准备、测试系统更新或回滚操作非常有用,而且创建快照几乎是瞬时的,占用的空间仅为更改的数据量(写时复制)。
  1. 精简置备 (Thin Provisioning): 允许你创建超额分配的 LV。LV 看似很大,但实际只占用写入数据所需的空间。这在虚拟化等场景中很有用,但需要监控实际使用情况以防 VG 空间耗尽。
  1. 数据迁移 (PV Migration): 你可以在 VG 保持在线的情况下,将数据从一个 PV(比如一个旧硬盘)迁移到同一 VG 中的另一个 PV(比如一个新硬盘),然后移除旧的 PV。

LVM 最佳实践

仅仅使用 LVM 还不够,遵循一些最佳实践可以让你更安全、更高效地管理存储:
  1. 提前规划,预留空间: 在创建 VG 时,不要立即将所有空间分配给 LV。在 VG 中保留一部分未分配的空间(比如 10-20%),这样未来需要扩大 LV 时就非常方便,无需立即添加新硬盘。
  1. 使用有意义的命名: 避免使用系统默认的 lv001vg_data 等。使用描述性的名称,如 vg-mainvg-backuplv-rootlv-homelv-docker-data。这在你管理多个 LV 和 VG 时至关重要。(你的 ubuntu--vg-ubuntu--lv 是安装程序默认的,虽然能用,但自己创建时可以更清晰)。
  1. 将 OS 和数据适当分离: 可以考虑为操作系统 (//boot 通常不用 LVM) 创建一个 VG,为用户数据 (/home) 或特定应用数据(数据库、容器卷)创建另一个 VG。或者在同一个 VG 中创建不同的 LV。这有助于管理和备份。
  1. 定期监控空间: 使用 pvsvgslvsdf -h 等命令定期检查 PV、VG 和 LV 的使用情况,特别是在使用精简置备或快照时。
  1. 备份!备份!备份! LVM 提供了灵活性,但不是备份方案。在进行任何调整大小、迁移等操作前,务必备份重要数据。快照可以辅助备份,但不能替代完整的离线备份。
  1. 了解文件系统限制: 记住 LVM 调整的是块设备大小,你还需要使用相应的文件系统工具 (resize2fsxfs_growfs 等) 来调整文件系统。了解你使用的文件系统是否支持在线调整、是否支持缩小等。
  1. 谨慎使用 LVM on /boot: /boot 分区包含引导加载程序(如 GRUB),它可能无法识别复杂的 LVM 配置。通常建议将 /boot 放在一个标准的、非 LVM 的分区上。/boot/efi (EFI 系统分区) 也必须是非 LVM 的 FAT32 分区。
  1. 快照不是永久的: LVM 快照会随着源 LV 的数据变化而增长。如果源 LV 写入频繁,快照会迅速消耗 VG 空间。快照应用于短期目的(备份、测试),使用后应及时删除。

结论

LVM 是 Linux 系统管理员和高级用户强大的存储管理工具。它通过引入抽象层,提供了传统分区无法比拟的灵活性和功能。虽然它增加了一层复杂性,但只要理解了其核心概念并遵循最佳实践,LVM 就能极大地简化磁盘空间的管理,尤其是在需要频繁调整分区大小或管理多个磁盘的环境中。对于服务器和需要长期维护的桌面系统来说,使用 LVM 通常是一个明智的选择。
 

LVM 实战演练:常见场景与命令运用

理论讲完了,让我们看看在实际工作中,LVM 是如何解决问题的。以下是一些常见的应用场景及其对应的 LVM 操作思路和关键命令。
场景一:根分区 "/" 空间告急,但卷组还有空间
  • 场景描述: 你发现服务器的根分区 (/) 使用率超过 90%,告警不断。通过 sudo vgs 查看,发现其所在的卷组 ubuntu-vg 还有不少剩余空间 (Free PE)。
  • LVM 解决方案: 在线扩展根分区对应的逻辑卷 (ubuntu-lv),然后扩展文件系统。
  • 关键命令示例:
    • 注意事项:
      • 执行 resize2fsxfs_growfs 之前,务必确认你的文件系统类型 (lsblk -fmount | grep ' / ')。
      • 对于 ext4 和 XFS,在线(即不卸载 /)扩展通常是安全的。
    场景二:添加新硬盘,扩展 /home 目录空间
    • 场景描述: 用户数据越来越多,挂载在 /home 的逻辑卷 (lv-home) 空间不足,其所在的卷组 (vg-data) 也满了。你添加了一块新的硬盘 (/dev/sdc)。
    • LVM 解决方案: 将新硬盘初始化为物理卷 (PV),将其添加到现有的卷组 (VG) 中,然后扩展 /home 对应的逻辑卷 (LV) 和文件系统。
    • 关键命令示例:
      • 注意事项:
        • pvcreate 会清除目标设备上的数据,请再三确认设备名 (/dev/sdc1) 无误!
        • 一个 VG 可以包含来自不同物理硬盘的 PV。
      场景三:进行系统大版本升级前的安全保障
      • 场景描述: 你计划进行一次可能存在风险的操作系统大版本升级(比如 Ubuntu 20.04 升级到 22.04)。你希望在升级失败时,能快速回滚到升级前的状态。
      • LVM 解决方案: 在升级前,为根分区的逻辑卷创建一个 LVM 快照。
      • 关键命令示例:
        • 注意事项:
          • 快照不是备份!它只记录了创建快照后源 LV 发生变化的数据块。如果源 LV 写入非常频繁,快照会迅速增长并可能耗尽 VG 空间。
          • 快照主要用于短期操作(如升级、打补丁、测试前的状态保存),完成后应及时删除。
          • 快照的回滚(特别是 -merge)需要谨慎操作,最好在离线状态下进行。
        场景四:为 Docker 单独划分存储空间
        • 场景描述: 你希望将 Docker 的镜像、容器、卷等数据 (/var/lib/docker) 存放在一个独立的、可灵活调整大小的空间,而不是占用根分区。
        • LVM 解决方案: 在一个卷组中创建一个新的逻辑卷,将其格式化并挂载到 /var/lib/docker
        • 关键命令示例:
          • 注意事项:
            • 操作 /var/lib/docker 前务必停止 Docker 服务。
            • 修改 /etc/fstab 时要小心语法错误,以免系统无法启动。
            • 如果 Docker 数据量很大,迁移会花费一些时间。

          这些场景展示了 LVM 在解决实际存储管理问题时的灵活性和强大功能。通过熟练运用这些命令,你可以更从容地应对各种磁盘空间调整的需求。
          Git使用指南 - Python开发者版UV 最佳实践
          Loading...