Sync

sync — утилита Unix, предназначенная для обновления файловых систем и для синхронизации данных на диске с данными в памяти[1]. При этом выполняется системный вызов sync, который вызывает запись всех буферизованных изменений метаданных файлов и данных в базовые файловые системы. Он гарантирует, что все, что хранилось в памяти, будет записано на диск, предотвращая потерю данных, хранящихся в кеше, при аварийном завершении работы.

Также существует связный системный вызов int fsync(int fildes), запрашивающий передачу всех данных для дескриптора открытого файла с именем fildes к устройству хранения, связанному с файлом, описанным fildes .

   sync [--help] [--version]

Утилита sync инициирует сброс менеджером файловой системы из оперативной памяти всех измененных индексных дескрипторов и всех незаписанных системных буферов на диск. При этом обеспечивается сохранение всех изменений в файлах на этот запланированный момент. sync сперва записывает индексные дескрипторы (inode) в буферы и затем буферы на диск[2]

В Linux sync всего-лишь гарантирует, что будет составлен список «грязных» блоков, которые нужно записать. Прежде чем они действительно будут записаны, пройдет еще некоторое время. Команды reboot и halt учитывают это, делая паузу в несколько секунд после вызова

После выполнения команды sync необходимо обеспечить достаточную паузу для освобождения очередей драйверов и полного сохранения всех данных на диске. Длительность этой паузы зависит от скорости жесткого диска (дисков), количества буферов, которые необходимо обработать, и активности системы в данный период.

Операция sync расходует незначительный объем ресурсов CPU. Помимо этого, у нее есть следующие преимущества[3]:

  • Компактная запись данных.
  • Запись по крайней мере 28 КБ системных данных, даже если с момента предыдущего вызова sync не было выполнено ни одной операции ввода-вывода.
  • Ускорение записи данных на диск за счет отключения алгоритма отложенной записи. Это свойство особенно важно для тех программ, в которых после каждой операции записи выполняется операция fsync().
  • Создание при вызове sync() или fsync() записей в протоколе JFS о том, что измененные данные сохранены на диске.

Возврат из системного вызова sync, который вызывает одноимённая утилита, может произойти перед тем как запись будет фактически завершена. Однако, начиная с версии 1.3.30, Linux выполняет ожидание окончания записи, что, однако, не гарантирует целостность данных: современные диски имеют свои собственные большие кэши.[2]

Примечания

[править | править код]
  1. Ubuntu Manpage: sync - синхронизация данных на диске с данными в памяти. Дата обращения: 1 августа 2019. Архивировано 17 июля 2019 года.
  2. 1 2 Ubuntu Manpage: sync - записывает буферный кэш на диск. Дата обращения: 1 августа 2019. Архивировано 18 июля 2019 года.
  3. IBM Knowledge Center