Синхронизация файлов · 8 min read · Dec 06, 2025
Настройка синхронизации файлов Unison между двумя серверами на Debian 10 (Buster)

Этот учебник показывает, как настроить синхронизацию файлов между двумя серверами Debian 10 с помощью Unison. Unison — это инструмент синхронизации файлов, аналогичный rsync, основное отличие заключается в том, что он отслеживает/синхронизирует изменения в обоих направлениях, т.е. файлы, измененные на server1, будут реплицированы на server2 и наоборот.
1 Предварительная заметка
В этом учебнике я буду использовать следующие два сервера Debian:
- server1.example.com с IP-адресом 192.168.0.100
- server2.example.com с IP-адресом 192.168.0.101
Я хочу синхронизировать каталог /var/www между двумя серверами. Я буду запускать Unison от имени пользователя root в этом учебнике, чтобы Unison имел достаточные права для синхронизации прав пользователя и группы.
Все команды в этом учебнике выполняются от имени пользователя root. Войдите на оба сервера в оболочку как root и начните с шага 2 “ Установка Unison “.
2 Установка Unison
server1/server2:
Unison должен быть установлен на server1 и server2; поскольку мы подключаемся с server1 к server2 с помощью SSH, нам также нужны пакеты SSH, и я установлю редактор nano для редактирования файлов в оболочке. Это можно сделать следующим образом:
apt-get -y install unison openssh-server ssh nano3 Создание пары закрытого/открытого ключей на server1
server1:
Теперь мы создадим пару закрытого/открытого ключей на server1.example.com:
ssh-keygen -t dsaroot@server1:~# ssh-keygen -t dsa
Генерация пары открытого/закрытого ключа dsa.
Введите файл, в который сохранить ключ (/root/.ssh/id_dsa): <– ENTER
Создан каталог ‘/root/.ssh’.
Введите пароль (оставьте пустым для отсутствия пароля): <– ENTER
Введите тот же пароль еще раз: <– ENTER
Ваша идентификация была сохранена в /root/.ssh/id_dsa.
Ваш открытый ключ был сохранен в /root/.ssh/id_dsa.pub.
Отпечаток ключа:
ba:82:e1:a1:42:9b:d4:c8:99:c8:bd:8b:7d:4d:d4:66 root@server1
Случайное изображение ключа:
+—[DSA 1024]—-+
| |
| |
| . |
| . E |
|+ * . S |
|.Ooo o |
|ooo+. + |
|oo=… o |
|.. oo.. |
+—————–+
root@server1:~#
Важно не вводить пароль, иначе зеркалирование не будет работать без взаимодействия с человеком, поэтому просто нажмите ENTER!
Далее, мы копируем наш открытый ключ на server2.example.com:
ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]# ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected]Аутентичность хоста '192.168.1.102 (192.168.0.101)' не может быть установлена.
ECDSA отпечаток ключа 2b:3c:35:ad:3d:e2:fc:16:2f:55:5c:e1:2c:d7:3d:a9.
Вы уверены, что хотите продолжить подключение (yes/no)? <-- yes (вы увидите это только в том случае, если это первый раз, когда вы подключаетесь к server2)
/usr/bin/ssh-copy-id: INFO: попытка войти с новыми ключами, чтобы отфильтровать любые, которые уже установлены
/usr/bin/ssh-copy-id: INFO: 1 ключ(ей) остается для установки -- если вас сейчас попросят, это для установки новых ключей
[email protected]'s password: <-- пароль root для server2Количество добавленных ключей: 1Теперь попробуйте войти в машину с помощью: "ssh '[email protected]'"
и проверьте, чтобы убедиться, что были добавлены только те ключи, которые вы хотели.Теперь проверьте на server2, правильно ли был передан открытый ключ server1:
server2:
cat $HOME/.ssh/authorized_keysroot@server2:/home/administrator# cat $HOME/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAACBAKHLdAztIr8muZIlQYuE/4f75kmgTwWqJRZJ1dTqHDnHWsy48emDU8v85hxAPg43k9aF7/zAwpA0MNNNk5T9Tx/DyUkK/KcyVP2f4p8tvovrkUvoxsZACkTUmFqKdq2x6/AGfjsCRmkpLhZuad7r5rKEXHRh8KYGHqD1Id8wcpy5AAAAFQCww3OekKcKMshMAwBK3XQmmYEGUwAAAIEAgjztlwh8OFYxwQve/RrhI2sceCXwS/yjQyH7q0zdWB9Fr4s/16T2PLBT+7M3vb+JlPDO3JRqgaYbel1kS2F2iKrY0EX0FI3/9fVDfWoz3mhCscPLriqy5AcsHitxQNfiZgA5wDiSjWpk1v+FbIC+VuqbKdQuE4MBKj19N9YALIUAAACABQ4NDsa2UBc8jsxvghjoLhUWF7HChaCksXQcL6i98VNRcemtPC6wpIri75iR4Uhv1666bDOBAdmIBX9Qf7A/+czPKPaj4CGI1hVy1pgYMa3btnEvoSnH/ONtjpOz9q+3up1OOOn+5fud7xjJn+Fq8WoGROgarBpCbQU3w2GUUnM= root@server14 Запуск Unison
server1:
Теперь мы можем запустить Unison в первый раз, чтобы синхронизировать каталог /var/www на обоих серверах. На server1 выполните:
unison /var/www ssh://192.168.0.101//var/wwwВывод будет похож на этот - вам, возможно, придется ответить на несколько вопросов, так как это первый раз, когда запускается Unison:
root@server1:/var/www# unison /var/www ssh://192.168.0.101//var/www
Связываюсь с сервером...
Подключено [//server1//var/www -> //server2//var/www]
Ищу изменения
Предупреждение: Архивные файлы не были найдены для этих корней, чьи канонические имена:
/var/www
//server2//var/www
Это может произойти либо
потому что это первый раз, когда вы синхронизировали эти корни,
либо потому что вы обновили Unison до новой версии с другим
форматом архива.Обнаружение обновлений может занять некоторое время при этом запуске, если реплики большие.Unison будет предполагать, что 'последнее синхронизированное состояние' обеих реплик было полностью пустым. Это означает, что любые файлы, которые отличаются, будут сообщены как конфликты, и любые файлы, которые существуют только в одной реплике, будут считаться новыми и переданы в другую реплику. Если две реплики идентичны, то изменения не будут сообщены.Если вы видите это сообщение повторно, это может быть связано с тем, что одна из ваших машин получает свой адрес от DHCP, что вызывает изменение его имени хоста между синхронизациями. См. документацию по переменной окружения UNISONLOCALHOSTNAME для получения советов о том, как это исправить.Пожертвования на проект Unison с благодарностью принимаются:
http://www.cis.upenn.edu/~bcpierce/unisonНажмите Enter, чтобы продолжить.[] <-- Нажмите Enter Ожидание изменений от сервера
Согласование измененийлокальный server2
dir ----> example.com [f] <-- Нажмите Enter
dir ----> example.de [f] <-- Нажмите EnterПродолжить с распространением обновлений? [] <-- Введите "y"
Распространение обновлений
UNISON 2.48.4 начал распространение изменений в 13:24:01.10 05 мая 2020
[BGN] Копирование example.com из /var/www в //server2//var/www
[BGN] Копирование example.de из /var/www в //server2//var/www
Ярлык: скопирован /var/www/example.de/web/index.html из локального файла /var/www/.unison.example.com.d3783bddaaf59b9ba4d2ed0433f9db63.unison.tmp/web/index.html
[END] Копирование example.de
[END] Копирование example.com
UNISON 2.48.4 завершил распространение изменений в 13:24:01.98 05 мая 2020
Сохранение состояния синхронизатора
Синхронизация завершена в 13:24:01 (перенесено 2 элемента, пропущено 0, не удалось 0)Проверьте каталог /var/www на server1 и server2 сейчас, и вы должны обнаружить, что они синхронизированы.
Конечно, мы не хотим запускать Unison интерактивно, поэтому мы можем создать файл предпочтений (/root/.unison/default.prf), который содержит все настройки, которые мы в противном случае должны были бы указывать в командной строке:
nano /root/.unison/default.prf# Корни синхронизации
root = /var/www
root = ssh://192.168.0.101//var/www
# Пути для синхронизации
#path = current
#path = common
#path = .netscape/bookmarks.html
# Некоторые регулярные выражения, указывающие имена и пути для игнорирования
#ignore = Path stats ## игнорирует /var/www/stats
#ignore = Path stats/* ## игнорирует /var/www/stats/*
#ignore = Path */stats ## игнорирует /var/www/somedir/stats, но не /var/www/a/b/c/stats
#ignore = Name *stats ## игнорирует все файлы/каталоги, заканчивающиеся на "stats"
#ignore = Name stats* ## игнорирует все файлы/каталоги, начинающиеся на "stats"
#ignore = Name *.tmp ## игнорирует все файлы с расширением .tmp
# Когда установлено в true, этот флаг заставляет пользовательский интерфейс пропускать
# запросы на подтверждение для не конфликтующих изменений. (Более точно, когда пользовательский интерфейс завершает установку
# направления распространения для одной записи и собирается перейти к следующей, он пропустит все
# не конфликтующие записи и перейдет непосредственно к следующему конфликту.)
auto=true
# Когда это установлено в true, пользовательский интерфейс не будет задавать никаких
# вопросов вообще. Непротиворечивые изменения будут распространяться;
# конфликты будут пропущены.
batch=true
# !Когда это установлено в true, Unison запросит дополнительное
# подтверждение, если кажется, что вся реплика была
# удалена, перед распространением изменения. Если также установлен флаг batch,
# синхронизация будет прервана. Когда используется предпочтение пути,
# то то же самое подтверждение будет запрашиваться для верхних уровней путей. (На данный момент этот флаг
# затрагивает только текстовый пользовательский интерфейс.) См. также предпочтение mountpoint.
confirmbigdel=true
# Когда это предпочтение установлено в true, Unison будет использовать
# время изменения и длину файла в качестве `псевдо-номер inode`
# при сканировании реплик на наличие обновлений, вместо того чтобы читать
# полное содержимое каждого файла. В Windows это может привести к тому, что
# Unison пропустит распространение обновления, если время изменения
# и длина файла не изменились в результате обновления.
# Однако Unison никогда не перезапишет такое обновление изменением
# из другой реплики, так как он всегда выполняет безопасную
# проверку обновлений непосредственно перед распространением изменения. Таким образом, это
# разумно использовать этот переключатель в Windows большую часть времени
# и время от времени запускать Unison один раз с fastcheck, установленным в false,
# если вы беспокоитесь о том, что Unison мог пропустить обновление.
# Значение по умолчанию для предпочтения - auto, что заставляет
# Unison использовать быструю проверку на Unix-репликах (где это безопасно)
# и медленную проверку на Windows-репликах. Для обратной
# совместимости yes, no и default могут использоваться вместо
# true, false и auto. См. раздел "Быстрая проверка" для получения дополнительной информации.
fastcheck=true
# Когда этот флаг установлен в true, атрибуты группы
# файлов синхронизируются. Синхронизируются ли имена групп или идентификаторы групп,
# зависит от предпочтения numerids.
group=true
# Когда этот флаг установлен в true, атрибуты владельца
# файлов синхронизируются. Синхронизируются ли имена владельцев или идентификаторы владельцев,
# зависит от предпочтения extttnumerids.
owner=true
# Включение предпочтения -prefer root заставляет Unison всегда
# разрешать конфликты в пользу root, а не запрашивать
# указания у пользователя. (Синтаксис root такой же, как для
# предпочтения root, плюс специальные значения newer и older.)
# Это предпочтение переопределяется предпочтением preferpartial.
# Это предпочтение следует использовать только если вы уверены, что знаете,
# что делаете!
prefer=newer
# Когда это предпочтение установлено в true, текстовый пользовательский интерфейс
# не будет выводить ничего вообще, кроме случаев ошибок.
# Установка silent в true автоматически устанавливает предпочтение batch
# в true.
silent=true
# Когда этот флаг установлен в true, время изменения файлов (но не
# время изменения каталогов) распространяется.
times=trueКомментарии должны сделать файл самодостаточным, за исключением директив пути. Если вы не укажете директивы пути, то каталоги в директивах root будут синхронизированы. Если вы укажете директивы пути, то пути будут относительными к корневому пути (например, root = /var/www и path = current переводится в /var/www/current), и только эти подкаталоги будут синхронизированы, а не весь каталог, указанный в директиве root.
Вы можете узнать больше о доступных опциях, взглянув на страницу man Unison:
man unisonТеперь, когда мы поместили все настройки в файл предпочтений (особенно директивы root (и, возможно, path)), мы можем запустить Unison без каких-либо аргументов:
unison5 Создание задания Cron для Unison
server1:
Мы хотим автоматизировать синхронизацию, поэтому мы создаем задание cron для этого на server1.example.com:
crontab -e*/5 * * * * /usr/bin/unison &> /dev/nullЭто будет запускать Unison каждые 5 минут; настройте его под свои нужды (см.
man 5 crontab). Я использую полный путь к unison здесь (/usr/bin/unison), просто чтобы убедиться, что cron знает, где найти unison. Ваше местоположение unison может отличаться. Выполните
which unisonчтобы узнать, где он находится.
6 Тестирование Unison
Теперь я протестирую двустороннюю синхронизацию Unison, чтобы увидеть, работает ли настройка полностью.
Выполните следующую команду на server1, чтобы создать тестовый файл с содержимым “Test 1”:
Server1
echo "Test 1" > /var/www/test.txtТеперь подождите как минимум 5 минут (так как мы создали задание cron, которое выполняется раз в 5 минут). Затем выполните на server2:
cat /var/www/test.txtчтобы показать содержимое файла test.txt на экране. Вывод должен быть похож на этот скриншот.

Теперь выполните эту команду на server2, которая обновляет содержимое нашего тестового файла на “Test 2”:
Server2
echo "Test 2" > /var/www/test.txtИ подождите как минимум 5 минут. Затем выполните команду cat на server1:
Server1
cat /var/www/test.txtВывод должен быть:

7 Ссылки
- Unison: http://www.cis.upenn.edu/~bcpierce/unison/
- Debian: http://www.debian.org/
Get new posts in your inbox
No spam. Unsubscribe anytime.