磁盘方案进阶(LVM/LUKS)
同一个 Linux 根目录,底下可能只是一块普通分区,也可能依次经过磁盘加密、LVM 和文件系统。只有先认清每一层,才能回答两个不同问题:空间怎样弹性分配,以及设备离线时数据怎样保密。
本文定位是“基本认知与只读识别”。它不会让你在工作磁盘上执行 pvcreate 或 cryptsetup 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 | 把块设备纳入 LVM | pvs |
| VG | 汇总 PV 的可分配 extent | vgs |
| LV | 从 VG 提供块设备 | lvs |
| 文件系统 | 组织文件与目录 | lsblk -f、findmnt |
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,OPTIONSTYPE 常见值包括 part、crypt 和 lvm。同一设备可能出现在多层树中;不要只凭 /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”,再结合 lvs 与 findmnt,你才能得出:该分区承载 LUKS,解锁映射作为 LVM PV,某个 LV 上的文件系统挂载到了 /。单独一个命令通常看不全所有层。
4. 扩容为什么必须逐层完成
对典型 LVM 文件系统,扩容方向是从下到上:底层先有空闲空间,LV 变大,最后文件系统使用新增块。每一步都需要各自的验证。
确认底层容量 → 确认 VG free → 扩大 LV → 扩大文件系统 → 验证挂载容量本文不提供可直接复制到真实系统的扩容命令,因为正确操作依赖 LV 类型、文件系统、挂载状态、备份与停机窗口。不过你应能识别工具边界:
| 文件系统 | 常见增长工具 | 重要边界 |
|---|---|---|
| ext4 | resize2fs <block-device> | 可在线增长;离线缩小前需检查文件系统,且必须先缩文件系统再缩 LV |
| XFS | xfs_growfs <mountpoint> | 在线增长,目标是挂载点;XFS 不支持缩小 |
lvextend 只扩大 LV;resize2fs 只适用于 Ext 系列,不能用于 XFS。即便某些 lvextend 选项能联动文件系统工具,也必须先确认工具支持的文件系统和失败处理。
断电、设备错误、选错 LV、快照池耗尽或文件系统工具失败仍可能造成停机或数据损失。扩容前应至少记录 pvs/vgs/lvs/findmnt 输出,验证备份,并为关键系统准备救援路径。缩容风险更高,不属于本文范围。
5. LUKS 威胁模型与 Header 边界
LUKS 主要保护设备丢失、被拆走或关机状态下的静态数据。它不能替代:
- 登录口令、最小权限和安全更新;
- 对已解锁系统的恶意软件防护;
- 独立数据备份;
- Secure Boot 或其他启动链完整性措施。
忘记所有有效解锁凭据通常无法“找回密码”。LUKS Header 损坏也可能让仍在磁盘上的密文无法解锁,因此专业运维会考虑 Header 备份。但 Header 备份有三条边界:
- 它不能恢复用户文件,不是数据备份。
- 它必须与数据备份分开、加密保管;泄露会扩大离线口令猜测和旧密钥槽恢复的风险。
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 -f;sudo dmsetup ls --tree;sudo pvs -a | 先确认层级;不要对未知设备运行 pvcreate |
| VG 没有可用空间 | PV 已分配完,或看错 VG | sudo vgs -o vg_name,vg_size,vg_free | 先规划新增底层容量;不要只执行 lvextend |
LV 变大但 df 未变 | 只扩了 LV,文件系统未增长 | sudo lvs;findmnt -no SOURCE,FSTYPE,TARGET <mountpoint>;df -hT <mountpoint> | 按真实文件系统选择增长工具和维护窗口 |
cryptsetup status 显示 inactive | 映射名错误或映射未打开 | lsblk -o NAME,TYPE,FSTYPE,MOUNTPOINTS;sudo dmsetup ls --tree | 使用已发现的真实映射名;不要反复猜口令 |
| 启动时没有解锁提示或找不到根设备 | initramfs、内核参数、crypttab 或设备标识不一致 | 从救援环境读取 /etc/crypttab、引导参数和 initramfs 日志 | 保留只读证据,按发行版恢复文档处理;不要重建 Header |
| 正确口令突然全部失效 | 键盘布局、设备选错、Header 或介质故障 | 检查键盘布局;lsblk -f;只读保存 cryptsetup luksDump 与内核日志 | 停止写盘,使用验证过的 Header/数据备份或求助专业恢复 |
当设备出现 I/O error、SMART/介质告警或 Header 异常时,优先停止写入和制作可验证镜像。不要把 luksFormat、luksHeaderRestore 或 pvcreate 当作修复命令。
7. 安全且可观察的练习
练习输出可能包含设备 UUID、主机命名或卷名。公开截图前请打码,但不要在本地原始记录中混淆不同设备。
8. 小结与下一站
现在你应能把 LVM 视为块空间抽象,把 LUKS 视为带密钥管理的加密容器,并沿着真实设备树判断谁在谁之上。你也知道:扩大 LV 与扩大文件系统是两步,XFS 与 ext4 工具不同;启动时的解锁可能发生在引导器,也可能发生在 initramfs。
下一篇阅读 安装本质探索:它会把这些存储层放回完整安装流程,说明挂载、部署 rootfs、chroot、initramfs 与引导写入的先后关系。
核验资料(截至 2026-07)
- Red Hat Enterprise Linux 10:Configuring and managing logical volumes
- Red Hat Enterprise Linux 10:ext4 与 XFS 工具对比
- cryptsetup 官方 FAQ
- systemd crypttab 官方手册
- util-linux lsblk(8)