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 需要知道这三个基本概念:
- 物理卷 (Physical Volume, PV): 底层的物理存储单元。这通常是整个硬盘(如
/dev/sda,/dev/nvme0n1)或一个硬盘分区(如/dev/sda2,/dev/nvme0n1p3)。你需要先将这些设备初始化为 PV,才能被 LVM 使用。
- 卷组 (Volume Group, VG): 一个或多个 PV 组合成的存储池。你可以把它想象成一个大的虚拟硬盘。例如,你可以将两个 1TB 的硬盘合并成一个 2TB 的 VG。在你的例子中,
ubuntu-vg就是卷组名。
- 逻辑卷 (Logical Volume, LV): 从 VG 中划分出来的、可供使用的“虚拟分区”。你可以根据需要创建任意大小的 LV(只要 VG 中有足够空间),并在其上创建文件系统。LV 的大小可以动态调整。在你的例子中,
ubuntu--vg-ubuntu--lv就是一个挂载在/上的 LV。
它们的关系是:PV -> VG -> LV -> 文件系统
为什么要使用 LVM?(核心优势)
相比传统分区,LVM 提供了显著的优势:
- 无与伦比的灵活性 (Resizing): 这是 LVM 最吸引人的特点。
- 在线扩大: 你可以轻松地扩大 LV 的大小,通常无需卸载文件系统(对于 ext4/xfs 等)。如果 VG 中有可用空间,只需
lvextend和resize2fs/xfs_growfs两条命令即可。 - 缩小 (需谨慎): 缩小 LV 也是可能的(XFS 不支持缩小文件系统),但通常需要先缩小文件系统,并且建议在离线状态下(如 Live CD)操作,以防数据丢失。
- 跨越物理界限: 当 VG 空间不足时,你可以添加新的硬盘(或分区)作为 PV 加入到现有的 VG 中,然后继续扩大 LV。你的根目录
/可以跨越多个物理磁盘!
- 聚合存储空间 (Spanning Disks): 将多个物理磁盘或分区合并到一个 VG 中,创建一个统一的大存储池,简化空间管理。
- 快照 (Snapshots): LVM 允许你为 LV 创建即时的时间点快照。这对于备份前的准备、测试系统更新或回滚操作非常有用,而且创建快照几乎是瞬时的,占用的空间仅为更改的数据量(写时复制)。
- 精简置备 (Thin Provisioning): 允许你创建超额分配的 LV。LV 看似很大,但实际只占用写入数据所需的空间。这在虚拟化等场景中很有用,但需要监控实际使用情况以防 VG 空间耗尽。
- 数据迁移 (PV Migration): 你可以在 VG 保持在线的情况下,将数据从一个 PV(比如一个旧硬盘)迁移到同一 VG 中的另一个 PV(比如一个新硬盘),然后移除旧的 PV。
LVM 最佳实践
仅仅使用 LVM 还不够,遵循一些最佳实践可以让你更安全、更高效地管理存储:
- 提前规划,预留空间: 在创建 VG 时,不要立即将所有空间分配给 LV。在 VG 中保留一部分未分配的空间(比如 10-20%),这样未来需要扩大 LV 时就非常方便,无需立即添加新硬盘。
- 使用有意义的命名: 避免使用系统默认的
lv001,vg_data等。使用描述性的名称,如vg-main,vg-backup,lv-root,lv-home,lv-docker-data。这在你管理多个 LV 和 VG 时至关重要。(你的ubuntu--vg-ubuntu--lv是安装程序默认的,虽然能用,但自己创建时可以更清晰)。
- 将 OS 和数据适当分离: 可以考虑为操作系统 (
/,/boot通常不用 LVM) 创建一个 VG,为用户数据 (/home) 或特定应用数据(数据库、容器卷)创建另一个 VG。或者在同一个 VG 中创建不同的 LV。这有助于管理和备份。
- 定期监控空间: 使用
pvs,vgs,lvs,df -h等命令定期检查 PV、VG 和 LV 的使用情况,特别是在使用精简置备或快照时。
- 备份!备份!备份! LVM 提供了灵活性,但不是备份方案。在进行任何调整大小、迁移等操作前,务必备份重要数据。快照可以辅助备份,但不能替代完整的离线备份。
- 了解文件系统限制: 记住 LVM 调整的是块设备大小,你还需要使用相应的文件系统工具 (
resize2fs,xfs_growfs等) 来调整文件系统。了解你使用的文件系统是否支持在线调整、是否支持缩小等。
- 谨慎使用 LVM on
/boot:/boot分区包含引导加载程序(如 GRUB),它可能无法识别复杂的 LVM 配置。通常建议将/boot放在一个标准的、非 LVM 的分区上。/boot/efi(EFI 系统分区) 也必须是非 LVM 的 FAT32 分区。
- 快照不是永久的: LVM 快照会随着源 LV 的数据变化而增长。如果源 LV 写入频繁,快照会迅速消耗 VG 空间。快照应用于短期目的(备份、测试),使用后应及时删除。
结论
LVM 是 Linux 系统管理员和高级用户强大的存储管理工具。它通过引入抽象层,提供了传统分区无法比拟的灵活性和功能。虽然它增加了一层复杂性,但只要理解了其核心概念并遵循最佳实践,LVM 就能极大地简化磁盘空间的管理,尤其是在需要频繁调整分区大小或管理多个磁盘的环境中。对于服务器和需要长期维护的桌面系统来说,使用 LVM 通常是一个明智的选择。
LVM 实战演练:常见场景与命令运用
理论讲完了,让我们看看在实际工作中,LVM 是如何解决问题的。以下是一些常见的应用场景及其对应的 LVM 操作思路和关键命令。
场景一:根分区 "/" 空间告急,但卷组还有空间
- 场景描述: 你发现服务器的根分区 (
/) 使用率超过 90%,告警不断。通过sudo vgs查看,发现其所在的卷组ubuntu-vg还有不少剩余空间 (Free PE)。
- LVM 解决方案: 在线扩展根分区对应的逻辑卷 (
ubuntu-lv),然后扩展文件系统。
- 关键命令示例:
- 注意事项:
- 执行
resize2fs或xfs_growfs之前,务必确认你的文件系统类型 (lsblk -f或mount | 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 在解决实际存储管理问题时的灵活性和强大功能。通过熟练运用这些命令,你可以更从容地应对各种磁盘空间调整的需求。