В этой статье я опишу утилиту Unison, которая предназначена для синхронизации каталогов на разных компьютерах Linux локально или по сети.
Об утилите
Инструмент Unison базируется на Rsync, и предназначен для синхронизации двух каталогов на одном компьютере, либо на разных компьютерах по сети. В отличии от Rsync в Unison двухсторонняя синхронизация, то есть вы исправляете файлы на разных компьютерах и это приводит к синхронизации.
Скачать пакет для Ubuntu можно от сюда: https://github.com/bcpierce00/unison/releases. Он должен подойти и для Linux Mint и для Debian.
Синхронизация возможна с использованием сетевого сокета. То-есть на одной машине запускается серверный процесс Unison, а на другой клиентский. Серверный процесс слушает определённый TCP порт, а клиентский к нему подключается.
А также, можно настроить синхронизацию поверх SSH. Предварительно нужно настроить клиент, чтобы он мог подключаться по SSH к серверу без пароля, с использованием ssh ключей — об этом я писал здесь. Мне кажется использовать ssh ключи предпочтительнее, так как здесь есть хоть какая-та авторизация.
Утилита в своей работе может полагаться на профили. Профиль это файл конфигурации, где мы указываем: какой каталог синхронизируем, между какими серверами и с какими опциями. В этой статье я не буду описывать работу с профилями, возможно сделаю это в другой.
Также есть возможность создать службы для SystemD для клиента и сервера и управлять работой Unison с помощью служб. Про это будет отдельная статья.
Установка
Из репозиториев
Установить Unison можно из стандартных репозиториев:
$ sudo apt -y install unison
Скачать готовые бинарники с github.com
Я предпочитаю скачивать последнюю версию Unison с github.com. Установку я выполняю в каталог /opt. Вот весь процесс установки:
$ wget https://github.com/bcpierce00/unison/releases/download/v2.53.5/unison-2.53.5-ubuntu-x86_64.tar.gz $ sudo mkdir /opt/unison $ sudo tar -xf unison-2.53.5-ubuntu-x86_64.tar.gz -C /opt/unison/ $ ls -l /opt/unison/bin/ итого 11080 -rwxr-xr-x 1 root root 3467136 мая 7 04:38 unison -rwxr-xr-x 1 root root 1256608 мая 7 04:38 unison-fsmonitor -rwxr-xr-x 1 root root 6619072 мая 7 04:38 unison-gui
В примере выше, бинарник unison — это и есть необходимая нам утилита. Чтобы была возможность запускать эту утилиту без указания полного пути, создадим символическую ссылку:
$ sudo ln -s /opt/unison/bin/unison /usr/local/bin/unison $ unison -version unison version 2.53.5 (ocaml 4.14.2)
Локальная синхронизация двух каталогов
Давайте в домашнем каталоге создадим два каталога. В dir1 разместим 3 файла, а в dir2 — 2 файла.
$ mkdir dir{1..2} $ touch dir1/file{1..3} $ touch dir2/file{4..5} $ ls -l dir* dir1: итого 0 -rw-r--r-- 1 alex alex 0 мая 29 13:34 file1 -rw-r--r-- 1 alex alex 0 мая 29 13:34 file2 -rw-r--r-- 1 alex alex 0 мая 29 13:34 file3 dir2: итого 0 -rw-r--r-- 1 alex alex 0 мая 29 13:34 file4 -rw-r--r-- 1 alex alex 0 мая 29 13:34 file5
Теперь синхронизируем эти два каталога с помощью Unison. Это пример интерактивной синхронизации:
$ unison dir1/ dir2/ dir1 dir2 new file ----> file1 [f] new file ----> file2 [f] new file ----> file3 [f] <---- new file file4 [f] <---- new file file5 [f] Proceed with propagating updates? [] y Propagating updates Saving synchronizer state Synchronization complete at 13:45:21 (5 items transferred, 0 skipped, 0 failed)
Вначале Unison вам показывает какие файлы и куда будут копированы. Мы ничего не нажимаем и оставляем [f] чтобы продолжить синхронизацию или можем нажать [n] — чтобы пропустить какой-то файл.
dir1 dir2 new file ----> file1 [f] new file ----> file2 [f] new file ----> file3 [f] <---- new file file4 [f] <---- new file file5 [f]
Затем нам нужно подтвердить синхронизацию, нажав [y]. Или нажать [n] — чтобы ещё раз пробежаться по файлам.
Proceed with propagating updates? [] y
Обратите внимание если мы удаляем какой-нибудь файл, то при синхронизации он будет удалён из другого каталога. А если мы создаём файл, то он будет создан в другом каталоге.
$ rm dir1/file5 $ touch dir2/file6 $ unison dir1/ dir2/ dir1 dir2 deleted ----> file5 [f] <---- new file file6 [f] $ ls -l dir* dir1: итого 0 -rw-r--r-- 1 alex alex 0 мая 29 13:50 file1 -rw-r--r-- 1 alex alex 0 мая 29 13:50 file2 -rw-r--r-- 1 alex alex 0 мая 29 13:50 file3 -rw-r--r-- 1 alex alex 0 мая 29 13:50 file4 -rw-r--r-- 1 alex alex 0 мая 29 13:59 file6 dir2: итого 0 -rw-r--r-- 1 alex alex 0 мая 29 13:50 file1 -rw-r--r-- 1 alex alex 0 мая 29 13:50 file2 -rw-r--r-- 1 alex alex 0 мая 29 13:50 file3 -rw-r--r-- 1 alex alex 0 мая 29 13:50 file4 -rw-r--r-- 1 alex alex 0 мая 29 13:58 file6
Опции
Синтаксис команды unison следующий:
unison root1 root2 [options]
root — это каталоги для синхронизации, так они обозначаются в документации Unison. Документация доступна здесь.
Теперь давайте рассмотрим некоторые опции, которые мы можем использовать.
-auto
— автоматически соглашаемся со всем, при этом выбирать какие файлы будут синхронизированы мы уже не будем, но согласиться с синхронизацией нужно (Proceed with propagating updates?).-batch
— утилита вообще перестаёт задавать вопросы, но продолжает выводить информацию о синхронизации на экран.-silent
— утилита ничего не выводит на экран, синхронизация проходит тихо и незаметно.
Показанные выше опции заменяемы, то есть не нужно в одной команде использовать несколько этих опций, достаточно выбрать одну из них.
-force newer / older / каталог
— эта опция помогает автоматически обработать коллизию. Коллизией считается что в каталогах есть файл с одинаковым именем, но с разным содержимым, и утилите нужно решить какой файл удалить, а какой синхронизировать. С помощью этой опции мы можем указать как обработать коллизию. Копировать более новый или более старый файл, или можем указать каталог, который будет считаться предпочтительным.
$ echo 12345 > dir1/file7 $ echo 987654321 > dir2/file7 $ unison dir1/ dir2/ -silent -force dir1/ $ cat dir2/file7 12345
Выше я указал, что в случае коллизии, главнее каталог dir1.
-owner
— синхронизировать владельцев файла;-group
— синхронизировать группы владельцев файла.
Так как изменять владельцев может только root, то и unison в этом случае должен работать под root пользователем.
Синхронизация по сети
Используя сокеты
Здесь нам понадобится установить Unison на другой компьютер. И желательно установить туже версию.
На одном из компьютеров запускаем сервер:
$ unison -socket 8080 server started
На втором запускаем синхранизацию:
$ unison dir1/ socket://192.168.0.4:8080//home/alex/dir1/ -silent
Используя ssh
Обмениваемся ключами ssh. Я на обоих компьютерах работают не под root. Поэтому на первом компьютере, просто, выполняю:
$ ssh-keygen $ ssh-copy-id alex@192.168.0.4
И выполняю синхронизацию:
$ unison dir1/ ssh://192.168.0.4//home/alex/dir1/ -silent
При этом на втором компьютере не нужно запускать процесс unison, но должна быть запущена служба ssh.
В этой статье мы только познакомились с Unison. В следующих статьях по Unison я планирую описать работу с профилями и создание служб systemd для Unison. И, возможно, приведу пример создание сложной настройки, когда нужно синхронизировать множество файлов, синхронизировать их владельцев и права, управлять количеством потоков, синхронизировать каталоги автоматически через какой-то промежуток времени.
Другие мои статьи по Unison будут доступны здесь.
Если понравилось статья, подпишись на мой канал в VK.