dm-crypt/加密非root文件系统 - Arch Linux 中文维基

跳转到内容

# dm-crypt/加密非root文件系统

来自 Arch Linux 中文维基
< Dm-crypt

翻译状态：

- 本文（或部分内容）译自 Dm-crypt/Encrypting a non-root file system，最近一次同步于 2025-07-30，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

以下是一些用 dm-crypt 加密辅助（secondary）文件系统（即，非根文件系统）的例子。

## 总览

加密辅助文件系统不会对操作系统、程序文件进行加密，因此通常只用于单独保护敏感数据。对于USB驱动器等外部介质，进行加密可确保在不同计算机上使用时，数据安全不受威胁。此外，也可按照数据访问人员将数据分类，分别使用不同的密钥加密。

dm-crypt 是块级别加密层，其将加密整个块设备（例如，分区和回环设备）。

若要加密单个文件，需要使用文件系统层级的加密。例如使用eCryptfs 或 EncFS。有关保护隐私数据的更多信息，参见静态数据加密。

## 分区

本例介绍的是对 `/home` 分区的加密，但相关方法也可以应用到其它包含用户数据的非根分区。

提示：可以为每个用户的`/home`目录单独分配一个分区，也可以所有用户的`/home`目录共享一个分区。

下文假定用于`/home`目录的分区已经创建。若该分区曾用于其它用途，因而包含了数据，可能需要使用dm-crypt专用方案安全擦除分区。注意，只擦除一个分区，而不擦除整个磁盘，可能仍会泄露一些数据。

建立 LUKS 头：

    # cryptsetup options luksFormat device

`device`应对应已创建的分区。`options`的取值参见Dm-crypt/设备加密#LUKS_模式的加密选项。

使用设备映射器对设备进行解密，以对加密的分区进行操作：

    # cryptsetup open device name

分区解密之后，会被映射成块设备 `/dev/mapper/name`。之后，建立文件系统：

    # mkfs.fstype /dev/mapper/name

若所有用户共享`/home`目录，则可将创建好的文件系统挂载到`/home`；若该文件系统是某个用户专用的，则挂载到`/home/username`。参见 #手动挂载和卸载。

提示：卸载并再挂载一次文件系统，可确定映射有无问题。

### 手动挂载和卸载

挂载分区：

    # cryptsetup open device name
    # mount /dev/mapper/name /mnt/home

卸载：

    # umount /mnt/home
    # cryptsetup close name

提示：GVFS 也可以挂载加密的分区。若使用支持 gvfs 的文件管理器（例如，Thunar）挂载加密分区，则会弹出密码输入框。对于其他桌面环境，可使用zulucryptAUR进行图形化挂载。

### 自动解锁并挂载

有三种不同方法来自动化解锁分区并挂载文件系统。

#### 启动时解锁

配置 `/etc/crypttab` 文件，systemd会在系统启动过程中自动解析该文件，并以此解密相应设备。若要挂载所有用户共用的home分区，或要自动挂载其它加密的块设备，推荐使用本方法。

可参考Dm-crypt/系统配置#crypttab。此外，Dm-crypt/系统配置#在启动时挂载中提供了示例配置。

#### 用户登录时解锁

- 使用pam_exec：若需要为每个用户挂载单独的加密home分区，推荐使用该方式。
- 使用pam_mount。

## 文件容器

Cryptsetup 对设备进行操作。因此，若要使用文件容器，需要配置回环设备。好在，在后台，cryptsetup可自动管理回环设备(请见 Gentoo:Custom_Initramfs#Encrypted_keyfile)，无需手动调用 `losetup`。

首先，使用恰当的随机数生成器用 dd 创建一个加密容器：

    $ dd if=/dev/urandom of=bigsecret.img bs=100M count=1 iflag=fullblock

这会创建大小为 100 MiB 的 `bigsecret.img` 文件。

注意，不要遗漏`iflag=fullblock`选项。否则，可能出现“部分读”问题。详见Dd#部分读取：复制的数据量小于要求的大小。

要避免之后调整容器大小的麻烦，在创建文件容器时，确保其大小大于要加密的文件的总大小、文件系统内部数据/元数据开销和LUKS头的总和。若使用LUKS，则仅其元数据就可能需要多达16MiB的空间。创建一个小于 LUKS头（16MiB）大小的文件容器会在打开设备时报错`Requested offset is beyond real size of device bigsecret.img`。

之后的操作和#分区中的相同，但要将 `device` 替换为 `bigsecret.img`。

cryptsetup 会自动寻找可用的回环设备设备并将文件附加到设备上。在卸载之后，文件容器应该相应地关闭，cryptsetup之后会分离使用的回环设备。

提示：使用dm-crypt加密容器非常灵活。可查看Tomb的功能和文档详细了解。Tomb提供了一系列dm-crypt脚本，以便快速灵活地处理加解密操作。

### 使用 losetup 手动挂载和卸载

首先，查找未使用的回环设备：

    # losetup --find

然后，将文件容器附加到回环设备，例如，要附加到`loop0`：

    # losetup /dev/loop0 bigsecret.img

注意：如果出现`/dev/loop0: No such file or directory`错误，需要先以 root 用户执行命令`modprobe loop`以加载内核模块。较新的内核中（内核版本3.2及更高），回环设备是按需创建的。可通过以 root 用户执行 `losetup -f` 命令请求创建新的回环设备。

之后，按照常规方式进行cryptsetup设置即可：

    # cryptsetup open /dev/loop0 secret
    # mount -t ext4 /dev/mapper/secret /mnt/secret

卸载容器时，需要以相反的顺序执行对应的操作：

     # umount /mnt/secret
     # cryptsetup close secret

若要分离使用的回环设备:

     # losetup --detach /dev/loop0

分类：​

- 静态数据加密

dm-crypt/加密非root文件系统
添加话题