磁盘方案进阶(LVM/LUKS)

同一个 Linux 根目录,底下可能只是一块普通分区,也可能依次经过磁盘加密、LVM 和文件系统。只有先认清每一层,才能回答两个不同问题:空间怎样弹性分配,以及设备离线时数据怎样保密

本文定位是“基本认知与只读识别”。它不会让你在工作磁盘上执行 pvcreatecryptsetup luksFormat;这两条命令都会改写目标设备元数据,选错盘可能直接造成数据损失。

ℹ️ 阅读指南
  • 适合谁:理解分区、文件系统和挂载点,准备阅读安装器存储选项的读者。
  • 学完能做什么:画出“块设备—加密映射—PV—VG—LV—文件系统—挂载点”层级,解释 LVM 与 LUKS 各自解决什么问题,并选择正确的只读诊断入口。
  • 环境:概念适用于使用 device-mapper、LVM2 与 cryptsetup 的主流 Linux;命令按截至 2026-07 的上游工具与 RHEL 10 文档核验。具体安装器默认布局因发行版和版本而异。
  • 前置条件:只读观察不需要备份;任何创建、扩容、缩容或 Header 恢复都应另开虚拟机/一次性镜像,并先备份数据与元数据。
  • 时间与成功证据:阅读约 20 分钟,观察练习约 10 分钟;你应交付一张本机存储层级图和一份不含私密标识的命令输出。

1. 两种工具解决两类问题

1.1 LVM:在块设备层重新分配空间

Logical Volume Manager(逻辑卷管理器,LVM)位于文件系统之下。它把一个或多个块设备初始化为 PV,再汇入 VG 空间池,最后切分成 LV。文件系统建立在 LV 之上:

磁盘或分区
└── PV(Physical Volume,物理卷)
    └── VG(Volume Group,卷组/空间池)
        └── LV(Logical Volume,逻辑卷)
            └── ext4 / XFS / 其他文件系统
                └── /、/home 或其他挂载点

“VG 像仓库、LV 像从仓库划出的房间”有助于理解扩容,但边界在于:LVM 管的是块地址与 extent,不理解里面的文件。扩大 LV 并不必然扩大其上的文件系统;缩小更不能只改一层。

负责什么常用只读观察
PV把块设备纳入 LVMpvs
VG汇总 PV 的可分配 extentvgs
LV从 VG 提供块设备lvs
文件系统组织文件与目录lsblk -ffindmnt

1.2 LUKS:管理 dm-crypt 的磁盘加密元数据

Linux Unified Key Setup(LUKS)是 cryptsetup 管理的磁盘加密格式。LUKS Header 保存格式参数、密钥槽和解锁所需元数据;成功解锁后,device-mapper 暴露一个明文块设备映射,文件系统或 LVM 才能在其上工作。

LUKS 容器(磁盘上是密文)
└── /dev/mapper/<mapping-name>(解锁后的明文块设备)
    └── LVM 或文件系统

“加密保险箱”这个比喻只描述设备处于关机、锁定状态时的保护。系统解锁后,拥有相应权限的进程、恶意软件或已登录用户仍可能读取数据;LUKS 也不会隐藏分区大小、访问时间模式或未加密 ESP 的内容。


2. 常见组合与边界

2.1 LVM on LUKS

磁盘/分区
└── LUKS
    └── 解锁映射
        └── PV → VG → 多个 LV
            └── 文件系统 / Swap

一次解锁后,可在密文边界内管理多个 LV。这是常见安装布局之一,但不是所有发行版的唯一方案。

2.2 LUKS on LVM

磁盘/分区
└── PV → VG → LV
    └── LUKS
        └── 解锁映射
            └── 文件系统

这种组合可分别加密某些 LV,代价是每个容器需要独立管理,且 LVM 元数据和 LV 结构位于加密层之外。选择依据应是威胁模型、解锁流程和运维需求,不是“哪一种更极客”。

2.3 “全盘加密”通常仍有未加密边界

UEFI 系统需要固件能读取 EFI System Partition(ESP),因此 ESP 通常不在根 LUKS 容器内。/boot 是否加密则取决于引导器、发行版集成和所用功能。

