Держать одну папку с документами на ноутбуке и домашнем сервере — задача, с которой односторонний rsync не справляется: он умеет копировать в одну сторону, но не понимает, что файл изменили на другой машине. Unison решает именно эту проблему. Он сравнивает две копии каталога, показывает различия и переносит изменения в обе стороны, используя алгоритм, похожий на rsync. Программа работает поверх SSH, не требует постоянно запущенного демона и подходит для синхронизации документов, заметок и рабочих каталогов между двумя машинами.

Как работает Unison

При первом запуске Unison строит индекс файлов на каждой стороне и сохраняет служебные архивы в каталоге ~/.unison. При следующих запусках он сравнивает текущее состояние с архивом и понимает, какие файлы появились, изменились или были удалены. Изменения передаются в обе стороны, а не только от ведущей машины.

Важное ограничение: Unison синхронизирует пары каталогов, а не сети из десятка узлов. Для трёх и более машин схема усложняется, а конфликты становятся трудноразрешимыми. Кроме того, это не резервное копирование: удаление файла на одной стороне будет повторено на другой.

Версии Unison на обеих машинах должны совпадать, включая линию протокола. Обновление только на сервере — самая частая причина ошибки о несовместимости клиента и сервера.

Установка и проверка связи

Пакет есть в Debian, Ubuntu, Linux Mint, Fedora и Arch Linux. На обеих машинах установите одну и ту же версию из репозитория дистрибутива.

sudo apt install unison
unison -version
ssh-copy-id alex@192.168.1.20
unison -testserver ssh://alex@192.168.1.20//home/alex/Documents

Обратите внимание на двойной слэш перед абсолютным путём: первый отделяет хост, второй начинает путь от корня. Одинарный слэш означает путь относительно домашнего каталога. Команда -testserver проверяет подключение, версию протокола и права, не начиная синхронизацию.

Для работы без пароля нужен ключ SSH. Если вход по ключу невозможен, Unison в пакетном режиме будет ждать ввода пароля и завершится ошибкой.

Первый запуск

Самый простой вариант — указать два корня прямо в командной строке. Unison откроет текстовый интерфейс со списком изменений; клавишами со стрелками выбирают файл, а подтверждение выполняют по Enter.

unison ~/Documents ssh://alex@192.168.1.20//home/alex/Documents
unison ~/Documents ssh://alex@192.168.1.20//home/alex/Documents -auto
unison default -ui text
unison default -batch

Флаг -auto принимает очевидные решения без вопросов, но конфликты всё равно останавливают работу. Режим -batch полностью неинтерактивен: он подходит для скриптов и таймеров, однако при первом запуске лучше проверить список вручную.

Профиль настроек

Постоянные параметры удобнее хранить в файле ~/.unison/default.prf. Тогда команда unison default будет использовать готовый набор правил, а не десяток флагов.

root = /home/alex/Documents
root = ssh://alex@192.168.1.20//home/alex/Documents

batch = true
auto = true
times = true
log = true
logfile = /home/alex/.unison/sync.log

ignore = Name .git
ignore = Name node_modules
ignore = Name *.tmp
ignore = Name .cache

Параметр times переносит время изменения файлов, а log включает журнал. Правила ignore особенно важны: без них служебные каталоги Git и кэши будут создавать тысячи ложных конфликтов. Для отдельных путей используется Path, для шаблонов имён — Name.

Если SSH-соединение нестабильно, добавьте sshargs = -C -o ServerAliveInterval=30. Сжатие помогает на медленном канале, но нагружает процессор на больших текстовых файлах.

Конфликты и удаления

Конфликт возникает, когда один и тот же файл изменили с обеих сторон. Unison не угадывает: он оставляет одну версию и создаёт рядом копию с суффиксом conflict, чтобы данные не потерялись. Разбирать такие файлы нужно вручную.

Для предсказуемого поведения есть флаги предпочтения. -prefer newer выбирает более свежую версию, -force указывает конкретный корень как источник истины. Последний вариант опасен: он может затереть изменения, сделанные на другой машине.

unison default -prefer newer -batch
unison default -diff "diff -u CURRENT1 CURRENT2"
unison default -debug all -logfile /tmp/unison-debug.log
unison default -repeat watch

Опция diff задаёт внешнюю команду сравнения; в ней CURRENT1 и CURRENT2 заменяются на пути к версиям файла. Режим -repeat watch запускает наблюдение за изменениями через unison-fsmonitor. Проверьте наличие помощника командой command -v unison-fsmonitor: без него режим не заработает.

Если нужно запретить удаления на одной стороне, используйте ограничения вида nodeletion=root1. Они задаются в профиле и защищают сервер от случайной очистки, но требуют дисциплины: файлы, удалённые на ноутбуке, останутся на второй машине.

Автоматизация через systemd

Если постоянно держать процесс не нужно, достаточно периодического запуска. Пользовательский таймер запускает синхронизацию каждые пятнадцать минут и не требует root.

[Unit]
Description=Unison documents sync

[Service]
Type=oneshot
ExecStart=/usr/bin/unison default -batch

[Install]
WantedBy=default.target

Файл unison-docs.service кладут в ~/.config/systemd/user/, рядом создают unison-docs.timer с OnBootSec=2min и OnUnitActiveSec=15min. После этого выполняют systemctl --user daemon-reload, systemctl --user enable --now unison-docs.timer и проверяют журнал через journalctl --user -u unison-docs.

Перед включением таймера запустите сервис вручную и убедитесь, что код возврата нулевой. Ненулевой статус означает пропущенные файлы или конфликты; подробности будут в логе Unison.

Диагностика

  • Разные версии на машинах — обновите оба пакета или зафиксируйте одинаковую сборку.
  • Ошибки прав — проверьте владельца каталога и возможность записи от имени пользователя SSH.
  • Файлы с разным регистром букв конфликтуют на файловых системах без учёта регистра.
  • Символические ссылки по умолчанию не следуются; поведение задаётся параметром follow.
  • Удаление архивов в ~/.unison приводит к полному повторному сравнению и может вызвать ложные конфликты.

Полная документация доступна без интернета: unison -doc ignore выводит описание конкретной опции, а unison -doc all — весь справочник.

Итог

Unison остаётся удобным инструментом для двусторонней синхронизации двух каталогов: понятные правила, работа поверх SSH, разрешение конфликтов и предсказуемый пакетный режим. Он не заменяет резервное копирование и не подходит для больших ферм машин, но для ноутбука и домашнего сервера это надёжное решение. Начните с ручного запуска, затем перенесите настройки в профиль и только после этого включайте таймер.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте