1. 前言与设计思路
在 Windows 11 与 Arch Linux 双系统环境下,为了确保数据安全,我们通常会保留 Windows 对数据盘(如 D 盘)的 BitLocker 加密。然而,每次进入 Linux 都需要手动输入密码解锁分区非常繁琐。
本文将介绍如何利用 Linux 的 cryptsetup 工具,配合密钥文件实现开机自动解锁并挂载 BitLocker 分区。
核心设计思路:
利用“信任链”传递安全性。作者的 Arch Linux 系统分区已通过 LUKS 加密,并由 TPM 芯片实现开机自动解锁。我们将 BitLocker 的解锁凭证(纯文本密码)存储在经过 LUKS 加密的 /etc/ 目录下。
- 启动流程: TPM 自动解锁 LUKS 系统分区 > 系统读取
/etc/bitlocker_key> 自动解锁 BitLocker 数据分区。
重要提示:
- 在进行任何加密分区操作前,请务必备份重要数据。
- 请务必将 BitLocker 的 48 位恢复密钥 (Recovery Key) 导出并保存到外部存储介质(如 U 盘,而非云端),这是数据恢复的最后一道防线。如果丢失,数据将永久无法找回。
- 同样建议备份 Linux LUKS 分区的 Header,以防分区损毁。
2. 技术原理:为什么这样可行?
要理解这个方案,需要先了解 BitLocker 和 Linux dm-crypt 的工作机制。
BitLocker 的加密结构:
- 全卷加密密钥 (FVEK):实际用于加密磁盘数据的对称密钥(AES-CBC 或 AES-XTS)。它被加密存储在卷头中。
- 卷主密钥 (VMK):用于加密 FVEK。
- 密钥保护器 (Key Protectors):用户解锁的凭证(如 TPM、PIN、用户密码、恢复密钥)。用户验证通过后,解密 VMK,进而解密 FVEK。
Linux 下的限制与解决方案:
在 Linux 下,cryptsetup 的 bitlk 扩展目前不支持 TPM 或智能卡保护器,因为这涉及复杂的 PCR 状态验证,难以在 Linux 启动早期标准化。因此,我们必须依赖 用户密码 (User Password) 或 恢复密钥。
当 cryptsetup 使用 bitlk 模式打开设备时,它在用户态解密 VMK 和 FVEK,然后调用内核的 device-mapper 接口创建一个虚拟块设备。对该设备的读写操作会被内核自动加解密,对上层文件系统(如 NTFS)完全透明。
3. 操作步骤
第一步:准备解锁密钥
我们需要创建一个包含 BitLocker 解锁密码的文本文件。这应该是您在 Windows 下为该驱动器设置的“用户密码”(或者您也可以使用恢复密钥,但密码管理更灵活)。我们可以生成一个高强度密码将密码保存在TXT文件中,然后通过U盘复制到Linux下。建议把Recovery Key保存在U盘中,不使用微软云储存这样安全性更高。

通常,在安装或者从家庭版升级到Windows11专业版。Windows11会自动加密所有可以加密的NTFS分区。并把主密匙处于BitLocker Provisioning状态,也就是Clear Key。但此时虽然你可以无需密码访问它,但不能再Linux下直接按照NTFS挂载。

在此之前,您需要重启到Arch Linux下进行操作。
# 创建密钥文件并写入密码
sudo touch /etc/bitlocker_key
# 建议使用编辑器写入,避免密码留在历史记录中
sudo nano /etc/bitlocker_key
文件内容示例:
YourHighStrengthPasswordHere
关键安全设置: 修改文件权限,防止普通用户读取。
sudo chmod 600 /etc/bitlocker_key
第二步:获取分区 UUID
我们需要找到被 BitLocker 加密的分区的 UUID。
lsblk -f
输出示例:
NAME FSTYPE LABEL UUID
...
└─nvme0n1p3 BitLocker Data_Drive 2c1e6544-edd8-412f-94ae-d03afe85a4d1
记下 nvme0n1p3 对应的 UUID:2c1e6544-edd8-412f-94ae-d03afe85a4d1。
第三步:配置 /etc/crypttab (自动解锁)
crypttab 负责在系统启动时调用 cryptsetup 解锁设备。
编辑文件:
sudo nano /etc/crypttab
在文件末尾添加一行:
# <映射名称> <设备UUID> <密钥路径> <模式>
win_data_d UUID=2c1e6544-edd8-412f-94ae-d03afe85a4d1 /etc/bitlocker_key bitlk
第四步:配置 /etc/fstab (自动挂载)
分区解锁后,系统会将其映射为 /dev/mapper/win_data_d。接下来通过 fstab 将其挂载到指定目录。
编辑文件:
sudo nano /etc/fstab
在文件末尾添加一行:
# <设备路径> <挂载点> <文件系统> <参数> <Dump> <Pass>
/dev/mapper/win_data_d /mnt/win_data_d ntfs3 uid=1000,gid=1000,dmask=022,fmask=133,iocharset=utf8,prealloc,nofail 0 0
参数详解(针对 NTFS3 驱动优化):
- ntfs3:使用 Linux 5.15+ 内核自带的高性能 NTFS 驱动,而非旧的 FUSE (ntfs-3g)。
- uid=1000,gid=1000:将 NTFS 分区的所有权强制映射为当前用户(通常 UID 1000)。解决了 Linux 下 NTFS 分区默认只有 root 可写的问题。
- dmask=022 / fmask=133:
dmask=022> 目录权限 755 (rwxr-xr-x)。fmask=133> 文件权限 644 (rw-r–r–)。- 作用:防止 Windows 的
.exe或.dll文件在 Linux 下显示为可执行文件,保持界面整洁并增强安全性。
- iocharset=utf8:确保中文文件名正常显示。
- prealloc:写入时预分配空间,减少碎片,优化 HDD 性能并减少 SSD 写入放大。
- nofail:至关重要。如果解密失败或分区不存在,系统将忽略此错误继续启动,避免进入紧急模式(Emergency Mode)。
4. 验证与应用
在重启之前,必须验证配置是否正确,否则可能导致无法开机。
1. 重载 systemd 配置:
sudo systemctl daemon-reload
2. 测试解密服务:
# systemd 会根据 crypttab 自动生成对应的服务
sudo systemctl start systemd-cryptsetup@win_data_d.service
如果没有报错,说明密码正确,分区已成功解密映射到 /dev/mapper/win_data_d。
3. 测试挂载:
sudo mkdir -p /mnt/win_data_d
sudo mount -a
运行 df -h 查看分区是否已正确挂载。


如果一切顺利,您可以重启系统,享受无缝的双系统数据共享体验。