Точность временных меток файла - ext3 с наносекундами, ext4 с миллисекундами - PullRequest
2 голосов
/ 25 марта 2020

Говорят, что ext3 поддерживает точность отметки времени файла до секунд и ext4 до наносекунд ...

Что происходит, когда мой старый VPS работает под управлением Ubuntu 12.04 с файловой системой ext3 всегда (насколько я могу помните) очень красиво поддерживаются наносекунды, например:

  File: `auth.log'
  Size: 147744      Blocks: 304        IO Block: 4096   regular file
Device: 800h/2048d  Inode: 32019       Links: 1
Access: (0640/-rw-r-----)  Uid: (  101/  syslog)   Gid: (    4/     adm)
Access: 2020-03-20 00:18:33.634687690 -0300
Modify: 2020-03-24 05:12:48.777610222 -0300
Change: 2020-03-24 05:12:48.777610222 -0300
 Birth: -

mount выдержка:

/dev/sda on / type ext3 (rw,noatime,errors=remount-ro)

stat -f:

  File: "auth.log"
    ID: 5483af2794a91010 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 3870084    Free: 272230     Available: 75643
Inodes: Total: 923520     Free: 829980
root@mail:~# df -mT
Filesystem     Type     1M-blocks  Used Available Use% Mounted on
/dev/sda       ext3         15118 14055       296  98% /
devtmpfs       devtmpfs      1973     1      1973   1% /dev
none           tmpfs          395     1       395   1% /run
none           tmpfs            5     0         5   0% /run/lock
none           tmpfs         1973     0      1973   0% /run/shm

Теперь я купил новый VPS, обновил его до Ubuntu 20.04 (пре-бета), он имеет файловую систему, смонтированную как ext4 ...

  File: auth.log
  Size: 723967      Blocks: 1424       IO Block: 4096   regular file
Device: ca03h/51715d    Inode: 398412      Links: 1
Access: (0640/-rw-r-----)  Uid: (  104/  syslog)   Gid: (    4/     adm)
Access: 2020-03-24 00:00:05.676000000 -0300
Modify: 2020-03-24 05:14:56.644000000 -0300
Change: 2020-03-24 05:14:56.644000000 -0300
 Birth: -

mount выдержка:

/dev/xvda3 on / type ext4 (rw,noatime,nobarrier,errors=remount-ro,stripe=32564)

Но как ни странно stat -f говорит, что это ext3:

  File: "auth.log"
    ID: 7e8a03105e52b018 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 9857995    Free: 7434726    Available: 7007355
Inodes: Total: 2505120    Free: 2403794
root@mailnew:~# df -mT
Filesystem     Type     1M-blocks  Used Available Use% Mounted on
udev           devtmpfs       430     0       430   0% /dev
tmpfs          tmpfs           95     2        94   2% /run
/dev/xvda3     ext4         38508  9466     27373  26% /
tmpfs          tmpfs          473     0       473   0% /dev/shm
tmpfs          tmpfs            5     0         5   0% /run/lock
tmpfs          tmpfs          473     0       473   0% /sys/fs/cgroup
/dev/loop0     squashfs        54    54         0 100% /snap/lxd/11348
/dev/loop1     squashfs        92    92         0 100% /snap/core/8689
/dev/xvda1     ext4           727   183       502  27% /boot
tmpfs          tmpfs           95     0        95   0% /run/user/0

Наконец, мои вопросы :

  1. Почему моя старая система ext3 поддерживает точность в наносекундах?

  2. Почему новая ext4 ограничена миллисекундами? Вместо этого он форматируется как ext3?

  3. Как понять, что не так, и включить наносекунды в новом?

1 Ответ

1 голос
/ 25 марта 2020

То, что вы видите, является результатом нескольких деталей реализации, поэтому приготовьтесь, и давайте начнем с некоторого фона.

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, с другой стороны, начал с большего инода, в котором было место для меток времени с наносекундной точностью.

Как все это собралось

Теперь мы готовы ответить на вопросы.

  1. Почему моя старая система 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, так что вы также можете проверить настройки там в следующий раз вам нужно создать файловую систему.

...