常见的“开机输入密码”并不总是 GRUB 在解锁:

  • 如果引导器本身必须读取加密的 /boot,可能由 GRUB 等引导器先解锁。
  • 更常见的未加密 /boot + 加密根布局中,内核与 initramfs 已由引导器加载,随后由 initramfs 中的 cryptsetup/systemd 组件解锁根设备。

因此看到密码提示的位置与样式不能单独证明是哪一层在工作。应检查引导配置、initramfs 和 /etc/crypttab,而不是一概写成“GRUB 解锁整盘”。


3. 只读画出本机存储栈

先查看块设备树、文件系统与挂载关系:

lsblk -o NAME,PATH,TYPE,SIZE,FSTYPE,FSVER,MOUNTPOINTS
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS

TYPE 常见值包括 partcryptlvm。同一设备可能出现在多层树中;不要只凭 /dev/sdX/dev/nvme... 名字判断作用。

如果系统安装了 LVM2,下面三条是显示命令,不会创建或扩容卷:

sudo pvs -o pv_name,vg_name,pv_size,pv_free
sudo vgs -o vg_name,vg_size,vg_free
sudo lvs -o vg_name,lv_name,lv_size,lv_attr,devices

如果 lsblk 显示 crypt 行,先从 NAME 列取得真实映射名,再查询状态:

sudo cryptsetup status <mapping-name>
sudo dmsetup ls --tree

<mapping-name> 是占位符,例如应来自 lsblk,不能连同尖括号直接复制。cryptsetup status 只查询已打开映射;返回 inactive 可能只是名字不对或容器尚未打开,并不表示磁盘未加密。

3.1 如何读一条链

假设 lsblk 树表现为“分区 → crypt → lvm”,再结合 lvsfindmnt,你才能得出:该分区承载 LUKS,解锁映射作为 LVM PV,某个 LV 上的文件系统挂载到了 /。单独一个命令通常看不全所有层。


4. 扩容为什么必须逐层完成

对典型 LVM 文件系统,扩容方向是从下到上:底层先有空闲空间,LV 变大,最后文件系统使用新增块。每一步都需要各自的验证。

确认底层容量 → 确认 VG free → 扩大 LV → 扩大文件系统 → 验证挂载容量

本文不提供可直接复制到真实系统的扩容命令,因为正确操作依赖 LV 类型、文件系统、挂载状态、备份与停机窗口。不过你应能识别工具边界:

文件系统常见增长工具重要边界
ext4resize2fs <block-device>可在线增长;离线缩小前需检查文件系统,且必须先缩文件系统再缩 LV
XFSxfs_growfs <mountpoint>在线增长,目标是挂载点;XFS 不支持缩小

lvextend 只扩大 LV;resize2fs 只适用于 Ext 系列,不能用于 XFS。即便某些 lvextend 选项能联动文件系统工具,也必须先确认工具支持的文件系统和失败处理。

⚠️ 可在线扩容不等于无需备份

断电、设备错误、选错 LV、快照池耗尽或文件系统工具失败仍可能造成停机或数据损失。扩容前应至少记录 pvs/vgs/lvs/findmnt 输出,验证备份,并为关键系统准备救援路径。缩容风险更高,不属于本文范围。


5. LUKS 威胁模型与 Header 边界

LUKS 主要保护设备丢失、被拆走或关机状态下的静态数据。它不能替代:

  • 登录口令、最小权限和安全更新;
  • 对已解锁系统的恶意软件防护;
  • 独立数据备份;
  • Secure Boot 或其他启动链完整性措施。

忘记所有有效解锁凭据通常无法“找回密码”。LUKS Header 损坏也可能让仍在磁盘上的密文无法解锁,因此专业运维会考虑 Header 备份。但 Header 备份有三条边界:

  1. 它不能恢复用户文件,不是数据备份。
  2. 它必须与数据备份分开、加密保管;泄露会扩大离线口令猜测和旧密钥槽恢复的风险。
  3. luksHeaderRestore 会覆盖目标 Header,选错设备或恢复不匹配版本可能让情况更糟,应在专门的恢复流程中先核对 UUID、格式和备份来源。

