Я только что прочитал Birth
раздел, stat
и кажется, что ext4 должен его поддерживать, но даже файл, который я только что создал, оставляет его пустым.
~ % 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
Почему мой ext4
раздел не заполняет это поле?
filesystems
ext4
stat
xenoterracide
источник
источник
/home/user/path/to/file
потому что он/home
был на отдельном разделе. В этом случае предоставленный путьstat
должен быть относительно/home
. Пример:sudo debugfs -R 'stat user/path/to/file' /dev/sda2
. Чтобы избавиться от обработки пути, мы можем предоставитьstat
номерsudo debugfs -R "stat <$(stat -c %i /home/user/path/to/file)>" /dev/sda5
<
и>
вокруг номера инода требуются. Они часто используются в примерах для окружения переменной, которая должна быть скорректирована, но в этом случае они должны вводиться буквально. Без них номер индекса рассматривается как путь, и вы получаетеFile not found by ext2_lookup
ошибку.Я объединил это в простую функцию оболочки:
Затем вы можете запустить его с
источник
xstat
Функция никогда не была объединена в магистральную линию. Однакоstatx
позже был предложен новый вызов , который был объединен в Linux 4.11 . Новыйstatx(2)
системный вызов включает время создания в свою структуру возврата. Оболочка дляstatx(2)
была добавлена в glibc только в версии 2.28 (выпуск август 2018) . И поддержка использования этой оболочки была добавлена в GNU coreutils 8.31 (выпущена в марте 2019 года):Далее следует демонстрация того,
statx
где пользовательская область еще не успела догнать (более старые glibc или coreutils). Непросто вызывать системные вызовы непосредственно в программе на Си. Обычно glibc предоставляет оболочку, которая облегчает работу, но, к счастью, @whotwagner написал пример программы на C, которая показывает, как использоватьstatx(2)
системный вызов в системах x86 и x86-64. Его вывод имеет тот же формат, чтоstat
и по умолчанию, без каких-либо параметров форматирования, но его просто изменить, чтобы вывести только время рождения. (Если у вас достаточно новый glibc, он вам не понадобится - вы можете использоватьstatx
напрямую, как описано вman 2 statx
).Сначала клонируем это:
Вы можете скомпилировать
statx.c
код или, если вам нужно только время рождения, создатьbirth.c
в клонированном каталоге следующий код (это минимальная версияstatx.c
печати только метки времени создания, включая наносекундную точность):Затем:
Теоретически это должно сделать время создания доступным для большего количества файловых систем, чем только для ext * (
debugfs
это инструмент для файловых систем ext2 / 3/4, и его нельзя использовать в других). Это работало для системы XFS, но не для NTFS и exfat. Я предполагаю, что файловые системы FUSE для них не включают время создания.источник
Есть еще один случай, когда время рождения будет пустым / ноль / тире: размер Inode в Ext4 должен быть не менее 256 байт для хранения
crtime
. Проблема возникает, если вы изначально создали файловую систему размером менее 512 МБ (размер Inode по умолчанию будет 128 байт, см./etc/mke2fs.conf
Иmkfs.ext4
man-страницу).и / или
Теперь проверьте inode файловой системы (достаточно ли она велика для хранения
crtime
?):Техническая информация: На странице Ext4 Disk Layout обратите внимание, что некоторые атрибуты таблиц inode больше 0x80 (128).
источник
mke2fs.c
строке 1275Для чего бы это ни стоило, я чувствовал себя педантично, поэтому написал оболочку bash вокруг stat, чтобы молча поддерживать crtime, используя debugfs для извлечения его из базовой файловой системы ext4, если она доступна. Я надеюсь, что это надежно. Найдите это здесь .
Обратите внимание, что исправление якобы находится в списке задач для Linux, как описано в этом сценарии. Таким образом, эта оболочка имеет номинальную продолжительность жизни только до тех пор, пока это не будет сделано, и это скорее упражнение в том, что выполнимо.
источник
xstat()
конце концов он был добавлен в Linux, так что это только вопрос времени, когда GNU libcfind
добавит поддержку для него.