Перейти к содержанию

Решение проблемы синхронизации кэшированных данных при копировании в Linux

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

Не каждая программа, выполняющая копирование, автоматически сбрасывает кэш на носитель. Обычно (утилиты cp, mc и т.п.) этого не делают. В результате, после завершения процесса копирования выполняется процедура отмонтирования носителя (если его не отмонтировать, то понятно, что не записанные данные будут потеряны). Процедура отмонтирования может выполняться вручную (командами umount, sync), либо автоматизированно (обычно это реализуется в графических утилитах). В любом случае при отмонтировании на носитель будет сброшен кэш данных из памяти, что займет время (возможно, довольно длительное). Время записи кэша напрямую зависит от объема данных, которые нужно записать. Например, файл размером 4 гигабайта может записываться до 10 минут.

В других ОС (например, Windows) пользователи не сталкиваются с такой проблемой, видимо, по причине наличия автоматического сброса кэша непосредственно при копировании данных. Чтобы в Linux решить эту проблему, нужно собрать модуль, который необходимо загружать в память перед запуском утилиты копирования. Это позволит автоматически сбрасывать кэш данных при копировании (как в Windows).

Для выполнения данной инструкции в системе должны быть установлены пакеты:

  • git
  • cmake
  • build-essential

Далее, нужно получить код модуля:

git clone https://github.com/i-rinat/autofsync.git

И собрать бинарный файл:

cd autosync
cmake .
cmake --build .

Теперь запустить файловый менеджер mc можно командой:

LD_PRELOAD=/home/user/src/autofsync/autofsync.so mc

Для упрощения запуска программ с применением предварительной заргурзки модуля, можно создать скрипты.

Note

Интересно, что в графическом окружении fly (в Astra Linux) функция принудительного сброса кэша встроена в штатный файловый менеджер.