Unison — знакомство

В этой статье я опишу утилиту 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 install -y 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

$ sudo ln -s /opt/unison/bin/unison /usr/local/bin/unison

$ unison -version
unison version 2.53.5 (ocaml 4.14.2)
  • Бинарник unison — это и есть необходимая утилита.
  • Для запуска без указания полного пути, создали символическую ссылку.

Локальная синхронизация двух каталогов

Давайте в домашнем каталоге создадим два каталога. В 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] — чтобы пропустить какой-то файл.
  • Затем подтверждаем синхронизацию, нажав [y]. Или нажать [n] — чтобы ещё раз пробежаться по файлам.

Обратите внимание если мы удаляем какой-нибудь файл, то при синхронизации он будет удалён из другого каталога. А если мы создаём файл, то он будет создан в другом каталоге.

$ 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.


Если понравилась статья, подпишись на мой канал в  VK  или  Telegram .