Ich habe gerade den Birth
Abschnitt von gelesen stat
und es sieht so aus, als ob ext4 ihn unterstützen sollte, aber selbst eine Datei, die ich gerade erstellt habe, lässt ihn leer.
~ % touch test slave-iv
~ % stat test.pl slave-iv
File: ‘test.pl’
Size: 173 Blocks: 8 IO Block: 4096 regular file
Device: 903h/2307d Inode: 41943086 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/xenoterracide) Gid: ( 100/ users)
Access: 2012-09-22 18:22:16.924634497 -0500
Modify: 2012-09-22 18:22:16.924634497 -0500
Change: 2012-09-22 18:22:16.947967935 -0500
Birth: -
~ % sudo tune2fs -l /dev/md3 | psp4 slave-iv
tune2fs 1.42.5 (29-Jul-2012)
Filesystem volume name: home
Last mounted on: /home
Filesystem UUID: ab2e39fb-acdd-416a-9e10-b501498056de
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: journal_data
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 59736064
Block count: 238920960
Reserved block count: 11946048
Free blocks: 34486248
Free inodes: 59610013
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 967
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
RAID stride: 128
RAID stripe width: 256
Flex block group size: 16
Filesystem created: Mon May 31 20:36:30 2010
Last mount time: Sat Oct 6 11:01:01 2012
Last write time: Sat Oct 6 11:01:01 2012
Mount count: 14
Maximum mount count: 34
Last checked: Tue Jul 10 08:26:37 2012
Check interval: 15552000 (6 months)
Next check after: Sun Jan 6 07:26:37 2013
Lifetime writes: 7255 GB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
First orphan inode: 55313243
Default directory hash: half_md4
Directory Hash Seed: 442c66e8-8b67-4a8c-92a6-2e2d0c220044
Journal backup: inode blocks
Warum füllt meine ext4
Partition dieses Feld nicht aus?
filesystems
ext4
stat
Xenoterracid
quelle
quelle
/home/user/path/to/file
da/home
sich diese auf einer separaten Partition befand. In diesem Fall muss der angegebene Pfadstat
relativ zu sein/home
. Beispiel:sudo debugfs -R 'stat user/path/to/file' /dev/sda2
. Um diestat
sudo debugfs -R "stat <$(stat -c %i /home/user/path/to/file)>" /dev/sda5
<
und>
um die Inode-Nummer erforderlich sind. Sie werden häufig in Beispielen verwendet, um eine Variable zu umgeben, die angepasst werden soll. In diesem Fall müssen sie jedoch wörtlich eingegeben werden. Ohne sie wird die Inode-Nummer als Pfad behandelt, und Sie erhalten eineFile not found by ext2_lookup
Fehlermeldung.Ich habe dies zu einer einfachen Shell-Funktion kombiniert:
Sie können es dann mit ausführen
quelle
Die
xstat
Funktion wurde nie mit der Hauptlinie zusammengeführt. Ein neuerstatx
Aufruf wurde jedoch später vorgeschlagen und in Linux 4.11 zusammengeführt . Der neuestatx(2)
Systemaufruf enthält eine Erstellungszeit in seiner Rückgabestruktur. Ein Wrapper fürstatx(2)
wurde erst in 2.28 (Release August 2018) zu glibc hinzugefügt . Unterstützung für die Verwendung dieses Wrappers wurde in GNU Coreutils 8.31 (veröffentlicht im März 2019) hinzugefügt :Was folgt, ist eine Demo,
statx
wo Userland noch aufholen muss (ältere glibc oder coreutils). Es ist nicht einfach, Systemaufrufe direkt in einem C-Programm aufzurufen. Normalerweise stellt glibc einen Wrapper zur Verfügung, der die Arbeit erleichtert, aber zum Glück hat @whotwagner ein Beispiel-C-Programm geschrieben , das zeigt, wie derstatx(2)
Systemaufruf auf x86- und x86-64-Systemen verwendet wird. Die Ausgabe hat dasselbe Format wiestat
die Standardausgabe, jedoch ohne Formatierungsoptionen. Es ist jedoch einfach, das Format so zu ändern, dass nur die Geburtszeit gedruckt wird. (Wenn Sie einen neuen Glibc haben, brauchen Sie diesen nicht - Sie können ihnstatx
direkt wie in beschrieben verwenden.man 2 statx
)Zuerst klonen Sie es:
Sie können den
statx.c
Code kompilieren oder, wenn Sie nur die Geburtszeit möchten,birth.c
im geklonten Verzeichnis einen mit folgendem Code erstellen (dies ist eine minimale Version desstatx.c
Ausdrucks nur des Erstellungszeitstempels einschließlich der Genauigkeit von Nanosekunden):Dann:
Theoretisch sollte dies die Erstellungszeit auf mehr Dateisystemen als nur den ext * -Dateisystemen zugänglich machen (
debugfs
ist ein Werkzeug für ext2 / 3/4-Dateisysteme und auf anderen unbrauchbar). Es hat für ein XFS-System funktioniert, aber nicht für NTFS und exfat. Ich denke, die FUSE-Dateisysteme für diese enthielten nicht die Erstellungszeit.quelle
In einem anderen Fall ist die Geburtszeit leer / Null / Bindestrich: Die Inode-Größe von Ext4 muss mindestens 256 Byte betragen, um gespeichert zu werden
crtime
. Das Problem tritt auf, wenn Sie ursprünglich erstellt das Dateisystem kleiner als 512 MB (Standardeinstellung Inode Größe werden 128 Bytes sein, sehen/etc/mke2fs.conf
undmkfs.ext4
manpage).und / oder
Überprüfen Sie nun den Dateisystem-Inode (ist er groß genug, um ihn zu speichern
crtime
?):Technische Informationen: Beachten Sie auf der Seite Ext4-Festplattenlayout , dass einige Attribute der Inode-Tabellen größer als 0x80 (128) sind.
quelle
mke2fs.c
Zeile 1275Für das, was es wert ist, fühlte ich mich pedantisch, also schrieb ich einen Bash-Wrapper um stat, um Crtime stillschweigend zu unterstützen, indem ich Debugfs verwendete, um es von einem zugrunde liegenden ext4-Dateisystem abzurufen, falls verfügbar. Ich hoffe es ist robust. Hier finden Sie es .
Beachten Sie, dass ein Fix angeblich in der Aufgabenliste für Linux enthalten ist, wie in diesem Skript dokumentiert. Dieser Wrapper hat also nur eine nominelle Lebensdauer, bis dies erledigt ist, und ist eher eine Übung in dem, was machbar ist.
quelle
xstat()
Linux irgendwann hinzugefügt wurde, so dass es nur eine Frage der Zeit ist, bis die GNU libc und derenfind
Unterstützung hinzugefügt werden.