[Решено] Синхронизация

Когда количество девайсов стало расти, встал вопрос о синхронизации файлов между устройствами. Более точная формулировка задачи такая: синхронизация должна проходить сразу в обе стороны и должна быть возможность разрешения конфликтов при изменении одного файла сразу на двух концах.

Чаще всего для синхронизации советуют использовать rsync, но он не подходит ни под одно требование. Затем предлагают использовать систему контроля версий. Это решение считаю избыточным из-за отсутствия требования сохранения истории изменений. К тому же это нужно дополнительно место на жёстком диске для сохранения всех версий репозитория.

Значит надо найти что-то специализированное. csync позволяет проводить синхронизации сразу в двух направлениях, но конфликты разрешает автоматически по времени и дате изменения файла, что может быть не всегда правильно.

Проприетарные решения типа Dropbox и Ubuntu One не рассматриваю, так как планирую синхронизировать всякую приватную инфу. Не говорите, что Ubuntu One свободный, пока не найдёте исходники серверной части.

С начала использования программ Getting Things Gnome и Hamster Time Tracker вопрос о синхронизации встал особенно остро. Поиск по гуглу правильных ответов не давал, зато поиск по репозиторию дал два пакета: unison и conduit. Жаль что раньше о них не узнал.

Unison

Unison позволяет синхронизировать файлы между Unix-подобными системами и виндами.

Важное замечание: прежде чем пытаться синхронизировать с помощью unison, убедитесь, что везде стоит одна версия, а то в разных дистрах по разному и возможно придётся ручками компилить везде одну версию.

Первый запуск

Рассмотрим работу unison на примере синхронизации каталогов, расположенных на одном компе.

Создадим каталог a.tmp с разными файлами и подкаталогами:

mkdir a.tmp
touch a.tmp/a a.tmp/b
mkdir a.tmp/d
touch a.tmp/d/f

и создадим копию a.tmp:

cp -r a.tmp b.tmp

Попробуем синхронизировать эти каталоги:

unison a.tmp b.tmp
...
Nothing to do: replicas have been changed only in identical ways since last sync.

Пока unison’у нечего делать с этими каталогами, так как они одинаковы. Попробуем сделать несколько разных изменений в каталогах a.tmp и b.tmp:

rm a.tmp/a
echo "Hello" > a.tmp/b
echo "Hello" > b.tmp/b
date > b.tmp/c
echo "Hi there" > a.tmp/d/h
echo "Hello there" > b.tmp/d/h

синхронизируем их:

unison a.tmp b.tmp

Теперь unison предлагает нам разрешить конфликт между созданным в обоих каталогах файлами d/h (можем скопировать файл в какую-либо сторону [б] или [ю] или пропустить [/]), удаляет файл a из b.tmp (можем согласиться [f] или отказаться [/]), в a.tmp скопировать файл c:

Contacting server...
Connected [//notebook//home/pavel/a.tmp -> //notebook//home/pavel/b.tmp]
Looking for changes
Reconciling changes
 
a.tmp          b.tmp
new file ====> new file   d/h  [] .
deleted  ---->            a  [f] f
         <---- new file   c  [f] f
 
Proceed with propagating updates? [] y

При изменениях было совершено одинаковое изменение файла b в обоих каталогах и Unison не преложил синхронизацию этих файлов.

Более подробную инфу можно найти на официальном сайте или в каталоге /usr/share/doc/unison/ после установки программы.

Unison ещё удобнее с GTK-оболочкой

Если повторить последнюю синхронизацию с помощью unison-gtk, то можно в отдельном окошке увидеть все изменения и возникшие конфликты. Если конфликта нет, то unison-gtk сразу покажет предлагаемое решение. Конфликты придётся так же вручную разрешать или пропускать.

Практическое применение

Для Unison можно создать различные профили с помощью конфигурационных файлов в ~/.unison: стандартный профиль default.prf и другие профили с любыми именами.

root = /home/pavel/
root = ssh://pavel@192.168.0.1//home/pavel/
 
path = unison/
path = .config/gtg/
path = .local/share/gtg/
path = .local/share/hamster-applet/
path = Desktop/

Обязательными параметрами являются корневые каталоги (root). У меня это домашние каталоги на текущем компе и удалённом. Если больше ничего не указывать, то Unison будет проводить полную синхронизацию домашних каталогов. Это будет занимать слишком много времени. Чтобы избежать этого, перечислены только нужные подкаталоги с помощью параметров path.

Аналогичные профили созданы на других компах.

Осталось сделать запуск команды unison-gtk your-profile на какую-нибудь горячую клавишу. Это решайте средствами вашей среды рабочего стола и/или оконного менеджера.

Полезные клавиши при работе с unison-gtk

  • [б] — решение конфликта влево
  • [ю] — решение конфликта вправо
  • [/] — пропустить
  • [g] — применить предложенные изменения

Вместо заключения

Conduit рассматривать не стал, так как unison решил все мои задачи. Статью о Conduit оставляю сообществу в качестве домашнего задания.

[Решено] Синхронизация: 13 комментариев

  1. > Пока unison’у нечего делать с этими каталогами, так как они одинаковы

    Не понятно, на основании чего определяется одинаковость. Считаются контрольные суммы всех файлов? Или смотрятся даты изменений? Или файлы одинакового размера считаются одинаковыми?

  2. Попробую

    /Можно былобы создать свою прогу/
    Синхронизировать можно файлы и файловые системы.
    Файлы я так думаю будут изменяться только текстовые.

    Возьмём случай по-сложнее, синхронизация файлов.

    Есть такая блок-схема:
    ——+———————+———————+
    | Комп1 (А) | Ноут (В) |
    ——+———————+———————+
    1.01 | O = O | => Архив1
    ——+———————+———————+
    2.01 | Работа (+-) | |
    ——+———————+———————+
    3.01 | | Работа (+-) |
    ——+———————+———————+
    4.01 | Работа (+-) | |
    ——+———————+———————+
    5.01 | O синхронизация O | => Архив2
    ——+———————+———————+

    Работа от 2.01 и 4.01 можно свести к итоговому результату О от 5.01 (комп)
    работу на ноуте — к итоговому рез-ту на дату 5.01
    Задача в том чтобы синхронизировать Архив1, О на ноуте, О на компе и выдать итоговый результат который потом пойдёт в Архив2.

    Нужно ввести понятия:
    I — Незначительные изменения (изменения в тексте не более 50 символов например)
    II — Вставки
    III — Удаления

    Синхронизация будет состоять в том, что незначительные изменения будут пропускаться (оставляя те, что в базовом тексте), вставки следовать в порядке: сначала вторичный текст по отношению к архивному, затем базовый. удаления во вторичном тексте оставляться но подсвечиваться цветом.

    Итоговый результат, все три варианта текстов надо удобно расположить.
    Осталось составить основной алгоритм программы сравнения. Есть желающие(?)

  3. Что-то не понимаю вас.

    Чем не устраивает unison?

    Вы хотите сделать синхронизацию текстовых файлов? Здесь же есть отличные программы meld (gtk) или kdiff3 (kde). Или даже консольные diff и patch.

  4. Какую тему?

    Если есть какая-то содержательная записка, которая сама по себе представляет определённую ценность, то можно попросить права на создание такой (попадёт на главную страницу сайта)

    Если это тема для обсуждения, то для этого есть группы. Если не знаете в какую группу написать, то можете оставить своё сообщение в talks. Кстати, прежде чем появится возможность оставлять сообщения в группе, необходимо в неё вступить. У нас кажется все существующие группы открыты для вступления любым участникам.

Добавить комментарий