加密前须确认硬盘未挂载且无重要数据,否则cryptsetup luksFormat将不可逆清空内容;务必用lsblk、mount、fdisk -l等命令精准识别分区设备(如/dev/sdb1),避免误选整盘或已挂载设备;LUKS2格式推荐显式指定argon2id、5000ms迭代、aes-xts-plain64与512位密钥;加密后需cryptsetup open映射再mkfs格式化,严禁直接对加密设备写文件系统;自动挂载依赖/etc/crypttab与/etc/fstab严格匹配配置;LUKS header备份至关重要,须离线保存。

加密前必须确认硬盘未被挂载且无重要数据
直接对已挂载或含数据的分区执行 cryptsetup luksFormat 会彻底清空内容,且不可逆。务必先用 lsblk 和 mount 确认目标设备(如 /dev/sdb1)未出现在挂载列表中;若曾用作系统盘或数据盘,需提前备份。常见误操作是把 /dev/sdb(整盘)和 /dev/sdb1(分区)搞混——LUKS 加密对象是块设备,不是文件系统,所以加密的是分区设备节点本身。
- 用
sudo fdisk -l或sudo blkid明确识别目标分区路径,避免选错盘符 - 若该分区已有文件系统(如 ext4),
luksFormat会覆盖其 superblock,后续无法直接恢复 - 不建议在系统盘(如
/dev/nvme0n1p2)上直接操作,除非你正在配置全盘加密启动系统
执行 luksFormat 并设置密钥强度
cryptsetup luksFormat 是核心命令,但默认参数偏保守。现代硬件建议显式指定更安全的 PBKDF 迭代次数和 AES 模式:
sudo cryptsetup luksFormat --type luks2 \ --pbkdf argon2id \ --iter-time 5000 \ --cipher aes-xts-plain64 \ --key-size 512 \ /dev/sdb1
-
--type luks2强制使用 LUKS2 格式,支持 Argon2、密钥槽管理、JSON 元数据等关键特性 -
--pbkdf argon2id替代默认的 pbkdf2,抗 GPU 暴力破解能力更强 -
--iter-time 5000表示密钥派生耗时约 5 秒(非固定迭代数),值太低(如 1000)会削弱安全性,太高(如 10000)影响日常解锁体验 - 别省略
--cipher和--key-size:LUKS2 默认仍可能回退到较弱组合,显式声明可规避风险
打开加密卷并格式化为文件系统
LUKS 加密后只是“锁住”的容器,需用 cryptsetup open 解锁映射为一个逻辑设备(如 /dev/mapper/secure-disk),再在其上创建文件系统:
sudo cryptsetup open /dev/sdb1 secure-disk sudo mkfs.ext4 /dev/mapper/secure-disk sudo mkdir -p /mnt/secure sudo mount /dev/mapper/secure-disk /mnt/secure
- 映射名(
secure-disk)不能含斜杠或点,只建议用小写字母+短横线 - 挂载前确保目标目录存在且为空;若之前挂载过其他设备,先
umount /mnt/secure再操作 - 不要对
/dev/sdb1直接mkfs—— 此时它已是加密头,写入会破坏 LUKS header - ext4 是稳妥选择;若需跨平台读写,注意 NTFS/FAT 不支持 LUKS 层,只能加密整个分区后在其上建 Linux 文件系统
自动挂载需配置 /etc/crypttab 和 /etc/fstab
重启后加密卷不会自动解锁,需靠 /etc/crypttab 触发解密,再由 /etc/fstab 挂载。两文件顺序和字段必须严格匹配:
# /etc/crypttab secure-disk /dev/sdb1 none luks,discard
# /etc/fstab /dev/mapper/secure-disk /mnt/secure ext4 defaults,x-systemd.device-timeout=30 0 2
-
none表示交互式输入密码;若要用 keyfile,需指定绝对路径(如/root/keyfile.bin),并设权限chmod 000 /root/keyfile.bin -
luks,discard启用 TRIM(对 SSD 有益),但仅当 SSD 支持且你信任物理介质不被他人接触时才开启 -
x-systemd.device-timeout=30防止 USB 外置盘因连接延迟导致开机卡住;内置于主板的 SATA/NVMe 盘可省略 - 修改后运行
sudo systemctl daemon-reload并测试:先sudo umount /mnt/secure,再sudo systemctl restart systemd-cryptsetup@secure-disk.service
LUKS header 一旦损坏就几乎无法恢复,备份它比备份数据还重要:sudo cryptsetup luksHeaderBackup /dev/sdb1 --header-backup-file luks-header-sdb1.bak。这个文件要离线存好,它不包含密钥,但丢了就等于锁死整个分区。


















