摘要:LUKS 是 Linux 发行版默认的块设备加密标准,通过 dm-crypt 完成真实加解密,把主密钥锁在 Header 的 key slot 里。本文讲清它的核心原理(主密钥 + 密钥槽 + KDF)、在存储栈中的位置、开机解锁流程、性能损耗(有 AES-NI 时日常几乎无感),并给出 cryptsetup 常用管理命令、忘记密码的现实边界、LUKS + LVM 标配组合与生产环境最佳实践。一句话:硬盘被拔走也读不到数据,但钥匙(口令 / Header 备份)必须自己管好。
LUKS 磁盘加密
在 Linux 世界里聊"磁盘加密",十有八九说的就是 LUKS。它是目前 Linux 发行版(Debian、Ubuntu、Fedora、Arch 等)默认采用的块设备加密标准,也是服务器、笔记本、云主机数据盘"静态加密"最成熟的开源方案。
1. LUKS 到底是什么
LUKS(Linux Unified Key Setup)不是加密算法,而是一套磁盘加密规范。
真正干加解密活的是 Linux 内核里的 dm-crypt(device-mapper crypt 目标),LUKS 负责的是"密钥怎么存、怎么校验、怎么支持多密码、元数据放哪"这一层管理规范。
一句话定位:
LUKS 决定"这盘怎么算加密盘";dm-crypt 决定"数据怎么加解密";cryptsetup 是用户态管理工具。
常见误区先排掉:
- LUKS ≠ 用户登录密码(登录密码是系统起来之后的事)
- LUKS ≠ 文件加密(它是块设备层加密,文件内容、文件名、权限都由上层文件系统管)
- LUKS ≠ 某个发行版私有方案(它是跨发行版标准)
2. 核心原理:主密钥 + 密钥槽
LUKS 最关键的设计是把"用户口令"和"数据加密密钥"分开。
2.1. 主密钥(Volume Key / Master Key)
格式化加密盘时,系统随机生成一把主密钥,默认 AES-XTS 下一般是 256/512 位。
这把密钥才是真正用来加解密磁盘扇区的。
2.2. 密钥槽(Key Slot)
主密钥不会明文存盘,而是被用户口令派生出的密钥加密后,放进 LUKS Header 的 key slot 里。
- LUKS1:8 个槽
- LUKS2:可到 32 个槽(常见工具里也按多槽管理)
每个槽可以存不同的口令或密钥文件,都能解同一把主密钥。这就是"多密码解锁同一块盘"的原理。
2.3. 口令怎么变成密钥
你输的口令不直接当加密密钥,而是先过 KDF(密钥派生函数):
- LUKS1:PBKDF2
- LUKS2:Argon2id(更抗暴力破解)
流程大概是:
口令 → KDF → KEK(密钥加密密钥)
KEK + LUKS Header → 解出主密钥
主密钥 → dm-crypt 加解密数据
2.4. LUKS Header 是命门
Header 放在加密设备开头,存着:
- LUKS 版本
- cipher / mode(如 aes-xts-plain64)
- KDF 参数、salt
- 各 key slot 状态
- 被加密的主密钥副本
Header 坏了 = 有密码也开不了盘。所以运维里第一铁律是备份 header。
3. 存储栈里的位置
一个典型加密盘从上到下是这样:
文件系统(ext4 / xfs)
↓
LUKS / dm-crypt 加密层
↓
LVM(可选)
↓
物理分区 / 磁盘
写数据:文件系统 → dm-crypt 加密 → 落盘
读数据:从盘读 → dm-crypt 解密 → 给文件系统
对上层应用是透明的,挂载后就像普通块设备,路径一般在 /dev/mapper/xxx。
4. Debian 开机为什么要输"磁盘密码"
启动中间弹个框要输密码,不是登录密码",就是 LUKS 在 initramfs 阶段解锁根分区。

