btrfs.readthedocs.io 将“dup”配置文件描述为在单个“设备”上复制数据。该网站的多个位置的描述均未明确说明它们是指具有两个镜像分区的物理驱动器,还是隐藏了复制内容的分区。
一些关于“dup”的描述暗示它是一种特殊的 raid1,经过调整可在具有两个分区的单个设备上执行,但其他来源似乎认为它在单个分区内添加了重复。(当然,无论哪种方式,实际磁盘使用情况都是相同的。)在我看来,“dup”可能与单个分区兼容,但没有实际的重复,或者两个分区可能会强制非最佳性能。
这是用于备份而非主要访问的旋转硬盘(“dup” 防止比特腐烂。其他副本使用哈希值和校验和进行异地复制。)我知道许多 SDD 可能会在内部进行重复数据删除。
有人确切知道“dup”配置文件的行为吗?我的 C 语言阅读能力不够强,无法仔细阅读内核源文件。
总结
DUP 的预期用途是将重复项隐藏在一个分区中。
完整答案
Btrfs 并不关心您是否为其提供分区或整个磁盘,它们每个都是一个设备。
DUP 配置文件设计用于单台设备。您可以添加另一台设备并将配置文件保留为 DUP(从 4.5.1 开始,
mkfs.btrfs
您可以从一开始就在多台设备上创建 DUP),但这种用法并不理想:如果您希望在多台设备上实现冗余,最好使用 RAID1 或更高版本;然后 btrfs 会将冗余副本分配给不同的设备。使用 DUP 则没有这样的要求,冗余副本可以分配给一台设备。请注意,这种行为首先使 DUP 可以在单台设备上使用。单个设备上的 DUP 将尝试将每条数据(和/或元数据)存储在设备的两个物理位置,这是其主要目的。如果是多台设备,则两个副本可能最终位于不同的设备上,也可能最终位于一台设备上。无论如何,都会有“实际重复”,除非接收两个副本的设备决定在内部对它们进行重复数据删除(您似乎意识到了这个问题)。
当设备大小不同时,在两个设备上使用 DUP 是有意义的,因此在它们上使用 RAID1 会导致较大设备的很大一部分无法使用。
无论如何,btrfs 执行的所有管理都将在 btrfs 内部进行。Btrfs 本身不会创建任何您可以看到的新分区
fdisk -l
或类似的东西。通常,将同一磁盘的两个或多个分区用作单个 btrfs(单个文件系统)使用的设备没有什么意义。以下情况比较合理:
可能会有性能损失,因此除非您有充分的理由(如上述原因之一),否则您想要提供给 btrfs 的任何磁盘的所有空间都应作为一个设备提供给它。当每个设备在物理上位于单独的磁盘上时,在多个设备上使用 Btrfs 最有意义。
验证
我也无法阅读源代码。我的主张基于以下观察:
在 4.5.1 之前,DUP
mkfs.btrfs
仅允许您将 DUP 与单个设备一起使用,但您可以通过在之后添加设备使其与多个设备一起使用mkfs.btrfs
,这一事实有力地表明 DUP 旨在与单个设备一起使用,但在与多个设备一起使用时不会造成任何影响。我在man 8 mkfs.btrfs
btrfs-progs v6.2 中发现了这一事实。我创建了一个大小为 1 GiB 的稀疏常规文件,在其中创建了一个 btrfs
mkfs.btrfs -m dup -d single …
,在未压缩的情况下挂载并将随机数据推送到文件系统内的一个文件 (dd if=/dev/urandom …
),直到“没有剩余空间”。我能够存储 904 MiB 的数据,而保存文件系统的文件失去了大约 904 MiB 的稀疏性。这是预料之中的。然后我从头开始,用 执行此操作
-d dup
。这次我能够存储 452 MiB,但保存文件系统的文件失去了约 904 MiB 的稀疏性,因此是原来的两倍。这表明,如果单个设备上出现 DUP,则存在“实际重复”。类似地,我创建了一个大小为 1 GiB 的稀疏常规文件和另一个大小为 400 MiB 的稀疏常规文件,在其中创建了一个 btrfs
mkfs.btrfs -m dup -d single …
,在未压缩的情况下挂载(我需要手动使用losetup
两次),并将随机数据推送到文件系统内的一个文件中,直到“没有剩余空间”。我能够存储 1263 MiB 的数据。保存文件系统的文件如预期的那样失去了(总体)稀疏性。与上述单个设备的情况相比,
-d single
大小为 400 MiB 的附加设备为我提供了文件系统中大约 359 MiB 的额外空间。然后我从头开始,用 做了这件事
-d dup
。这次我能够存储 631 MiB。文件系统所包含的文件的(总体)稀疏性损失了大约两倍。与上述单个设备的情况相比,
-d dup
大小为 400 MiB 的附加设备为我提供了文件系统中大约 179 MiB 的额外空间。这不仅表明 DUP 可以在多台设备上工作,而且它的工作方式与在单台设备上一样。我的意思是可以将冗余副本分配给一台设备。在我的例子中,一些数据块必须两次分配给较大的设备,因为没有其他方法可以在 1 GiB + 400 MiB 内存储两份 631 MiB 的副本。
比较一下:
mkfs.btrfs -m raid1 -d raid1
在两台设备(同样是 1 GiB + 400 MiB)上我只能存储 319 MiB。与 DUP 不同,RAID1 强制将冗余副本分配到不同的设备,因此我的 400 MiB 设备限制了整个文件系统的容量。我的测试平台是 Debian 12、内核 6.1.0、btrfs-progs v6.2。