【问题标题】:Atomic file save on Linux without losing metadata在 Linux 上保存原子文件而不会丢失元数据
【发布时间】:2009-11-07 18:06:26
【问题描述】:

我正在开发基于 Perl 的文件同步工具。它将文件下载到一个临时目录(保证与真实文件在同一个文件系统上),然后将临时文件移动到旧文件上,保留权限、所有权和 ACL 等元数据。我想知道如何在 Linux 上实现最后一步。

在 Mac OS X 上,至少在 C 中,我会使用 exchangedata 函数。这需要两个文件名作为参数并交换它们的内容,使所有元数据(除了 mtime)保持不变。它保证了操作是原子的——所有的读者都可以看到旧文件或新文件,而不会介于两者之间。不幸的是,我认为它在 Linux 上不可用。

我知道rename 自动移动,但它不保留元数据。另一方面,我可以打开文件并用新文件的内容覆盖数据,这将保留所有元数据,但不是原子操作。有什么解决这个问题的建议吗?

【问题讨论】:

  • 您正在努力保存什么样的元数据? Unix 中只有所有者/组和所有者/组/每个人的权限。这是否会发生如此大的变化以至于对您来说是个问题?
  • 许多 Linux 文件系统也支持扩展属性和 ACL,非特权用户可能没有必要的权限将临时文件的用户和组更改为旧的。基本上,这里涉及很多微妙之处,我想知道是否已经存在处理它的东西。

标签: linux perl macos file atomic


【解决方案1】:

我在这里看到的唯一方法是从您要替换的文件中读取元数据,将其应用于临时文件,然后将临时文件重命名为旧文件。 (rename 显然保留了源文件属性。)

【讨论】:

  • 不过,很难知道所有正确的元数据是什么。有文件属性、扩展属性、ACL、安全标签、文件功能和其他文件系统或系统特定的东西......
  • 这听起来像是一个很好的开始清单。 “善的敌人是伟大的。”
  • 是的,如果没有完整的解决方案(到目前为止似乎还没有),那么至少部分解决问题总比没有好。甚至rsync 也有一组它知道/关心的有限元数据。
【解决方案2】:

文件系统特定,但是...

XFS_IOC_SWAPEXT ioctl 交换XFS 上两个文件描述符的范围。

#include <xfs/xfs.h>
#include <xfs/xfs_dfrag.h>

xfs_swapext_t sx = {
    ...,
    .sx_fdtarget = fd1,
    .sx_fdtmp    = fd2,
    ...
};
xfs_swapext(fd1, &sx);

请参阅xfs_fsr 的来源,例如用法。

【讨论】:

    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 2012-03-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多