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