Решение проблемы синхронизации кэшированных данных при копировании в Linux
Проблема заключается в том, что в ОС Linux (безотносительно дистрибутива) операция копирования выполняется с применением кэширования данных в область оперативной памяти. С одной стороны это ускоряет операцию, с другой - кэшированные данные из памяти должны быть физически записаны на носитель.
Не каждая программа, выполняющая копирование, автоматически сбрасывает кэш на носитель. Обычно (утилиты cp, mc и т.п.) этого не делают. В результате, после завершения процесса копирования выполняется процедура отмонтирования носителя (если его не отмонтировать, то понятно, что не записанные данные будут потеряны). Процедура отмонтирования может выполняться вручную (командами umount, sync), либо автоматизированно (обычно это реализуется в графических утилитах). В любом случае при отмонтировании на носитель будет сброшен кэш данных из памяти, что займет время (возможно, довольно длительное). Время записи кэша напрямую зависит от объема данных, которые нужно записать. Например, файл размером 4 гигабайта может записываться до 10 минут.
В других ОС (например, Windows) пользователи не сталкиваются с такой проблемой, видимо, по причине наличия автоматического сброса кэша непосредственно при копировании данных. Чтобы в Linux решить эту проблему, нужно собрать модуль, который необходимо загружать в память перед запуском утилиты копирования. Это позволит автоматически сбрасывать кэш данных при копировании (как в Windows).
Для выполнения данной инструкции в системе должны быть установлены пакеты:
- git
- cmake
- build-essential
Далее, нужно получить код модуля:
И собрать бинарный файл:
Теперь запустить файловый менеджер mc можно командой:
Для упрощения запуска программ с применением предварительной заргурзки модуля, можно создать скрипты.
Note
Интересно, что в графическом окружении fly (в Astra Linux) функция принудительного сброса кэша встроена в штатный файловый менеджер.