Gibt es noch keine Linux-Kernel-Oberfläche, um das Erstellungsdatum der Datei zu ermitteln?

21

Linux hat sich lange Zeit nicht mehr mit Dateierstellungsdaten beschäftigt, da sie von keinem der üblicherweise verwendeten Dateisysteme unterstützt wurden. Derzeit zeichnen jedoch zwei häufig verwendete Dateisysteme (NTFS und ext4) das Erstellungsdatum der Datei auf.

Der statBefehl wird jedoch weiterhin Birth: -auf einem ext4-Dateisystem ausgegeben, obwohl wir sehen können, dass ext4 das Erstellungsdatum der Datei mit gespeichert hat debugfs -R 'stat <inode_number>' /dev/file_device.

Als ich mir anschaute, warum das so ist, sah ich, dass jemand anderes bereits kürzlich einen Fehlerbericht darüber eingereicht hat, und die Antwort führt zu einem Upstream-Problem , das einfach besagt, dass es derzeit keine Linux-Kernel-Schnittstelle gibt, um diese Info [-Datei zu erhalten Erstellungsdatum]". Es scheint mir bemerkenswert zu sein, dass dies anscheinend immer noch der Fall ist, da Leute statdiese Informationen seit Jahren anfordern (und statein BirthFeld ausgeben , obwohl es es anscheinend noch nicht unterstützt! Wurde es in Erwartung hinzugefügt?)

Stimmt es also immer noch, dass es derzeit keine Linux-Kernel-Schnittstelle gibt, um das Datum der Dateierstellung zu ermitteln? Gibt es einen Plan, dies jemals umzusetzen?

Jez
quelle
1
Weitere Informationen finden Sie unter superuser.com/a/703927/38062 . Und genießen Sie unix.stackexchange.com/a/304245/5132, wenn Sie verwenden debugfs.
JdeBP
1
Yay! Nur 6 Jahre für Linus zu genehmigen :-)
Jez
ZFSzeichnet auch die Erstellungszeit von Dateien auf und ermöglicht den Abruf über erweiterte Attribute.
Schily

Antworten:

15

BEARBEITEN: Gute Nachricht, statx()wurde zusammengeführt und sollte in Release 4.11 verfügbar sein.


xstat () work, derzeit statx (), wurde 2016 überarbeitet.

Der Prozess war diesmal etwas disziplinierter (weniger Bikeshedding, Zustimmung, kontroverse Attribute fallen zu lassen, da sie später immer noch hinzugefügt werden können). Leider gab es immer noch Einwände gegen die genaue Schnittstelle und ich habe keine neueren Referenzen gesehen.

sourcejedi
quelle
Der Artikel, mit dem Sie verlinkt haben, ist ohne Abonnement nicht verfügbar. Ist es diese E-Mail? lkml.org/lkml/2017/3/5/149 Wenn Sie darauf verlinken, ist dies kostenlos.
Jez
@ Jez behoben. Der LWN-Link wird 7 Tage später verfügbar sein.
Sourcejedi
Ich verwende Kernel 4.11.2 auf Xubuntu 17.04 mit den neuesten Coreutils (8.27.37-02b65a-dirty), die aus der Git-Quelle kompiliert wurden. stat meldet immer noch leere Geburtszeit. Was ist falsch?
shrx
4

da sie von keinem der üblicherweise verwendeten Dateisysteme unterstützt wurden

Nach allem, was ich sagen kann (es tut mir leid, eine Reihe von Links, Speicher und Google-Informationen, die hier nicht als Referenz aufgeführt werden können), lag das nie daran, dass die Unterstreichungssysteme keine Erstellungszeitattribute unterstützten, sondern daran, dass keines von ihnen überhaupt etwas konnte stimme zu, dass es eine nützliche Funktion war.

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

POSIX legt drei Zeitstempel aus. Keiner von ihnen ist Erstellungszeit.

Wenn ich mich richtig erinnere, lautete das Argument wie folgt:

> 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.

Nun ist ein Großteil davon Gedächtnis und das Lesen einiger alter Mailinglisten. Ich habe auch nicht wirklich im Zentrum der Argumente gestanden. Ich war auf einer Mailing-Liste, weil einige Off-Shoot-Arbeiten in einem fetten Treiber für ein eingebettetes Linux-System durchgeführt wurden. Ich erwähne das, weil es mit Sicherheit mehr maßgebliche Quellen gibt als meine Erinnerung an etwas, das mir nur etwas bedeutet hat.

Ich erinnere mich, dass die große Sache eine Kombination aus der Tatsache ist, dass niemand einen guten Anwendungsfall finden kann, und dass sich niemand darauf einigen kann, wie das Feld für die anderen 40 häufig verwendeten Dateisysteme zu behandeln ist, die keine Erstellungszeit unterstützen. und selbst ein Name für das Feld wurde zu einer massiven Debatte.

