luks加密必须作用于已创建的独立分区(如/dev/sdb1),而非整盘(如/dev/sdb),否则会破坏分区表;需用lsblk、fdisk -l确认设备类型,确保未挂载且无文件系统;必须指定luks2、argon2id、--iter-time等参数提升安全性;加密后须cryptsetup open映射并mkfs格式化/dev/mapper/设备,不可直接操作底层分区;自动挂载需配置/etc/crypttab并更新initramfs;务必备份luks header至离线介质。

直接对整个磁盘分区做LUKS加密是可行的,但必须明确:LUKS加密对象是块设备(如/dev/sdb1),不是文件系统,也不是“整个物理盘”(如/dev/sdb)——后者会抹掉分区表,导致无法识别任何分区。真正安全、可维护的做法,是加密一个**已创建好的独立分区**。
怎么确认目标设备是分区而非整盘
误选/dev/sdb而不是/dev/sdb1是最常见致命错误,会导致分区表被覆盖,所有子分区丢失:
- 运行
lsblk,找带“part”后缀或有MOUNTPOINT为空的节点,比如sdb1、sdc2;整盘(如sdb)通常显示为“disk”,且无SIZE列右侧的挂载信息 - 用
sudo fdisk -l /dev/sdb确认它是否已有分区表;若输出含“Device does not contain a recognized partition table”,说明你正对着整盘操作,立刻中止 - 检查是否已被挂载:
mount | grep sdb1应无输出;若有,先sudo umount /dev/sdb1 - 验证是否干净:
sudo blkid /dev/sdb1应返回空(无TYPE/UUID),否则需先sudo wipefs -a /dev/sdb1
为什么必须用 LUKS2 + argon2id + 显式参数
默认cryptsetup luksFormat仍可能回退到LUKS1或弱PBKDF,对长期存储敏感数据的分区不安全:
-
--type luks2强制启用新格式,支持JSON元数据、密钥槽状态校验、抗头部损坏(意外断电后仍可恢复) -
--pbkdf argon2id替代默认pbkdf2,显著提升GPU暴力破解成本;LUKS1不支持此算法 -
--iter-time 5000(日志盘建议7500)控制密钥派生耗时,太低(如1000)易被离线爆破,太高(>10000)影响日常解锁体验 -
--cipher aes-xts-plain64 --key-size 512显式声明,避免LUKS2在某些内核下回退到aes-cbc-essiv或256位密钥
加密后不能直接写文件——必须映射+格式化
LUKS容器只是加密层,本身不提供文件系统。跳过cryptsetup open和mkfs就往/dev/sdb1写日志或数据,会导致静默失败或写入明文裸设备(完全不可读):
- 解锁映射:
sudo cryptsetup open /dev/sdb1 mydata,生成/dev/mapper/mydata - 格式化映射设备:
sudo mkfs.ext4 /dev/mapper/mydata(别对/dev/sdb1直接格式化!) - 挂载使用:
sudo mkdir -p /mnt/secure && sudo mount /dev/mapper/mydata /mnt/secure - 验证是否生效:往
/mnt/secure写文件后,sudo umount /mnt/secure && sudo cryptsetup close mydata,再重新open/mount确认内容完整
/etc/crypttab 配置自动解密的关键细节
想开机自动挂载,仅靠/etc/fstab不够——必须让initramfs在根文件系统加载前就解密设备:
- 先获取UUID:
sudo blkid /dev/sdb1,复制UUID=...那段(不是PARTUUID) - 编辑
/etc/crypttab,添加:mydata UUID=xxx-xxx none luks,discard(none表示手动输密码;如用密钥文件,填/root/keyfile路径) -
discard对SSD必要,否则TRIM无法穿透加密层,影响寿命;但若密钥文件存于/boot(未加密),绝不能用——密钥文件权限必须0400且存放于加密根分区内 - 最后更新initramfs:
sudo update-initramfs -u(Debian/Ubuntu)或sudo dracut -f(RHEL/Fedora)
最容易被忽略的是LUKS header备份——它一旦损坏,密钥再强也无力回天。sudo cryptsetup luksHeaderBackup /dev/sdb1 --header-backup-file /root/sdb1-header.bak之后,务必把该文件拷贝到U盘离线保存。没有它,硬盘就是一块砖。











