Unison — знакомство
Об утилите
Инструмент 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 .