coteyr
quelle
2
Beachten Sie, dass die Erstellungszeit in Dateisystemen, die dies unterstützen, immer als erweiterte Statistik verfügbar war . Es ist nur so, dass die Implementierung zum Abrufen dieser erweiterten Statistiken ziemlich unterschiedlich ist, daher gibt es keine Tools wie ls oder find. Das Argument ist, dass ls Details des Dateisystems kennen müsste, um die Informationen zu erhalten, und darum geht es in ls nicht.
Coteyr
1
Die Verwendung von so etwas wie debugfsdas Auslesen des Felds vom Disk-Image ist keine wirkliche Schnittstelle und erfordert sowieso privilegierten Zugriff.
Ilkkachu
Anscheinend waren die Argumente so, weil der Ort, an dem dies vor der Implementierung tatsächlich geändert werden sollte, in POSIX selbst liegt. :)
Jesse Adelman
2

Die Geburtszeit liegt in mehreren nativen Linux-Dateisystemen, nicht nur in ext4.

Seit Version 4.11 des Linux-Kernels (April 2017) gibt es einen neuen statx()Systemaufruf, um ihn abzurufen. Allerdings hat die entsprechende Wrapper - Funktion nicht auf das GNU libc hinzugefügt worden (Stand : 2018.06.26. 2019 bearbeiten jetzt in 2,28 hinzugefügt) und Tool wie GNU stat, ls, findwird nicht aktualisiert , es zu benutzen ( 2019-08- 22 edit GNU statauf GNU / Linux-Systemen mit glibc 2.28 oder höher unterstützt es seit coreutils 8.31)

Sie könnten es perlaber mit etwas tun :

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"

Wenn syscall.phdies nicht der Fall ist SYS_statx, können Sie es auch fest codieren. Es ist 332 auf AMD64-Architekturen. Oder Versuche:

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

Nun, diese Geburtszeit ist selten nützlich. Es ist nicht das Alter der Daten in der Datei (Daten werden in Dateien geschrieben, nachdem sie erstellt wurden) oder die Zeit, zu der die Datei unter diesem Namen in einem Verzeichnis angezeigt wurde (sie hätte auch unter einem anderen Namen erstellt und umbenannt oder verknüpft werden können) dort und der Inhalt oder die Attribute wurden mehrmals geändert).

Stéphane Chazelas
quelle
Wenn Linux vollständig unterstützt NFSv4würde, müssten erweiterte Attribute unterstützt werden, und es gibt einen möglichen Eintrag crtimein den erweiterten Attributen. Überprüfen Sie z. B. die Solaris- ls.cQuelle, mit der die Erstellungszeit der Datei gedruckt wird ls -l -% crtime.
Schily
@schily, Linux hat erweiterte Attribute und ntfs-3g, wie es normalerweise unter OpenSource-Betriebssystemen verwendet wird, wie Linux stellt die NTFS-Erstellungszeit tatsächlich als erweitertes Attribut zur Verfügung, obwohl ich seit 4.11 davon ausgehen würde, dass es auch über verfügbar ist statx(). Es gibt noch kein Standarddienstprogramm für die Schnittstelle statx()unter Linux, aber das Abrufen erweiterter Attribute wird seit Jahrzehnten unterstützt. Siehe Wie erhalte ich das Erstellungsdatum einer Datei auf einem logischen NTFS-Volume?
Stéphane Chazelas
Nun, erweiterte Linux-Attribute werden nach einem POSIX-Entwurf modelliert, der 1997 zurückgezogen wurde. NFSv4 definiert ein modernes erweitertes Attributsystem, mit dem NTFS-Dateistreams als Teilmenge unterstützt werden und auf das über geöffnete Attributverzeichnis der Datei zugegriffen wird openat(fd, ".", O_RDONLY|O_XATTR).
Schily
@ schily, Sie verwechseln hier mit ACLs. In der Tat unterstützt Linux NFSv4-ACLs noch nicht, außer mit einem inoffiziellen Patch, aber das hat wenig mit erweiterten Attributen zu tun (mit der Ausnahme, dass die ACLs normalerweise als erweiterte Attribute gespeichert werden). Linux unterstützt erweiterte Attribute, die in der Tat für diese POSIX-ACLs vom Typ Entwurf und für eine Reihe anderer Dinge verwendet werden. Und die API zum Abrufen dieser Attribute wird auch von ntfs-3g verwendet, um die Crtime anzuzeigen. Dies geschieht vermutlich auf ähnliche Weise wie unter Solaris.
Stéphane Chazelas
@schily, sieht so aus , als hätten Sie Wikipedia dazu Fehlinformationen hinzugefügt . Bitte repariere.
Stéphane Chazelas