仍然没有Linux内核接口来获取文件创建日期吗?


21

长期以来,Linux一直没有对文件创建日期感到困扰,因为它通常使用的文件系统都不支持它们。但是现在,两个常用的文件系统(NTFS和ext4)都记录了文件创建日期。

stat但是,Birth: -即使我们可以看到ext4使用来存储了文件的创建日期,该命令仍然在ext4文件系统上输出debugfs -R 'stat <inode_number>' /dev/file_device

当我调查这是为什么时,我发现其他人最近已经提交了一个错误报告,并且响应链接到一个上游问题,该问题简单地指出“目前没有Linux内核接口来获取该信息[file创立日期]”。在我看来,这显然仍然是事实,因为人们多年来一直要求stat显示此信息(并且stat输出一个Birth字段,即使它显然还不支持它!他们是否在预期中添加了它?)

因此,目前尚无Linux内核接口来获取文件创建日期是否仍然正确?是否有实施此计划的计划?


1
有关某些背景,请参见superuser.com/a/703927/38062。使用时,请享受unix.stackexchange.com/a/304245/5132debugfs
JdeBP '16

1
好极了!Linus批准仅6年:-)
Jez

ZFS还记录文件创建时间,并允许通过扩展属性进行检索。
2016年

Answers:


15

编辑:好消息,statx()已被合并,因此它应该在4.11版中可用。


xstat()工作(当前为statx())于2016年进行了修订。

这次的过程更加严格(减少了流离失所的次数,同意删除有争议的属性,因为以后可以随时添加它们)。不幸的是,仍然有人反对确切的界面,而且我还没有看到任何最新的参考文献。


如果没有订阅,则链接到的文章不可用。这是电子邮件吗? lkml.org/lkml/2017/3/5/149 如果这样链接,它是免费的。
杰兹(Jez)

@Jez修复。LWN链接将在7天后可用。
sourcejedi

我正在Xubuntu 17.04上运行内核4.11.2,并从git源编译了最新的coreutils(8.27.37-02b65a-dirty)。stat仍报告空的出生时间。怎么了?
shrx

4

因为它通常使用的文件系统都不支持它们

据我所知(抱歉,一堆链接,内存和信息,没有足够的凝聚力在这里列出作为参考),这从来不是因为下划线系统不支持创建时间属性,而是因为它们甚至都不支持创建时间属性同意这是一个有用的功能。

参见http://www.pathname.com/fhs/pub/fhs-2.3.html

POSIX列出了三个时间戳。他们都不是创造时间。

如果我没记错的话,该参数类似:

> Give me a use case where we can't already do that using what we already have.
< Some examples were submitted
> All of these are convoluted beyond usefulness. 
> Ok, Ok, *maybe* a couple of these don't suck. 
> Now how do you see handling file systems that don't track this?
< several ideas that were not the same. 
< Basically everyone had a special case that would work, but not 
< one that always works. Fight about fallbacks and other special handling. 
> Ok, lets table that for now. What should we call this field
< At least 6 different answers emerged.
> So, you want to break POSIX standards, 
> you can't really come up with a good reason why, 
> you can't come up with a good fall back, and 
> you can't even come up with a name. 
> Sounds like it's specific to the file system to me, and that 
> should be "extended data" accessible by tools and not as 
> a core stat in the Kernel.

现在,很多都是记忆和阅读一些旧的邮件列表。我也不是争论的中心。我之所以在邮件列表中,是因为在嵌入式Linux系统的胖驱动程序中有一些外购工作。我提到这一点,是因为肯定有比我更关心的东西比我记忆中更多的权威资料。

我确实记得这很重要,这是因为没有人能提出一个好的用例,没有人能就如何处理其他40个不支持创建时间的常用文件系统达成共识,甚至为该领域想出一个名字也引起了巨大的争议。


2
请记住,支持它的文件系统中的创建时间始终可以作为扩展统计信息进行访问。只是获得这些扩展统计信息的实现方式相差很大,因此ls或find之类的工具中没有。争论是ls必须知道文件系统的详细信息才能获取信息,而ls并不是。
coteyr

1
使用类似的方法debugfs来读取磁盘映像中的字段并不是一个接口,它仍然需要特权访问。
ilkkachu

似乎是争论的原因是,在考虑应该在实现之前实际更改它的位置是在POSIX本身中。:)
杰西·阿德尔曼

2

诞生时间是在多个Linux本机文件系统中,而不仅仅是ext4。

自Linux内核4.11版(2017年4月)以来,有一个新的statx()系统调用来检索它。然而,相应的包装功能尚未加入到GNU libc的,但(如2018年6月26日。的2019编辑目前在2.28加的),像GNU工具statlsfind尚未更新使用它(2019-08- 22stat在具有glibc 2.28或更高版本的GNU / Linux系统上编辑 GNU 支持它,因为coreutils 8.31)

您可以通过以下方式完成此操作perl

perl -MPOSIX -e '
  require "syscall.ph";
  $buf = "\0" x 0x100; # enough space for a struct statx
  for (@ARGV) {
    # hardcode: AT_FDCWD == -100
    #           AT_SYMLINK_NOFOLLOW = 0x100 (lstat()-like)
    #           STATX_BTIME = 0x800 for the mask
    #           80: offset of the btime in the struct
    syscall(&SYS_statx, -100, $_, 0x100, 0x800, $buf) == 0
      or die "$_: $!\n";
    ($t, $n) = unpack("x80QQ", $buf);
    $n = sprintf("%09d", $n);
    print strftime("%F %T.$n %z\n", localtime $t)
  }' -- "$file"

如果您syscall.ph没有SYS_statx,也可以对其进行硬编码。在amd64体系结构上为332。或尝试:

printf '#include <syscall.h>\n__NR_statx\n' | gcc -E -xc - | tail -n 1

现在,出生时间几乎没有用。这不是文件中数据的存在时间(数据在创建后即写入文件中),也不一定是该名称在目录中出现文件的时间(它可能已被创建为其他名称并重命名或链接了)在那里,内容或属性在两次之间进行了多次更改。


如果Linux确实完全支持NFSv4,则将需要支持扩展属性,并且扩展属性中可能会有一个条目crtime。例如,使用来检查ls.c打印文件创建时间的Solaris 源ls -l -% crtime
schily

@ schily,Linux具有扩展属性,而像Linux之类的开源OS上通常使用的ntfs-3g确实将NTFS创建时间公开为扩展属性,尽管从4.11开始,我希望它也可以通过获得statx()statx()在Linux 上尚无可与之接口的标准实用程序,但是数十年来一直支持检索扩展属性。请参阅如何获取NTFS逻辑卷上文件的创建日期?
斯特凡Chazelas

很好的Linux扩展属性是根据1997年撤消的POSIX草案建模的。NFSv4定义了现代的扩展属性系统,该系统允许将NTFS文件流作为子集来支持,并可以通过文件的属性目录(通过打开)访问openat(fd, ".", O_RDONLY|O_XATTR)
schily

@schily,您在这里与ACL混淆。确实,Linux除了不官方的补丁程序外,不支持NFSv4 ACL,但是与扩展属性无关(除了ACL通常存储为扩展属性)。Linux确实支持扩展属性,它确实用于那些POSIX草稿类型的ACL以及许多其他事情。我想以与Solaris相似的方式,ntfs-3g也使用用于检索这些属性的API来公开crtime。
斯特凡Chazelas

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.