最近我手里有个比较急的活:一台服务器的第二块硬盘是Windows那边BitLocker加密过的,需要我在Linux环境里把数据捞出来。一开始想着直接挂载,结果内核根本认不出来,报错信息也没头没尾。后来查了一圈,发现能处理这个场景的工具不多,最常用的就是Dislocker。折腾完这个事之后,我觉得有必要把这套工具的底层逻辑彻底理一遍,因为只看命令不看原理,很容易在“密钥对不上”“解密出来乱码”“挂载失败”这些坑里浪费时间。这篇文章就从Dislocker的核心架构切入,把BitLocker加密分区在Linux下从识别、解密到FUSE挂载的完整实现原理讲清楚。
想看懂Dislocker,首先要理解一个前提:BitLocker加密的不是单个文件,而是整个卷。Windows系统里,解锁过程由系统驱动完成,Linux内核没有这部分实现,所以我们需要一个用户态工具来“模拟”解锁后的数据流。Dislocker的定位就是这个角色——它解析BitLocker的卷头,拿到用户提供的密钥,解密出真正的加密密钥,然后把解密后的字节流通过FUSE协议暴露出来,让系统可以像访问普通分区一样去读里面的文件系统。整个过程听起来简单,但里面涉及到的分区布局、密钥层级、密码学算法选型和FUSE桥接机制,每一个环节都值得拆开细看。这篇文章适合两类读者:一类是像我一样遇到“Linux读BitLocker盘”实际需求的运维和开发,另一类是对加密存储结构感兴趣的底层爱好者。读完你会知道Dislocker为什么这么设计,也知道遇到问题该从哪里开始排查。
1. 为什么需要Dislocker:Linux读取BitLocker分区的痛点
1.1 BitLocker加密的基本机制与Windows侧实现
很多第一次接触BitLocker的人以为它就是“把硬盘用AES加密一遍”,实际上远不止这么简单。BitLocker采用的是“卷级加密”,也就是对整个分区扇区逐一加密,同时它还内置了一套密钥保护体系。Windows在启用BitLocker时,会生成两个关键密钥:一个是全卷加密密钥(FVEK),真正用来加解密扇区数据;另一个是卷主密钥(VMK),用于保护FVEK。VMK本身并不会直接暴露在明文里,它会被若干“保护器”加密后存在卷头(Volume Header)中。
保护器就是你平时看到的解锁凭据:用户密码、恢复密钥(48位数字串)、TPM芯片存储信息、PIN码,甚至可以是智能卡。Windows在启动或解锁时,会拿其中一个保护器去解开VMK,再拿VMK解开FVEK,最后用FVEK逐扇区解密数据。这套分层的意义很明显——用户密码改了不用重新加密整个卷,只要重新用新密码加密一下VMK就行。无论你选哪种解锁方式,最终都要能还原出FVEK,否则硬盘就是一堆密文。
从文件系统视角看,BitLocker加密卷里的数据并不是全盘都被加密的,因为Windows有启动引导区和元数据需要明文读取。卷头、一些引导文件、卷元数据区域可能保持明文或者用特殊的未加密扇区存放。Dislocker要做的第一件事,就是在这些混杂的字节流里找到卷头并解出密钥结构,这就是下文要讲的内容。
1.2 Linux下访问BitLocker分区的传统困境
Linux系统一直没有原生的BitLocker支持,最直接的原因是微软没有公开全部规范,而且BitLocker的卷头结构和密钥传递机制比较复杂。内核社区的ntfs3、通用的dm-crypt等工具都无法直接解BitLocker,因为dm-crypt面对的是LUKS等各种自己定义的元数据,而BitLocker用的是另一套“FVE-FS”魔术串和密钥布局。
早期社区有一些实验性项目,比如libbde,也能读一部分BitLocker卷,但libbde的完整度、更新频率和易用性都不够理想。我在实际测试中感觉,libbde对恢复密钥的支持比较弱,而且很少维护。Dislocker之所以成为事实标准,除了它的解析逻辑清晰,还有一点很关键:它提供了完整的FUSE挂载方案,解密后可以直接以文件系统形式出现在目录树中,不需要先把整块加密盘导出成镜像再处理。对于“要从加密盘里拷出几个文件”这种场景,Dislocker是最顺手的。
传统困境的根源在于“操作系统没内置驱动,就得靠用户态模拟”。用户态模拟又必须解决两个问题:一是密钥怎么来,二是解密后的文件系统怎么交给内核。Dislocker的架构正好分别对应这两个问题——底层用加密算法库解析密钥,上层用FUSE把解密后的数据流“喂”给内核。理解了这条主线,后面的架构拆解就顺理成章。
2. Dislocker整体架构与核心模块划分
2.1 工具链组成:dislocker与dislocker-fuse
在Dislocker的世界里,有几个不同的可执行文件和解耦概念。最早期的版本是用Ruby脚本调用FUSE库,后来项目重构成了C语言实现,性能更强、依赖更少。现代Dislocker的核心可执行文件通常就叫dislocker,它还有一个配套的dislocker-fuse辅助入口。
从实际功能上区分,dislocker可以做两件事:一是以“元数据模式”运行,只解析卷头、验证密钥、导出解密后的密钥参数;二是以“loopback模式”运行,把解密后的整个卷暴露为一个raw设备镜像,也就是--后面跟一个文件路径。dislocker-fuse则直接以FUSE挂载方式把解密后的内容挂成一个虚拟目录。在命令形式上,常见的用法是:
sudo dislocker /dev/sdb1 -p'MyPassword' -- /mnt/bitlocker这个命令中,/dev/sdb1是加密分区的设备节点,-p指定密码,--后面的/mnt/bitlocker是Dislocker的FUSE挂载点。注意,这个挂载点里面并不是你最终想要的文件——它只是一个“解密后的raw分区视图”。在这个挂载点下,Dislocker会生成一个名为dislocker-file的普通文件,这个文件实际对应整个解密后的分区。你需要再对这个文件执行文件系统的挂载才能看到里面的目录和文件。很多人第一次用都以为挂载完就完事了,结果ls /mnt/bitlocker只看到一个文件,瞬间怀疑是不是命令错了。其实这是对的,后面还要结合dislocker-file走第二步。
Dislocker这样设计有一个好处:把“解密分区”和“解析文件系统”解耦。解密分区只是把密文流变成明文流,明文流到底是NTFS、FAT32还是exFAT,Dislocker本身不关心,它只是把解密后的字节流传给上层。真正负责文件系统解析的是内核里的ntfs3、ntfs-3g或者vfat模块。这种分层思路和硬件加密卡驱动很像——底层只做透明数据变换,上层不感知加密过程。
2.2 核心架构设计:从加密元数据解析到FUSE桥接
如果从代码模块角度看,Dislocker可以拆成三个层次。
第一层是“设备访问层”。它负责打开原始块设备,按块读取扇区,并且能够识别BitLocker的分区布局。BitLocker分区并不是磁盘的第一个扇区就必须是卷头,它可能只占用一个分区,前面还有一个NTFS引导扇区或者移动盘特有的标志。Dislocker在定位时,会在分区内扫描-FVE-FS-这个签名来确认卷头位置,因此即使分区偏移有变化也能找到。
第二层是“密码学层”。这一层是Dislocker的核心,里面实现了卷头结构体的解析、各种保护器(密码、恢复密钥、TPM等)的解密逻辑,以及对AES-CBC和AES-XTS解密的支持。所有加解密动作都发生在这层。它负责把用户的密码/恢复密钥转换成可以解密VMK的密钥,再把VMK还原成FVEK和tweak key,最终提供给扇区解密使用。
第三层是“FUSE桥接层”。这一层只关心如何把一个raw块设备模拟成用户可以访问的文件。当内核通过FUSE读取dislocker-file某个偏移量时,FUSE就向后端请求对应扇区的解密数据。Dislocker在用户态收到请求,读取密文扇区,用密码学层解出明文,再返回给FUSE,最终由内核把明文扇区转成标准块设备I/O。在这个桥接过程中,CPU占用、内存缓冲和I/O粒度都会影响性能。
这样的三层结构让年轻人很舒服——开发时各模块独立,排查问题时可以单独验证“是不是密码不对”“是不是卷头解析失败”“是不是FUSE缓存问题”。我在排查一次挂载后乱码时,先通过--show参数看卷头解析结果,确认加密类型无误,再单独用loopback模式输出raw镜像,用file命令检查镜像内是否有NTFS签名,就能定位到问题出在哪一层。这就是理解架构带来的直接收益。
3. 加密解密流程的完整实现原理
3.1 卷头(Volume Header)解析与元数据读取
所有BitLocker卷的起点都是卷头。卷头通常占据分区开头的几个扇区,里面除了固定的-FVE-FS-签名外,还包含版本号、状态标志、加密类型、密钥块大小、以及保护器链表的偏移和长度。Dislocker在拿到这些信息后,先要验证状态:一个正在被BitLocker加密过程中的卷不会被正常处理,因为卷头里会标记“加密未完成”或者“转换中断”。另外卷头里还包含了一个重要的校验值,用来检测卷头本身是否被篡改。
保护器链表的信息非常关键。卷头中会列出多个保护器,每个保护器有自己的GUID、类型标识(密码、恢复密钥、外部密钥、TPM等)、以及加密后的VMK数据。Dislocker解析出这个链表后,会根据用户提供的解锁类型去匹配对应的保护器。比如你用密码解锁,它就会在链表中寻找“密码保护器”,然后从这个保护器的数据中取出加密VMK的密文,进一步计算解密。
实际解析过程中,还会遇到BitLocker卷头中存在“全局元数据”和“卷元数据”的区别。全局元数据描述了整个卷的加密策略,卷元数据则包含各个保护器的具体内容。Dislocker代码里把这两个部分合称为“元数据区块”,它会在卷头之后的多个扇区中寻找有效副本,因为微软为了健壮性,在卷头之外还有备份元数据。如果主卷头损坏,Dislocker会尝试读取备份元数据。我在一次无法解锁的调查中发现,磁盘有坏道但卷头备份完好,Dislocker还是能读出元数据信息,只是最终密钥解密失败,这能说明备份机制的可靠性。
3.2 密钥获取与解密流程:从用户口令到主密钥
解密流程的起点是用户提供的口令。以密码保护器为例,具体步骤可以拆成以下几段。
首先,从密码保护器数据中取出密码盐值(Salt)。BitLocker并不是直接用密码做解密密钥,而是通过某种密钥派生算法,把盐值和密码一起生成一个中间密钥。在Dislocker的早期实现中,这个过程类似于PBKDF2变体,迭代次数和哈希函数与Windows实现保持一致。之所以需要盐值,是为了防止相同密码在不同卷上得到相同密钥,同时增加暴力破解成本。
第二步是使用这个派生出的中间密钥去解密VMK密文。VMK密文保存在保护器的数据块里,用AES算法解密。解密后得到的VMK明文还要经过一轮校验,这个校验通常是一对已知的明文标记或校验值。密码正确时,校验值匹配,VMK被接受;如果密码错误,校验值对不上,Dislocker会直接报“Invalid password”之类的错误,而不是继续往下走。
第三步是使用VMK解密FVEK和tweak key。FVEK一般也是用AES加密存放在卷头或元数据里的,VMK只是它的“解封钥匙”。拿到FVEK之后,Dislocker才算真正拿到了扇区解密的钥匙。此后做的事情就是逐扇区解密:读取扇区,根据扇区号和加密模式计算tweak,用FVEK执行AES解密,得到明文扇区。
恢复密钥的解锁过程和密码略有不同。恢复密钥是一串48位数字,分8组,每组6位。BitLocker会把恢复密钥作为保护器,Dislocker需要将这串数字转成对应的外部密钥字节,再用它去解密VMK。校验机制与密码保护类似,只是派生方法不同。某种程度上恢复密钥就是“不受密码复杂度限制的长密钥”,因此暴力破解更难。
3.3 FUSE层实现:让解密后的数据块以文件系统形态呈现
密钥解密完成之后,Dislocker面临的下一个问题是:如何把一串连续解密的扇区变成用户能操作的目录和文件。这就轮到FUSE上场。
FUSE(Filesystem in Userspace)是Linux提供的一种机制,它允许用户态进程实现文件系统功能。Dislocker通过FUSE库注册一个文件系统,这个文件系统的根目录下只放一个特殊的文件,通常命名为dislocker-file。这个文件被创建时,Dislocker会在FUSE层把它与底层的解密卷设备关联起来。当用户或系统调用read读取这个文件的某个偏移量时,FUSE回调函数会读取对应偏移的加密扇区,用已解出的FVEK解密,再把明文返回到读缓冲区。
这个设计有个微妙之处:dislocker-file在系统看来就是一个普通文件,大小正好是BitLocker加密卷的总大小。所以你可以对它执行mount -t ntfs3 /mnt/dec/dislocker-file /mnt/win,内核会把dislocker-file当作一个块设备镜像去解析NTFS文件系统。内核每访问NTFS元数据,实际上都在请求Dislocker解密对应区域。因为FUSE支持随机读写,所以NTFS的整个结构可以被完整映射出来。
在实现上,FUSE层要处理一些问题:扇区对齐。NTFS通常以簇为单位读写,但BitLocker加密扇区可能是512字节或者4096字节。当上层文件系统以4096字节为单位请求时,Dislocker可能要把这个请求拆分成多个加密扇区来解密。此外还有缓存问题。FUSE本身有页缓存,Dislocker也有内部缓存,写操作还会涉及“读-改-写”流程。这些细节都会影响性能,但架构上它们都只是“性能优化”,不影响正确性。
4. 关键数据结构与算法细节
4.1 BitLocker加密扇区布局与AES-CBC、AES-XTS对比
BitLocker加密的最小单位是扇区。传统硬盘扇区是512字节,现代4K扇区是4096字节。BitLocker在加密每个扇区时,会根据扇区号引入一种“数据本位”的变化,防止相同明文在不同扇区被加密成完全相同的结果。
早期Windows版本使用AES-CBC模式,并采用“elephant diffuser”技术来扩散篡改,以弥补CBC模式的不足。CBC的加密流程是前一个密文块参与当前明文块的加密,因此如果攻击者在一个扇区内翻转某些比特,会导致后续所有块的解密结果被破坏。BitLocker通过扇区级加密密钥、可选的哈希校验和“diffuser”机制来缓解这个风险。Dislocker完整实现了这些细节,因此能处理旧版BitLocker卷。
新一代BitLocker默认使用AES-XTS模式。XTS全称是XEX-based Tweaked-codebook mode with ciphertext stealing。它不需要链式依赖,每个扇区都有自己的tweak值,这个tweak通过扇区号和一个密钥(tweak key)计算得到。解密时只要知道扇区号和tweak key,就可以独立解密该扇区。XTS的特点是“扇区内字节错误不会传播到其他块”,比CBC更抗错。Dislocker在检测到卷头里标记为AES-XTS后,会自动调用相应实现。
下面这个表格整理了两种模式的对比,方便你直观理解Dislocker在算法调度时怎么选择:
| 项目 | AES-CBC + diffuser | AES-XTS |
|---|---|---|
| 依赖链式关系 | 是,每个密文块会影响下一个块 | 否,每个数据块独立加解密 |
| 扇区偏移影响 | 需要扇区号参与salt计算 | 扇区号直接决定tweak值 |
| 错误传播 | 可能扩散到整个扇区 | 限制在一个16字节块 |
| 旧版本兼容 | 常见于Vista/7/8 | Windows 10以后默认 |
| Dislocker支持 | 完整 | 完整 |
| 性能 | 相对较慢 | 更快,尤其支持AES-NI时 |
实际项目中,如果你不确定卷用的是哪种模式,可以看Dislocker--show输出的cipher字段。很多网上教程直接拿现代命令跑老磁盘也能成功,就是因为它自动处理了两种算法。
4.2 防篡改机制与恢复密钥的校验原理
BitLocker卷不只靠加密防泄露,还防篡改。因为攻击者可以通过修改密文实现“密文替换攻击”,所以BitLocker在每个扇区或者每块数据中嵌入了校验信息。CBC模式下,这个校验信息与elephant diffuser结合使用。XTS模式下,也有专门的校验字段来确认扇区解密后明文与原始数据一致。
Dislocker在处理防篡改时,会验证解密后的扇区是否符合预期格式。但注意,Dislocker不会对所有扇区做完整校验,因为那样太慢。它主要依赖卷头中的“元数据校验”和扇区解密时与扇区结构相关的内建信息。当我们用Dislocker挂载一个被病毒改过的加密卷时,可能看到部分文件无法读取,这就是因为某个扇区的密文被改动,解密后的NTFS结构不完整,系统报错。此时如果数据特别重要,可以尝试用最新备份元数据或恢复密钥重新解密,某些情况下能救回来。
恢复密钥的校验原理与密码不同。恢复密钥由48位数字组成,其中内置了校验位。BitLocker生成恢复密钥时会算出一个校验值,并在用户输入恢复密钥后立刻验证格式是否正确。Dislocker在输入恢复密钥时同样会做这个校验,如果校验失败,会提示“恢复密钥中的校验位不匹配”。这一机制在防误输上非常实用。拿到合法的恢复密钥字节后,Dislocker用它们去解密对应的外部密钥保护器,再走VMK解FVEK的流程。因此恢复密钥本质上就是一把“硬编码的长密码”,只不过它比用户密码冗余度高得多,破解难度也大得多。
5. 实操中的编译、挂载与常见问题排查
5.1 环境准备与编译安装要点
在演示实操之前,我建议你先确认自己的Linux版本和软件源。部分发行版仓库里没有Dislocker,或者版本太老。比如Ubuntu从20.04开始可以在apt源里直接安装:
sudo apt update sudo apt install dislocker如果你的系统没有现成包,或者你希望用最新版特性,那就需要编译源码。源码编译主要做这几件事:安装依赖、cmake配置、make和安装。我最近一次在某台CentOS系统的机器上编译,依赖如下:
sudo yum install gcc gcc-c++ cmake make fuse-devel此外还需要Ruby开发依赖吗?这个版本不一定,因为现在Dislocker主体是C语言,不再依赖Ruby。不过有些老帖子里说需要Ruby,如果你编译遇到fuse3相关报错,可以再装一下fuse3-devel。下载源码后,进入目录执行:
cmake . make sudo make install编译完成后检查dislocker是否在PATH中。如果需要支持最新内核的FUSE3接口,编译时可能需要加开关。我在Ubuntu上编译时,遇到过FUSE_USE_VERSION未定义之类的编译错误,后来通过安装libfuse3-dev解决。所以我的建议是:优先用发行版官方包,只有在版本真的落后时才考虑源码编译。特别是你只需要“把文件拷出来”而不是二次开发时,官方包完全够用。
5.2 典型挂载命令与参数说明
下面给出一个完整的挂载流程,从解锁到访问文件,总共三步。
第一步,创建解密挂载点和最终挂载点。假设加密分区是/dev/sdb1,我们想最终在/mnt/data看到文件内容:
sudo mkdir -p /mnt/decrypted /mnt/data第二步,用Dislocker挂载解密后的raw视图:
sudo dislocker /dev/sdb1 -p'MyPassword123' -- /mnt/decrypted如果密码不在命令行里,可以使用交互输入-u等等。实际上Dislocker支持-p后跟密码,或者通过环境变量DISLOCKER_PASSWORD传递密码。注意命令行里直接写密码会导致进程列表暴露密码,所以在安全要求高的场景,我更推荐临时设置环境变量并赋给命令,比如:
read -s -p "Enter BitLocker password: " PASS sudo env DISLOCKER_PASSWORD="$PASS" dislocker /dev/sdb1 -- /mnt/decrypted执行成功后,ls /mnt/decrypted会看到dislocker-file。这个文件就是解密后的卷镜像。可以进一步查看它的文件系统类型:
file /mnt/decrypted/dislocker-file如果显示“DOS/MBR boot sector、NTFS”之类的输出,说明解密流程已经到了文件系统层。然后第三步,挂载NTFS:
sudo mount -t ntfs3 /mnt/decrypted/dislocker-file /mnt/data此时/mnt/data内的目录结构就是盘上实际的文件。完成访问后记得卸载顺序:先卸载/mnt/data,再卸载/mnt/decrypted,避免FUSE缓存没落盘导致数据不一致。
如果你只需要提取整个分区镜像而不想挂载,Dislocker也支持loopback模式。可以这样:
sudo dislocker -o /tmp/decrypted.img /dev/sdb1 -p'MyPassword123'或者干脆先解出raw镜像,再用dd操作。这种模式对取证、备份比较有用。
5.3 常见问题与排查技巧实录
在这两年里,我遇到过不少跟Dislocker相关的报错,这里挑几个典型出来,整理成一张速查表:
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 挂载时提示“no such file or directory” | 分区不存在或设备名不对 | 检查lsblk,确认加密分区不是整个盘,而是盘中的某个分区 |
| 提示“Invalid password”但密码明明正确 | 卷头中有多个密码保护器,或者密码包含特殊字符被shell转义 | 用--show查看保护器类型,用单引号引住密码,或改用环境变量传参 |
ls /mnt/decrypted看不到文件或FUSE报错 | 挂载点权限或FUSE内核模块未加载 | 确认/dev/fuse存在,挂载点目录是空目录,执行sudo modprobe fuse |
| 挂载NTFS时报错“Invalid argument” | 内核没有ntfs支持或者ntfs3模块未加载 | 检查cat /proc/filesystems,加载ntfs模块:sudo modprobe ntfs3 |
| 挂载成功但读取文件时I/O错误 | 磁盘上存在坏道或密文受损 | 用dislocker -o导出镜像后,用fsck检查,但别在FUSE挂载中直接fsck |
| 解锁极慢 | 大卷上使用AES-CBC且CPU不支持AES-NI | 确认CPU支持aes标志,在制造卷时优先选择XTS模式以提升性能 |
| 恢复密钥输入提示数字校验失败 | 用户输错数字、分组中夹带空格或字母 | 恢复密钥只含数字,按8组每组6位输入,用-r指定恢复密钥模式 |
排查技巧方面,我用得最多的是Dislocker自带的元数据读取功能。它的--show参数可以输出卷头关键信息,包括加密算法、版本、保护器列表等。命令类似:
sudo dislocker --show /dev/sdb1这个不会解锁,但能快速判断盘到底是不是BitLocker卷。如果什么都不输出,说明分区可能不是BitLocker或者卷头损坏。如果能看到保护器类型,就能知道对方用的是密码还是恢复密钥,避免拿错解锁方式浪费时间。
还有一个非常容易被忽略的坑:BitLocker分区可能不是从磁盘第一个扇区开始的。比如在U盘上,BitLocker可能创建在第二个分区,且前面存在一个小的启动分区。这个时候如果你拿/dev/sdb整个设备去解锁,不是不行,但Dislocker需要能在设备中找到卷头。如果失败,就用lsblk -o PATH,SIZE,TYPE,FSTYPE确认FSTYPE列是否显示为“BitLocker”或未知。确定分区后,再针对分区设备解锁。
实际排查一次失败案例:某盘用Windows解密时正常,但在Linux下用Dislocker弹“Invalid password”。后来我用--show发现保护器类型是“TPM”,也就是说这台机器用TPM绑定,密码保护器不存在。这时候正确做法是让用户在Windows里关闭TPM保护或者添加密码保护器,或者使用恢复密钥。这就明白为什么“密码对,却解不开”了。
还有个常见问题是挂载后文件系统只读。Dislocker本身可以通过FUSE支持写操作,但如果你不希望意外修改数据,只读挂载反而安全。要挂载成只读,可以给mount加-o ro,FUSE挂载时也可以加--read-only选项。在取证场景下,建议默认只读。写操作需要BitLocker卷本身支持,而且需要正确计算MAC等,复杂度和风险都更高,所以在生产环境建议以只读方式提取数据,别直接写入加密卷。
6. 我的一些体会与扩展建议
用了几次Dislocker之后,我对“加密工具”的理解更务实了。它表面上是“解锁BitLocker盘的命令行工具”,本质上是一个适配层,把微软私有加密格式映射成Linux标准接口。整条数据链路里,最容易出问题的地方不在加密算法,叫作“人机交互”的部分——用户给错了密码、用了错误保护器、设备名看错、FUSE模块没加载。把架构弄明白后,这些错误反而变成很直观的排查线索。
再分享一个小技巧:如果你经常需要在服务器重启后无人值守地挂载BitLocker盘,可以写一个systemd service,通过环境变量文件传入密码,挂载完成后自动启动一个只读bind mount。不过务必保证这个密码文件权限严格控制在600,否则会泄露密钥。我个人不太建议把密码明文放在脚本里,因为ps或history会留下痕迹。更好的方案是用一个单独的keyfile,把keyfile挂载到系统只读目录里,再用Dislocker读它。
此外,Dislocker最近的一些分支还支持通过FUSE3接口调用、集成libmspub等新特性。如果需要做嵌入式平台适配,还可以考虑把它和dm-crypt结合,通过映射成设备映射器来提升性能。我对未来的期望是:如果微软某天愿意公开更多BitLocker规范,Linux内核或许能原生支持,那就省去了很多麻烦。但在那之前,理解Dislocker这套架构怎样把加密流程拆解成卷头解析、密钥还原、FUSE桥接三个层次,仍然是每个要做Linux数据恢复或安全运维的人都值得掌握的技能。