Я пытаюсь синхронизировать дерево папок между несколькими компьютерами. В настоящее время я использую unison
топологию «звезда» с центральным удаленным сервером. Я хочу, чтобы данные на сервере были зашифрованы, поэтому на сервере дерево unison
(включая .unison
папку) хранится внутри encfs
дерева. Чтобы выполнить синхронизацию, каждый клиент:
- монтирует хранилище сервера с помощью
sshfs
- монтирует
encfs
хранилищеsshfs
локально - выполняет
unison
между локальной копией документов и смонтированной.
Установка имеет много преимуществ:
- инструменты с открытым исходным кодом
- скриптовое решение командной строки
- безопасная связь через
ssh
- конфиденциальность от сервера, поскольку
encfs
дерево папок там никогда не расшифровывается - возможность различать модификации во время синхронизации, поскольку
unison
работает поверх открытого текста
Одна вещь, которая работает не очень хорошо, это скорость синхронизации. Поскольку папка encfs
с сервера монтируется на клиенте, каждый stat()
вызов клиента должен быть перенаправлен ssh
на сервер. Дерево документов уже содержит тысячи файлов, и синхронизация unison
должна выполнить как минимум один stat()
вызов для каждого файла (чтобы исключить изменения относительно состояния, сохраненного в .unison
папке). Есть ли более быстрая альтернатива, которая сохраняет перечисленные выше преимущества?
Примечание: Если бы я убрал последнее условие, я мог бы запустить unison
поверх cyphertext и монтировать encfs
дерево только локально. Затем unison
я бы запустил локально на клиенте и на сервере, поэтому stat()
вызовы были бы быстрыми. Но приятно иметь возможность видеть, по крайней мере, какие файлы синхронизируются; при unison
использовании encfs
cyphertext имена файлов были бы зашифрованы.
Я понимаю, что для решения этой проблемы необходимо эффективно передавать метаданные файлов с сервера на клиент во время синхронизации. Мне интересно, есть ли способ (т. е. комбинация существующих инструментов), например, хранить метаданные в одном месте, чтобы все они передавались путем отправки только одного (или нескольких) блока(ов) данных, вместо отправки тысяч блоков (что и stat()
делает переадресация вызовов).
Что если бы я заменил encfs
, скажем, разделом ext4
over dm-crypt
, хранящимся внутри большого файла на сервере, и смонтированным на клиенте через losetup
over sshfs
? Будет ли ext4
файловая система хранить метаданные файла вместе, так что они будут передаваться путем отправки только нескольких блоков? Будет ли sshfs
знать, что нужно отправить только несколько блоков во время обновления, вместо того, чтобы перезаписывать весь зашифрованный файл?
решение1
У меня был успех с ext4
over luks
over sshfs
. Я обнаружил, что запуск unison
на монтируемом устройстве такого типа намного, намного быстрее, чем over encfs
over sshfs
. Так что, должно быть, эти тысячи stat()
структур каким-то образом объединены в ext4
fs, так что им требуется меньше сетевого трафика во время синхронизации.
Одна вещь, которая немного раздражает, это то, что ext4
файловой системе нужен идентификатор пользователя для каждого файла, и этот идентификатор пользователя используется для вычисления разрешений доступа, когда fs ext4
монтируется локально на клиенте. В моем случае я решил изменить свой локальный идентификатор пользователя на определенное число навсеклиенты, с которых я синхронизируюсь. Альтернативой было бы сохранение файлов в ext4
fs с uid 0, а затем использование bindfs
для монтирования ext4
fs с не-root uid.