Debian 安装时选「加密 LVM」后实际布局是:
/boot或 EFI 分区:不加密(GRUB 要能读内核和 initramfs)- 根分区所在物理卷:LUKS 加密
- LUKS 之上建 LVM:root / swap / home
启动顺序:
- UEFI/BIOS → GRUB 加载内核 + initramfs
- initramfs 里带
cryptsetup和 dm-crypt 模块 - 读
/etc/crypttab,发现加密设备 - 弹密码提示(Plymouth 图形界面可能不显示文字)
- 口令正确 → 解主密钥 → 映射
/dev/mapper/sdaX_crypt - LVM 起来 → 挂根文件系统 → 继续 boot
- 到登录界面
所以在第 4 步之前,根文件系统根本没挂载,什么单用户模式、改密码、救援模式都进不去------盘还是密文。
5. 性能到底亏多少
现代 CPU 有 AES-NI → 日常几乎无感;老 CPU / 高并发随机 IO → 才明显。
5.1. 有硬件加速(AES-NI)
bash
grep -o aes /proc/cpuinfo | head -1
有输出就说明 CPU 支持硬件 AES。
实测参考(Xeon / 现代桌面 CPU):
- 顺序读写:损耗 5% 以内
- 随机 4K:略高,但一般不构成瓶颈
- CPU 占用上升一点,不卡
5.2. 没有 AES-NI
纯软件算 AES,老赛扬、某些 ARM 盒子、虚拟机没透传时:
- 可能掉 20%~30%
- 高 IO 场景(数据库、消息队列)会感知明显
5.3. NVMe 极速盘
NVMe 读到 3GB/s 以上时,CPU 反而可能追不上盘,加密开销会比 SATA SSD 明显一点。
5.4. 启动速度
解锁本身只多几秒;真正"卡住没提示"通常是 Plymouth 界面或键盘驱动问题,不是加密慢。
性能优化方向(一般用户不用动):
- 确认 AES-NI 开启
- NVMe 可设
noneI/O 调度器 - crypttab 加
discard开 TRIM(有极轻微元数据泄露权衡) - 高并发服务可考虑
no_read_workqueue/no_write_workqueue
6. 常用管理命令(cryptsetup)
只列日常最有用的,别在加密盘上瞎试。
查看信息
bash
sudo cryptsetup luksDump /dev/sda2
sudo cryptsetup status secure
看 cipher、key slot、UUID。
解锁 / 关闭
bash
sudo cryptsetup open /dev/sda2 secure
sudo cryptsetup close secure
解锁后设备出现在 /dev/mapper/secure。
加备用口令
bash
sudo cryptsetup luksAddKey /dev/sda2
先验旧密码,再加新密码,占一个新 key slot。强烈建议至少留两个槽。
用密钥文件(服务器自动解锁)
bash
sudo dd if=/dev/urandom of=/root/luks.key bs=64 count=1
sudo chmod 600 /root/luks.key
sudo cryptsetup luksAddKey /dev/sda2 /root/luks.key
然后 /etc/crypttab:
secure UUID=xxxx /root/luks.key luks
⚠️ keyfile 放同一块加密盘上其实没额外安全,正经用法是放 U 盘或 TPM。
删口令 / 槽
bash
sudo cryptsetup luksRemoveKey /dev/sda2
sudo cryptsetup luksKillSlot /dev/sda2 1
删之前确认还有别的槽能开。
备份 Header(最重要)
bash
sudo cryptsetup luksHeaderBackup /dev/sda2 \
--header-backup-file /root/luks-header.img
存到别的介质。Header 坏掉或有坏块覆盖开头,数据直接没救。
7. 忘记密码怎么办(现实边界)
LUKS 没有后门、没有找回密码、没有单用户绕过。
能解锁的前提只有:
- 还记得任意一个 slot 的口令
- 有 keyfile
- 有对应这块盘的 LUKS Header 备份且当时口令还在
三者皆无 → 数据密码学上不可恢复。
所以"以前同事装的 Debian 现在重启进不去"这种场景:
- 找原安装人问口令 / keyfile
- Live USB 起盘看
luksDump有几个 slot - 没有线索就只能重装(安装时不勾加密)
别反复乱试把思路搞乱,也别信"破解 LUKS"工具。
8. LUKS + LVM 为什么是标配
Debian/Ubuntu 安装器默认就是:
磁盘 → 分区 → LUKS → PV → VG → LV → fs
好处:
- 一块盘一个口令
- /home /var /swap 随便切逻辑卷
- 以后扩容不用重新加密
缺点:
- 启动必须有人/keyfile/TPM 解锁
- 远程服务器重启得配合 dropbear / Clevis+Tang / TPM2
9. 生产环境最佳实践
- 装完系统第一件事:备份 LUKS Header
- 至少两个 key slot:管理员口令 + 离线恢复口令
- 口令 20 位以上,别用键盘布局奇怪的字符(开机时是默认布局)
- 服务器无人值守:用 TPM2 或 dropbear,别把 keyfile 明文丢根分区
- swap 也走加密,否则内存数据可能落盘明文
- 重装前确认 header 备份对应当前主密钥
luksHeaderRestore是毁灭性操作,只对原盘备份用- 退役磁盘:清 key slot 或直接物理销毁
10 一句话总结
LUKS 是 Linux 块设备加密的"标准外壳",用 dm-crypt 做真实加解密,把主密钥锁在 Header 的 key slot 里;开机输的"磁盘密码"就是解 key slot 的口令;有 AES-NI 时性能损耗日常可忽略;但一旦忘密码或 Header 损坏,数据就是设计上不可恢复。
它解决的是**"硬盘被拔走也读不到数据"**这个问题,不是防网络入侵,也不是代替登录账密。
加密的收益是"丢盘不丢数据",代价是"自己也得把钥匙管好"。