То, что вы видите, является результатом нескольких деталей реализации, поэтому приготовьтесь, и давайте начнем с некоторого фона.
stat
Во-первых, способ stat -f
работает это вызвать что-то вроде statfs()
и определить тип файловой системы, используя f_type
, который является одним из FS Magi c номеров .
Если вы посмотрите на маги c .h или на справочную страницу statfs (2) , вы увидите:
EXT2_SUPER_MAGIC 0xEF53
EXT3_SUPER_MAGIC 0xEF53
EXT4_SUPER_MAGIC 0xEF53
Все они имеют те же самые маги c, поэтому stat
не может на самом деле отличить их друг от друга, поэтому в общих чертах написано «Тип: ext2 / ext3» для всех файловых систем ext.
mount
Далее , вывод mount
.
mount
работает путем перехода к /proc/self/mountinfo
, и информация, предоставленная ядром, не содержит фактический тип файловой системы. Скорее, он содержит тип файловой системы , который команда mount
использовала для монтирования файловой системы. ext4 регистрирует 3 таких типа , ext2, ext3 и ext4.
А именно, драйвер ext4 может обрабатывать все 3 файловые системы, и если ядро настроено на использование только драйвера ext4, это драйвер, который будет использоваться.
Фактическая файловая система на диске
Итак, как вы узнаете, какой тип файловой системы у вас на самом деле есть на диске?
Нет. Архитектура ext работает не на основе версий, а на функциях .
. Вы можете запросить функции вашей файловой системы следующим образом:
# dumpe2fs /dev/sda | grep -e 'Filesystem features:' -e 'Inode size:'
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Inode size: 256
, и вы можете изменить функции файловой системы с использованием tune2fs(8)
. Все эти программы являются частью пакета e2fsprogs .
Начальные значения этих функций установлены во время mkfs(8)
.
Реализация наносекунд
Причина, по которой ext3 не может реализовать метки времени с наносекундной точностью, заключается в том, что inode - структура данных файловой системы, представляющая метаданные файла, изначально составляла всего 128 байт . Просто не хватило места для дополнительной точности.
С течением времени по умолчанию было 256, не ради наносекунд, а ради расширенных атрибутов.
ext4, с другой стороны, начал с большего инода, в котором было место для меток времени с наносекундной точностью.
Как все это собралось
Теперь мы готовы ответить на вопросы.
- Почему моя старая система ext3 поддерживает точность наносекунд?
mkfs в Ubuntu 12.04 устанавливает индекс inode файловой системы равным 256 байтам.
Затем он монтировал его с помощью ext3, но тип файловой системы ext3 был настроен для обработки драйвером ext4.
Но после монтирования ext4 это не волновало - любая модификация метки времени показала, что для работы с 256 байтами и написал наносекунды.
Почему новый ext4 ограничен миллисекундами? Вместо этого он форматируется как ext3?
Ни ext3, ни ext4 не работают с миллисекундами.
Возможно, ваши часы не имеют наносекундного разрешения, которое вы можно проверить, запустив
date +%s.%N
Как я могу выяснить, что не так, и включить наносекунды в новом?
Предполагая, что ваши часы имеют разрешение наносекунд, вы можете использовать вышеуказанные инструменты, dumpe2fs
и tune2fs
, чтобы исправить файловую систему.
Кроме того, e2fsprogs 'mkfs на самом деле смотрит на /etc/mke2fs.conf
, так что вы также можете проверить настройки там в следующий раз вам нужно создать файловую систему.