Держать одну папку с документами на ноутбуке и домашнем сервере — задача, с которой односторонний 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, разрешение конфликтов и предсказуемый пакетный режим. Он не заменяет резервное копирование и не подходит для больших ферм машин, но для ноутбука и домашнего сервера это надёжное решение. Начните с ручного запуска, затем перенесите настройки в профиль и только после этого включайте таймер.