openSUSE Tumbleweed 上读写 Windows BitLocker 加密磁盘

Windows 上的 BitLocker 提供了一种很便捷的加密磁盘的方式。用 BitLocker 来加密移动磁盘也是非常方便。但是由于 MS 的闭源政策,其它系统对 BitLocker 的支持就非常不方便了。幸好我们有 Aorimn 开发的解密 BitLocker 磁盘的工具 Dislocker。

下面记录了在 openSUSE Tumbleweed 上安装使用 Dislocker 的步骤。

安装 Dislocker

参考了 GitHub 上 Dislocker 页面install.md 里的介绍。

安装依赖包

根据说明,依赖包包括,

  • 编译器, gcc 或 clang
  • cmake (至少 2.6 版本)
  • make
  • FUSE 头文件
  • PolarSSL/mbedTLS 头文件
  • 可选:ruby 头文件

其中 gcc cmake make 一般系统中默认都安装了,不过再试试也没什么,

$ sudo zypper in gcc cmake make

然后是 FUSE 包,

$ sudo zypper in fuse-devel

最后是提供加密服务的 PolarSSL/mbedTLSmbedTLS 就是改名后的 PolarSSL。它们是一个东西。没有 mbedTLS 就安装 PolarSSL 试试看。在 openSUSE 安装源里的是 mbedTLS。直接安装,

$ sudo zypper in mbedtls-devel

至于 Ruby 属于可选内容。如果安装时关联 Ruby,则安装后可以提供一个 dislocker-find 模块(一个 Ruby 脚本)用于在所有连接的硬盘中尝试寻找使用 BitLocker 加密的分区。所以如果不需要这个功能的话就不用安装 Ruby。如果要安装的话,

$ sudo zypper in ruby-devel /usr/bin/ruby

需要 /usr/bin/ruby 是因为在 RHEL 7 中的是 rubypick 而在 RHEL 6 或 5 中是 ruby

安装 dislocker 稳定版

先创建一个临时文件夹用于存放下载的安装文件,并作为编译目录,

$ mytmp=$(mktemp -d --tmpdir dislocker.XXXXXX)

下载 dislocker。开发版本可以从 GitHub 下载,稳定版本(目前是 0.5.2 0.6.1 0.7.1)可以从 HSC 下载。这个链接失效了,现在改用 GitHub 上的 master 版本。

$ wget https://github.com/Aorimn/dislocker/archive/master.zip -O $mytmp/dislocker.zip

这里 wget 使用 -O 指定保存的目标文件夹和文件名。如果只是想指定保存文件夹而不想改变文件名,则应该使用 -P 选项(-P ~/tmp)。

然后解压,

$ unzip $mytmp/dislocker.zip -d $mytmp

然后就可以直接安装了,

$ cd $mytmp/dislocker-master
$ cmake . && make && sudo make install

自动安装脚本

!#/bin/bash
sudo zypper install gcc cmake make fuse-devel mbedtls-devel
# sudo zypper install gcc cmake make fuse-devel mbedtls-devel ruby-devel /usr/bin/ruby

mytmp=$(mktemp -d --tmpdir dislocker.XXXXXX)
wget https://github.com/Aorimn/dislocker/archive/master.zip -O $mytmp/dislocker.zip
unzip $mytmp/dislocker.zip -d $mytmp
cd $mytmp/dislocker-master
cmake . && make && sudo make install

挂载 BitLocker 加密的磁盘分区

插上带有 BitLocker 加密分区的磁盘,使用 fdisk 查看磁盘及分区信息。一般可以根据自己熟悉的该分区的容量区分出来。当然也可以用 dislocker-find 如果安装的时候使用了 Ruby 的话。

这里假设没有 dislocker-find,电脑只有一个硬盘,现在外接一个带两个分区的移动硬盘,其中一个容量为 500GB 的分区是 BitLocker 加密的。磁盘设备在 openSUSE 里使用 /dev/sdX(X 为 a-z 的小写字母)标识。所以本机内置磁盘为 /dev/sda,而外接移动硬盘为 /dev/sdb

$ sudo fdisk -l
Disk /dev/sdb: 931.5 GiB, 1000170586112 bytes, 1953458176 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd2840axx

Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 1048586239 1048584192 500G 7 HPFS/NTFS/exFAT
/dev/sdb2 1048586240 1953454079 904867840 431.5G 7 HPFS/NTFS/exFAT

根据大小可以判断为 /dev/sdb1,即 /dev/sdb 的第一个分区。。

创建一个空文件夹来放置 dislocker 解密挂载点,以免使用现有文件夹时 disklocker 会提示目标文件夹不为空的警告。同时创建一个挂载点 /myencryptdisk

$ sudo mkdir /dislocker
$ sudo mkdir /myencryptdisk

先用 disklocker 解密该分区(需要使用 root 帐户),并选用 /dislocker 为解密挂载点,

$ su
# dislocker -u -v -V /dev/sdb1 -- /disklocker

按提示直接输入解密用的用户密码(user password)即可,不是 root 密码。其中 -u 表示使用用户设置的用户密码来解密。也可以用 -p 表示使用恢复密码(recovery password)解密。而 -V 指定要解密的分区的路径。-- /dislocker 表示将解密对象传递给 FUSE 并使用 /dislocker 文件夹作为解密文件挂载点。解密后对象访问的路径为 /dislocker/dislocker-file

然后使用系统的 mount 指令挂载解密后的文件,假设预先创建的挂载点为 /myencryptdisk。(下面直接使用 root 帐户。)

# mount -o loop,rw /zdislocker/dislocker-file /myencryptdisk

这样就将该磁盘分区挂载为可读写的文件夹 /myencryptdisk 了。

可能是因为 openSUSE 的文件浏览器 Dolphin 的关系,也可能是因为这东西本来就是这么运作的,该分区挂载后在 Dolphin 左边栏显示为 Loop Device,而不是挂载点的名称 myencryptdisk,也不是该分区的卷标。不过 Dolphin 地址栏的路径是正确地显示为 /myencryptdisk 的。

用完之后取消挂载加密磁盘的顺序为(挂载点还是使用上面的例子,YMMV),

# sudo umount /myencryptdisk
# sudo umount /zdislocker

已知问题

无法加载共享库

今天遇到一个错误,提示为,

dislocker: error while loading shared libraries: libmbedtls.so.9: cannot open share
d object file: No such file or directory

原来是因为系统中的安装的 mbedtls-devel 升级了,所以 dislocker 找不到新的库文件。解决办法就是重新编译安装 disklocker。

更新说明

2018-03-01

有几天没使用 dislocker 了。今天要用了才发现不能用了,报错如上面提到过的类似。才知道多半是最近的 mbedtls 更新导致需要重新编译安装 dislocker 了。

然后就发现之前记录的 dislocker 的下载地址也失效了,只好改用 GitHub 上的链接。于是直接改用 master 版本了。这是修改上面的说明的原因。

本文是水景一页 openSUSE 初始化配置系列记录文章的一篇。©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/opensuse-tw-bitlocker/>。转载请保留此信息及相应链接。

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)