本文因此只让你检查 Header 元数据,不执行备份或恢复。先从 lsblk -f 找到疑似 crypto_LUKS 的真实设备,再运行:

sudo cryptsetup luksDump /dev/<confirmed-luks-device>

这条命令读取 LUKS 元数据,不会显示解锁口令。/dev/<confirmed-luks-device> 必须替换为已确认的设备;若无法确认,停在 lsblk 阶段。

cryptsetup benchmark 则只测试本机算法吞吐,不读取或改变磁盘:

cryptsetup benchmark

基准结果不能直接换算成真实工作负载损耗;CPU、内核、加密参数、存储和 I/O 模式都会影响体验,因此不要写成固定“低于 5%”。


6. 常见故障:先诊断,再决定是否改动

症状常见原因安全诊断下一步决策
pvs 看不到预期设备它不是 PV、LUKS 尚未解锁或过滤规则排除了设备lsblk -fsudo dmsetup ls --treesudo pvs -a先确认层级;不要对未知设备运行 pvcreate
VG 没有可用空间PV 已分配完,或看错 VGsudo vgs -o vg_name,vg_size,vg_free先规划新增底层容量;不要只执行 lvextend
LV 变大但 df 未变只扩了 LV,文件系统未增长sudo lvsfindmnt -no SOURCE,FSTYPE,TARGET <mountpoint>df -hT <mountpoint>按真实文件系统选择增长工具和维护窗口
cryptsetup status 显示 inactive映射名错误或映射未打开lsblk -o NAME,TYPE,FSTYPE,MOUNTPOINTSsudo dmsetup ls --tree使用已发现的真实映射名;不要反复猜口令
启动时没有解锁提示或找不到根设备initramfs、内核参数、crypttab 或设备标识不一致从救援环境读取 /etc/crypttab、引导参数和 initramfs 日志保留只读证据,按发行版恢复文档处理;不要重建 Header
正确口令突然全部失效键盘布局、设备选错、Header 或介质故障检查键盘布局;lsblk -f;只读保存 cryptsetup luksDump 与内核日志停止写盘,使用验证过的 Header/数据备份或求助专业恢复

当设备出现 I/O error、SMART/介质告警或 Header 异常时,优先停止写入和制作可验证镜像。不要把 luksFormatluksHeaderRestorepvcreate 当作修复命令。


7. 安全且可观察的练习

练习输出可能包含设备 UUID、主机命名或卷名。公开截图前请打码,但不要在本地原始记录中混淆不同设备。

练习 1 画出本机层级 运行 lsblk、pvs/vgs/lvs 与 findmnt,画出从物理设备到一个挂载点的完整路径。若本机未使用 LVM/LUKS,也把“直接分区 → 文件系统 → 挂载点”如实画出。
练习 2 区分两种组合 分别画出 LVM on LUKS 与 LUKS on LVM,圈出每种布局中处于密文边界内的元数据。验收标准是能解释为什么两者的解锁和运维方式不同。
练习 3 做无磁盘性能观察 保存 cryptsetup benchmark 输出,并注明它只衡量算法吞吐,不代表真实磁盘性能。练习不要求系统存在 LUKS 设备。
练习 4 制作扩容决策表 任选一个现有挂载点,只读记录其 source、文件系统、LV 大小和 VG free。写出“若要扩容,还缺哪些确认”,不要执行 lvextend、resize2fs 或 xfs_growfs。

8. 小结与下一站

现在你应能把 LVM 视为块空间抽象,把 LUKS 视为带密钥管理的加密容器,并沿着真实设备树判断谁在谁之上。你也知道:扩大 LV 与扩大文件系统是两步,XFS 与 ext4 工具不同;启动时的解锁可能发生在引导器,也可能发生在 initramfs。

下一篇阅读 安装本质探索:它会把这些存储层放回完整安装流程,说明挂载、部署 rootfs、chroot、initramfs 与引导写入的先后关系。

核验资料(截至 2026-07)


修订记录

2026-02-24 初版发布 介绍 LVM 与 LUKS 的用途和常见组合。
2026-07-21 实质修订 将文章收敛为基础认知与只读识别,补充准确存储层级、威胁模型、引导解锁边界、文件系统扩容差异、故障诊断与安全练习。
Navigation