cryptsetup 和 ext4 带来多少存储开销?

fre*_*ret 5 encryption ext4 dm-crypt cryptsetup

我想使用 cryptsetup 对具有 ext4 文件系统的容器中的目录内容进行加密。容器的大小应该尽可能小,必要时尽可能大,因为我只想写一次然后备份。

首先尝试:将容器的大小设置为内容的大小。

dirsize=$(du -s -B512 "$dir" | cut -f 1)
dd if=/dev/zero of=$container count=$dirsize
losetup /dev/loop0 $container
fdisk /dev/loop0 # 1 Partition with max possible size
cryptsetup luksFormat --key-file $keyFile /dev/loop0
cryptsetup luksOpen --key-file $keyFile /dev/loop0 container
mkfs.ext4 -j /dev/mapper/container
mkdir /mnt/container
mount /dev/mapper/container /mnt/container
rsync -r "$dir" /mnt/container
Run Code Online (Sandbox Code Playgroud)

Rsync 返回没有足够的空间来容纳数据。看起来很合理,因为加密和文件系统必须有一些开销。

我尝试使用相对偏移量:

dirsize=$(($dirsize + ($dirsize + 8)/9))
Run Code Online (Sandbox Code Playgroud)

这可以解决大于 100 MB 的目录的问题,但不能解决小于 50 MB 的目录的问题。

如何确定容器必须比目录大的相应字节数?

fro*_*utz 4

LUKS 默认使用 2 MiB 作为其标头,主要是由于数据对齐原因。您可以使用cryptsetup luksDump(Payload offset:在扇区中) 进行检查。如果您不关心对齐方式,则可以使用该--align-payload=1选项。

至于ext4,就复杂了。它的开销取决于文件系统大小、索引节点大小、日志大小等。如果您不需要日记,您可能更喜欢ext2。其他文件系统的开销可能比 少ext*,可能值得尝试。另外,一些mkfs标志(类似-T largefile或相似)可能会有所帮助,具体取决于您要放置在该东西上的文件类型。例如,如果您只想在其中放入十几个文件,则不需要创建具有一百万个索引节点的文件系统。

如果您希望容器尺寸最小,可以从一个较大的容器开始,然后将resize2fs -M其缩小到最小尺寸。然后,您可以truncate使用该大小加上 LUKS 的容器Payload offset:

这应该非常接近小,如果您需要它更小,请考虑使用tar.xz而不是文件系统。虽然tar对于数百 GB 的数据来说不是很好(需要提取所有内容才能访问单个文件),但对于您提到的大小来说应该没问题,并且应该小于大多数文件系统......