Właśnie czytałem Birth
sekcję stat
i wydaje się, że ext4 powinien ją obsługiwać, ale nawet plik, który właśnie utworzyłem, pozostawia pusty.
~ % 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
Dlaczego moja ext4
partycja nie wypełnia tego pola?
filesystems
ext4
stat
ksenoterracid
źródło
źródło
/home/user/path/to/file
ponieważ/home
był na osobnej partycji. W takim przypadku podana ścieżkastat
musi być względna/home
. Przykład:sudo debugfs -R 'stat user/path/to/file' /dev/sda2
. Aby pozbyć się obsługi ścieżki, możemy podaćstat
numer i-węzła zamiast ścieżki:sudo debugfs -R "stat <$(stat -c %i /home/user/path/to/file)>" /dev/sda5
<
i>
-węzła są wymagane. Są one często używane w przykładach do otaczania zmiennej, którą należy dostosować, ale w tym przypadku należy je wprowadzić dosłownie. Bez nich numer i-węzła jest traktowany jako ścieżka i pojawia sięFile not found by ext2_lookup
błąd.Połączyłem to w prostą funkcję powłoki:
Następnie możesz go uruchomić
źródło
xstat
Funkcja nigdy nie połączyły się Mainline. Jednak nowestatx
wywołanie zostało zaproponowane później i zostało połączone w Linuksie 4.11 . Nowestatx(2)
wywołanie systemowe zawiera czas utworzenia w strukturze zwracanej. Opakowaniestatx(2)
zostało dodane do glibc dopiero w wersji 2.28 (wydanie sierpień 2018) . Wsparcie dla używania tego opakowania zostało dodane w GNU coreutils 8.31 (wydany w marcu 2019):Poniżej znajduje się demonstracja tego,
statx
gdzie użytkownik musi jeszcze nadrobić zaległości (starsze glibc lub coreutils). Nie jest łatwo wywoływać wywołania systemowe bezpośrednio w programie C. Zazwyczaj glibc zapewnia opakowanie, które ułatwia zadanie, ale na szczęście @whotwagner napisał przykładowy program C, który pokazuje, jak używaćstatx(2)
wywołania systemowego w systemach x86 i x86-64. Jego format wyjściowy jest taki sam, jakstat
domyślny, bez żadnych opcji formatowania, ale łatwo go zmodyfikować, aby wydrukować tylko datę urodzenia. (Jeśli masz wystarczająco dużo nowego glibc, nie będziesz go potrzebować - możesz użyćstatx
bezpośrednio zgodnie z opisem wman 2 statx
).Najpierw sklonuj:
Możesz skompilować
statx.c
kod lub, jeśli chcesz tylko czas urodzenia, utworzyćbirth.c
w sklonowanym katalogu następujący kod (który jest minimalną wersjąstatx.c
drukowania tylko znacznika czasu utworzenia, w tym precyzji nanosekundowej):Następnie:
Teoretycznie powinno to uczynić czas tworzenia dostępnym na większej liczbie systemów plików niż tylko ext * (
debugfs
jest narzędziem do systemów plików ext2 / 3/4 i nie nadaje się do użytku na innych). Działa dla systemu XFS, ale nie dla NTFS i exfat. Wydaje mi się, że systemy plików FUSE dla tych nie zawierały czasu utworzenia.źródło
Jest inny przypadek, w którym czas narodzin będzie pusty / zero / myślnik: rozmiar i-węzła Ext4 musi wynosić co najmniej 256 bajtów
crtime
. Problem występuje, jeśli początkowo utworzono system plików mniejszy niż 512 MB (domyślny rozmiar i-węzła to 128 bajtów, patrz/etc/mke2fs.conf
i stronamkfs.ext4
podręcznika).i / lub
Teraz sprawdź i-węzeł systemu plików (czy jest wystarczająco duży do przechowywania
crtime
?):Informacje techniczne: Na stronie Układ dysku Ext4 zwróć uwagę, że niektóre atrybuty tabel i-węzłów przekraczają 0x80 (128).
źródło
mke2fs.c
linii 1275Dla tego, co warto, czułem się pedantyczny, więc napisałem bash otoki wokół statystyki, aby w milczeniu wspierać crime za pomocą debugfs, aby pobrać go z bazowego systemu plików ext4, jeśli jest dostępny. Mam nadzieję, że jest solidny. Znajdź je tutaj .
Zauważ, że poprawka znajduje się na liście rzeczy do zrobienia dla Linuksa, jak udokumentowano w tym skrypcie. Więc to opakowanie ma nominalną żywotność tylko do momentu, gdy zostanie to zrobione i jest bardziej ćwiczeniem w tym, co jest wykonalne.
źródło
xstat()
ostatecznie został dodany do Linuksa, więc to tylko kwestia czasu, zanim GNU libcfind
doda wsparcie dla niego.