AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 790743
Accepted
Max Power
Max Power
Asked: 2025-02-08 05:43:56 +0800 CST2025-02-08 05:43:56 +0800 CST 2025-02-08 05:43:56 +0800 CST

BTRFS“dup”使用一个分区还是两个分区?

  • 772

btrfs.readthedocs.io 将“dup”配置文件描述为在单个“设备”上复制数据。该网站的多个位置的描述均未明确说明它们是指具有两个镜像分区的物理驱动器,还是隐藏了复制内容的分区。

一些关于“dup”的描述暗示它是一种特殊的 raid1,经过调整可在具有两个分区的单个设备上执行,但其他来源似乎认为它在单个分区内添加了重复。(当然,无论哪种方式,实际磁盘使用情况都是相同的。)在我看来,“dup”可能与单个分区兼容,但没有实际的重复,或者两个分区可能会强制非最佳性能。

这是用于备份而非主要访问的旋转硬盘(“dup” 防止比特腐烂。其他副本使用哈希值和校验和进行异地复制。)我知道许多 SDD 可能会在内部进行重复数据删除。

有人确切知道“dup”配置文件的行为吗?我的 C 语言阅读能力不够强,无法仔细阅读内核源文件。

btrfs
  • 1 1 个回答
  • 21 Views

1 个回答

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2025-02-08T19:43:25+08:002025-02-08T19:43:25+08:00

    总结

    DUP 的预期用途是将重复项隐藏在一个分区中。


    完整答案

    Btrfs 并不关心您是否为其提供分区或整个磁盘,它们每个都是一个设备。

    DUP 配置文件设计用于单台设备。您可以添加另一台设备并将配置文件保留为 DUP(从 4.5.1 开始,mkfs.btrfs您可以从一开始就在多台设备上创建 DUP),但这种用法并不理想:如果您希望在多台设备上实现冗余,最好使用 RAID1 或更高版本;然后 btrfs 会将冗余副本分配给不同的设备。使用 DUP 则没有这样的要求,冗余副本可以分配给一台设备。请注意,这种行为首先使 DUP 可以在单台设备上使用。

    单个设备上的 DUP 将尝试将每条数据(和/或元数据)存储在设备的两个物理位置,这是其主要目的。如果是多台设备,则两个副本可能最终位于不同的设备上,也可能最终位于一台设备上。无论如何,都会有“实际重复”,除非接收两个副本的设备决定在内部对它们进行重复数据删除(您似乎意识到了这个问题)。

    当设备大小不同时,在两个设备上使用 DUP 是有意义的,因此在它们上使用 RAID1 会导致较大设备的很大一部分无法使用。

    无论如何,btrfs 执行的所有管理都将在 btrfs 内部进行。Btrfs 本身不会创建任何您可以看到的新分区fdisk -l或类似的东西。

    通常,将同一磁盘的两个或多个分区用作单个 btrfs(单个文件系统)使用的设备没有什么意义。以下情况比较合理:

    • 如果磁盘中间某处有一个分区,而您出于某种原因确实无法移动它,那么您可能希望通过在两个分区(一个在不可移动分区之前,一个在不可移动分区之后)上创建 btrfs,将磁盘的其余部分用作单个文件系统。如果您想要复制,那么这里的 DUP 就很有意义。
    • 如果您的磁盘是旋转式 HDD,那么您可能想要创建两个分区并使用 btrfs 的 RAID1 配置文件,以预先保护您的数据免受磁头碰撞的影响。关键是,如果磁头碰撞不会立即损坏磁盘,那么它可能只会影响一个分区,至少最初是这样。RAID1 保证另一个分区上有数据的副本。如果对整个磁盘进行 DUP(无论是在整个磁盘上还是在占用尽可能多的磁盘的分区上)或对两个分区进行 DUP,则存在即使一次磁头碰撞也可能立即破坏某些数据的两个副本(即所有副本)的风险。因此,这里的 DUP 有点违背了拥有两个分区的目的。请注意,这只是一个理论上的场景,因为在实践中,在初始碰撞后,无数来自受损区域的细小颗粒可能会落在其他区域并导致更多磁头碰撞,从而迅速导致大量数据丢失并使驱动器无法使用。不过,如果在这种情况下一个配置文件比另一个配置文件更好,那么 RAID1 就比 DUP 更好,而不是相反。

    可能会有性能损失,因此除非您有充分的理由(如上述原因之一),否则您想要提供给 btrfs 的任何磁盘的所有空间都应作为一个设备提供给它。当每个设备在物理上位于单独的磁盘上时,在多个设备上使用 Btrfs 最有意义。


    验证

    我也无法阅读源代码。我的主张基于以下观察:

    1. 在 4.5.1 之前,DUPmkfs.btrfs仅允许您将 DUP 与单个设备一起使用,但您可以通过在之后添加设备使其与多个设备一起使用mkfs.btrfs,这一事实有力地表明 DUP 旨在与单个设备一起使用,但在与多个设备一起使用时不会造成任何影响。我在man 8 mkfs.btrfsbtrfs-progs v6.2 中发现了这一事实。

    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,则存在“实际重复”。

    3. 类似地,我创建了一个大小为 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。

    • 2

相关问题

  • 如何启用 btrfs zstd 压缩

  • btrfs 增量快照:在发送的数据中查找 UUID

  • btrfs 增量快照同步:使用 rsync 引导

  • 如何通过文件系统级 RAID 仅对数据进行一次 dm-crypt 加密?

  • 如何在 btrfs 文件系统碎片整理中设置非默认 zstd 压缩级别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve