2

В некоторых файловых системах при создании файла необходимо вызывать fsync() не только для самого файла, но и для родительского каталога, чтобы сделать создание файла долговременным. В противном случае запись каталога может быть потеряна из-за нечистого размонтирования; Индекс файла будет потерян.

Это все еще верно для ext4, или журнал об этом позаботится?

Многие приложения (например, vim, как проверено strace), похоже, вызывают fsync только для файла. Это безопасно?

Обновление: в коммите 14ece1028b3ed53ffec1b1213ffc6acaf79ad77c для ядра, ext4 специально изменяется так, что при отключенном ведении журнала запись родительского каталога автоматически fsync() редактируется при fsync() самого файла. Но как насчет включенного ведения журнала? Является ли каталог fsync() неявным, поскольку он является частью той же транзакции, что и создание нового inode?

1 ответ1

2

Я бы сказал, что "это зависит" отчасти, потому что в ext4 могут быть изменены параметры журнала, так что регистрируются целые файлы или только метаданные, и то, будут ли они зафиксированы немедленно, зависит частично от конфигурации оборудования.

В случае, когда ext4 монтируется как минимум с ведением журнала метаданных, а подсистема не кэширует записи, я бы посоветовал вам не выполнять синхронизацию каталога.

Однако из "ext4 vs fsync" Ларссона:

Следует отметить, что POSIX и даже ext4 не дают никаких гарантий, что файл переживет сбой системы даже при использовании fsync.

Не полный ответ, но рассматриваемый пост в блоге посвящен вопросам журналирования и потери данных. Хотя он и не недавний, я считаю, что он по-прежнему отражает состояние ext4 сегодня, и его комментарии о том, когда использовать или не использовать fsync, заслуживают внимания.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .