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

Оставьте комментарий