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 / 问题 / 464382
Accepted
sourcejedi
sourcejedi
Asked: 2018-08-24 04:15:28 +0800 CST2018-08-24 04:15:28 +0800 CST 2018-08-24 04:15:28 +0800 CST

使用 rename() 替换现有文件时,哪些文件系统需要 fsync() 以确保崩溃安全?

  • 772

在广泛抱怨之后,ext4 获得了auto_da_alloc默认启用的碰撞安全保证。其他文件系统呢?在最著名的文件系统中,哪些提供相同的保证(哪些不提供)?

就我个人而言,我有兴趣听到关于

  • XFS - Red Hat Enterprise Linux 默认文件系统。
  • btrfs - SuSE Enterprise 默认文件系统。
  • bcachefs - out-of-tree Linux 文件系统,源自 bcache。“不会吃掉你的数据的 Linux 的 COW 文件系统。”

根据下面的历史,这个问题主要与 Linux 有关。了解 ZFS 的行为方式也会很有趣,但我倾向于假设它不会实现这一点。

是什么auto_da_alloc?

fsync() 被详细记录为写入文件数据的正确方法,例如当您在文本编辑器中点击“保存”时。众所周知,例如文本编辑器必须使用 rename() 原子地替换现有文件。这是为了防止断电,确保您始终保留旧文件或获取新文件(在重命名之前已 fsync()ed)。您不希望只留下新文件的半写版本。

但是有一个问题是,在最流行的 Linux 文件系统 ext3 上调用 fsync() 可以有效地使整个系统挂起数十秒。由于应用程序对此无能为力,因此乐观地使用 rename() 而不使用 fsync() 是很常见的。即使系统断电,这种模式似乎在这个文件系统上运行得相当好。

因此,存在不正确使用 fsync() 的应用程序。

文件系统的下一个版本 ext4 通常避免了 fsync() 挂起。同时,它开始更多地依赖于 fsync() 的正确使用。

这一切都很糟糕。许多相互冲突的内核开发人员使用的不屑一顾的短语可能无助于理解这段历史。

这在 ext4 中得到了解决,到支持 rename() 模式,而不需要 fsync() 来确保崩溃安全提供崩溃时的行为,就像旧的 ext3 文件系统一样。如果您使用选项挂载,则可以再次禁用此行为noauto_da_alloc。

filesystems crash
  • 1 1 个回答
  • 3059 Views

1 个回答

  • Voted
  1. Best Answer
    sourcejedi
    2018-08-24T04:15:28+08:002018-08-24T04:15:28+08:00

    这个问题有一个错误。这个问题暗示这种情况是完全安全的auto_da_alloc。这不适用于 ext4。我认为在旧的 ext3 中也不是这样。但是对于 btrfs 和 bcachefs来说是这样。

    最近的 ext4 确实有一个特殊的解决方法,通过在重命名时强制删除新数据块来减少通过重命名替换产生零长度文件的机会。但是,重命名不会等待刷新完成,因此不提供原子性保证——崩溃后可能只得到部分新内容。在我们测试的文件系统中,btrfs 是唯一提供replace-via-rename 原子性保证的文件系统。

    https://homes.cs.washington.edu/~lijl/papers/ferrite-asplos16.pdf


    On btrfs,文档说使用 rename() 替换文件将提供完整的原子性,并且不需要显式的 fsync() 来保护数据免受崩溃。我认为这是与 ext4 大约同时添加的auto_da_alloc。我们还看到声称 btrfs 实现避免了性能下降,因为它不会导致 rename() 调用等待。但是我注意到在最近的内核中,至少如果你使用了 fsync(),下面的 rename() 将fsync() 父目录并等待整个“日志树”被写入。

    bcachefs目前似乎提供了全面的保护,尽管我没有找到任何文档。检查代码。 我看到对函数“filemap_write_and_wait_range”的调用

    XFS已拒绝为 rename() 添加崩溃安全解决方法。它显然获得了在不同情况下降低(但不消除)数据丢失风险的代码。

    UBIFS(例如在许多 Openwrt 设备上使用)不包括 rename() 的任何崩溃安全解决方法。它可以被接受,但需要大量工作。 http://www.linux-mtd.infradead.org/doc/ubifs.html#L_sync_exceptions

    • 6

相关问题

  • 我应该在 NAS 的 SD 卡中使用哪个文件系统?

  • 如何提前知道 .zip 内部是否有父目录

  • Virtualbox 动态分配磁盘 *.vdi 不断增长

  • du/df 和 ls 报告不同的磁盘使用情况

  • Linux 内核开发人员如何处理数百万行代码的工作?他们是一种方法吗?[关闭]

Sidebar

Stats

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

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

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • 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
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +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