我正在调查一个问题,即加密块设备会在写入时造成巨大的性能损失。数小时的互联网阅读和实验并没有让我得到正确的理解,更不用说解决方案了。
简而言之:为什么将 btrfs 放到块设备上时我的写入速度非常快(~170MB/s),而将 dm-crypt/LUKS 放在块设备之间时写入速度会下降(~20MB/s)文件系统和块设备,尽管系统能够维持足够高的加密吞吐量?
/home/schlimmchen/random是一个 4.0GB 的文件,里面装满了之前的数据/dev/urandom。
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
Run Code Online (Sandbox Code Playgroud)
阅读速度超快:
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 6.58036 s, 648 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 0.786102 s, 5.4 GB/s
Run Code Online (Sandbox Code Playgroud)
(第二次,文件显然是从缓存中读取的)。
设备直接用btrfs格式化(块设备上没有分区表)。
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
Run Code Online (Sandbox Code Playgroud)
写入速度高达 ~170MB/s:
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test1 bs=1M conv=fsync
4265841146 bytes …Run Code Online (Sandbox Code Playgroud) 我尝试按照本教程在 ubuntu 13.04 上使用 LVM 和 dm-crypt 设置 TRIM:
请参阅下面有关我的配置和测试程序的说明。
如果 TRIM 工作正常,是否有可靠的测试?
是我的测试程序错误还是我的 TRIM 不起作用?
如果它不起作用:我的设置有什么问题?
如何为我的设置调试 TRIM 并使 TRIM 工作?
这是我的配置:
cat /etc/crypttab
sda3_crypt UUID=[...] none luks,discard
Run Code Online (Sandbox Code Playgroud)
和
cat /etc/lvm/lvm.conf
# [...]
devices {
# [ ... ]
issue_discards = 1
# [ ... ]
}
# [...]
Run Code Online (Sandbox Code Playgroud)
SSD 是三星 840 Pro。
为了测试我刚刚做的设置sudo fstrim -v /,结果
/: [...] bytes were trimmed
再次执行此操作的结果/: 0 bytes were trimmed似乎是有道理的,并表明 TRIM 似乎有效。
但是后来我做了这个测试:
dd …
我的系统使用dm-crypt和完全加密LVM。我最近将加密分区从/dev/sda5到/dev/sda2.
我的问题是:如何将加密分区映射到的名称从sda5_crypt更改为sda2_crypt?
我可以正常启动系统。但是我在启动时得到的提示(sda5_crypt)虽然UUID映射到/dev/sda2:
Volume group "vg" not found
Skipping volume group vg
Unlocking the disk /dev/.../UUID (sda5_crypt)
Enter passphrase:
Run Code Online (Sandbox Code Playgroud)
我想现场引导,解密sda2,激活vg,chroot来/dev/vg/root和运行update-grub2,但无济于事。
仅仅编辑/etc/crypttab也不起作用。
我刚收到一个新的 USB 闪存驱动器,并在其上设置了 2 个加密分区。我使用 dm-crypt(LUKS 模式)到cryptsetup. 使用额外的非加密分区,驱动器具有以下结构:
/dev/sdb1,加密,隐藏标有“分区 1”的 ext4 文件系统。/dev/sdb2,加密,隐藏另一个 ext4 文件系统,标记为“分区 2”。/dev/sdb3,清晰可见的 ext4 文件系统,标记为“分区 3”。因为标签附加到 ext4 文件系统,所以只要分区没有被解密,前两个就完全不可见。这意味着,与此同时,LUKS 容器没有标签。这在使用 GNOME(自动挂载)时特别烦人,在这种情况下,分区显示为“ x GB 加密”和“ y GB 加密”,直到我决定解锁它们。
这不是一个真正的阻塞问题,但它很烦人,因为我真的很喜欢我的标签,并且很想看到它们出现,即使我的分区仍然加密。
因此,有没有办法将标签附加到 dm-crypt+LUKS 容器,就像我们将标签附加到 ext4 文件系统一样?dm-crypt+LUKS 标头是否有空间,如果有,我该如何设置标签?
请注意,我不想在解密之前暴露我的 ext4 标签,这很愚蠢。我想向容器添加其他标签,这些标签可能会在 ext4 标签隐藏时出现。
如何更改现有dm-crypt LUKS 设备的哈希规范和迭代时间?
显然,如果我创建一个新设备,我可以传递选项,例如这样的:
sudo cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 --iter-time 2100 --hash sha512 /dev/loop0
Run Code Online (Sandbox Code Playgroud)
但是,如果该设备已经存在,我怎么能例如更改sha256到sha1或改变迭代时间没有“破坏”的设备。(显然,您必须重新输入密码,因为将生成新的哈希值。)
在LUKS/ dm-crypt/ cryptsetup FAQ页面说:
2.15 我可以调整 dm-crypt 或 LUKS 分区的大小吗?
是的,您可以,因为 dm-crypt 和 LUKS 都不存储分区大小。
我一头雾水:
如果没有存储大小信息,什么是“调整大小”?
如何在加密卷的打开/关闭过程中记住“调整大小”?
我如何加密我的系统(最好使用 lvm + dm-crypt/luks),以便挂起到 RAM 工作并且当挂起到 RAM 时一切都处于加密状态?
我尝试使用 dm-crypt 和 LVM 设置 Fedora 25,但很难使 TRIM 工作。
$ sudo fstrim -av
/boot: 28.6 MiB (30003200 bytes) trimmed
/: 56.5 GiB (60672704512 bytes) trimmed
$ sudo fstrim -av
/boot: 0 B (0 bytes) trimmed
/: 56.5 GiB (60671877120 bytes) trimmed
Run Code Online (Sandbox Code Playgroud)
从上面的输出中可以看出,重复运行fstrim在未加密的ext4 上有效 /boot,但似乎对/(在同一磁盘上)没有影响。
设置是 SSD -> dm-crypt -> LVM -> XFS
$ lsblk -D
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda 0 512B 2G 0
??sda2 0 512B 2G 0
? ??luks-dd5ce54a-34c9-540c-a4cf-2a712b8a3a5e 0 512B …Run Code Online (Sandbox Code Playgroud) 我通过创建了一个加密的容器
#!/bin/bash
dd if=/dev/zero of=$1 bs=1 count=0 seek=$2
MAPPER=$(mktemp -up /dev/mapper)
LOOPDEV=$(losetup --find --show $1)
cryptsetup luksFormat $LOOPDEV
cryptsetup luksOpen $LOOPDEV $(basename $MAPPER)
mkfs.ext3 $MAPPER
cryptsetup luksClose $MAPPER
losetup -d $LOOPDEV
Run Code Online (Sandbox Code Playgroud)
例如,container指定给此脚本的文件将包含通过 .ext3 加密的 ext3 文件系统cryptsetup luksFormat。
要安装它,我目前使用另一个脚本,例如dm.mount container /mnt/decrypted:
#!/bin/bash
set -e
MAPPER=$(mktemp -up /dev/mapper)
LOOPDEV=$(losetup --find --show $1)
cryptsetup luksOpen $LOOPDEV $(basename $MAPPER) || losetup -d $LOOPDEV
mount $MAPPER $2 || (
cryptsetup luksClose $MAPPER
losetup -d $LOOPDEV
)
Run Code Online (Sandbox Code Playgroud)
并卸载它dm.umount /mnt/decrypted …
我目前正在尝试在没有 LUKS 标头的纯模式下使用 dm-crypt 实现全盘加密,并/boot在 U 盘上使用单独的 USB 记忆棒。
我的主要目标是在基于 Debian 的发行版上实现合理的否认。现在我已经设法使用加密分区cryptsetup并将/boot分区安装到单独的 USB 密钥。一切都按预期进行,因为加密标头未存储在 LUKS 中,所以我需要在 initramfs 屏幕上手动输入它,但在这一步中,我只是收到一个错误,表明 initramfs 中没有 cryptsetup ("/bin/ sh: cryptsetup: not found") 同时尝试解析标头。
综上所述:
dev/sda使用dm-crypt(/root和/home卷)加密:cryptsetup --hash=sha512 --cipher=twofish-xts-plain64 create crypt /dev/sdaRun Code Online (Sandbox Code Playgroud)
dev/sdb 安装了 grub 的引导棒我可以从引导棒成功引导。我看到 Ubuntu 启动画面大约 20 秒,这是我想要实现的合理否认,然后它下降到 initramfs 抱怨无法找到/dev/mapper/root- 这也是我想要实现的目标。
问题是,当我想解析允许我输入密码并继续引导的 cryptsetup 行时,initramfs 会抱怨“cryptsetup:未找到”。
我想这个抱怨是真的。我的问题是:如何将 cryptsetup 安装到 initramfs 中,以便它允许更准确地引导密码提示?
另外,我知道我在 中添加了适当的条目而省略了一些内容/etc/fstab,/etc/crypttab并且在启动期间找不到设备。
这些是我找到并用于设置所有当前配置的指南,也许这会清除我在问题中未涵盖的内容: