Линуксоидам: Unison

 | 12.27

Мой Компьютер, №11, 10.03.2008

Вообще, в Unix довольно много утилит для организации резервного копирования изменившихся файлов, работающих в режиме синхронизации данных. Самым популярным решением является rsync (http://rsync.samba.org). Эта утилита умеет рекурсивно выполнять синхронизацию файлов и каталогов, причем используемый алгоритм позволяет минимизировать трафик, доступно и сжатие информации. Администраторы давно и с успехом используют эту утилиту, например, чтобы создать копию домашнего каталога на удаленной системе, достаточно ввести:

$ rsync -Hbaz -e ssh /home/grinder/ [email protected]:backup

Для удобства можно запустить демон, который будет в фоне выполнять поставленную задачу. Но обычный пользователь вряд ли будет в восторге от процесса настройки, тем более что с синхронизацией придется чуток повозиться. Поэтому вводим в консоли apt-cache search synchronization и смотрим, что попало в наши сети.

Проект Unison

Программа Unison (http://www.cis.upenn.edu/~bcpierce/unison) изначально разработана Бенджамином Пиерсом (Benjamin C. Pierce), американским профессором преподавателем компьютерных наук в университете в Пенсильвании. При написании использовался современный объектно-ориентированный язык OCaml. Программа основана на алгоритме rsync, позволяющем передавать из каталога в каталог только отличия файлов, что экономит трафик. Unison может быть использован в двух вариантах. Первый подобен rsync: создается зеркальная копия исходного каталога. В качестве альтернативы выступает так называемый режим двухсторонней синхронизации, когда изменившие файлы синхронизируются в обоих направлениях. Программа может работать как в клиент-серверном варианте, так и в одиночном режиме, как из командной строки, так и с использованием простого и понятного GUI. Для удобства пользователь создает профили, в которых определяются каталоги для синхронизации, типы файлов, которые следует игнорировать, и прочие настройки. Профили хранятся в виде обычных текстовых файлов с расширением .prf в скрытом каталоге ~/.unison.

Еще один плюс — Unison доступен в версиях для нескольких операционных систем: Linux, *BSD, MacOS X, Solaris, есть даже пакет для Compaq IPAQ и Sharp Zaurus. Каталоги и файлы синхронизируются как локально, так и используя защищенное SSH-соединение. Распространяется по лицензии GNU GPL. В настоящее время активная работа над проектом прекращена, устраняются лишь найденные ошибки, хотя последняя версия датирована январем этого года.

Пробуем в работе

Так как Unison — это обычная программа, не требующая перекомпиляции ядра. Установка ее очень проста. Тем более, что в большинстве пакетных репозитариев она имеется. В Ubuntu для установки достаточно ввести:

$ sudo apt-get install unison unison-gtk

Как видите, графический интерфейс в Ubuntu (и Debian) поставляется в отдельном пакете. Для того чтобы синхронизировать два каталога в командной строке, достаточно ввести команду:

$ unison /home/grinder/source /home/grinder/destination

Учтите, что при синхронизации проверяются (и сохраняются) права доступа. К удаленной Unix-системе можно подключиться при помощи SSH, использовав такую конструкцию:

$ unison /home/grinder/source ssh://[email protected]/dest

Если синхронизируются большие каталоги, то в первый раз некоторое время придется подождать. В процессе работы утилита выводит таблицу, в которой показаны изменения между каталогами.

Предлагаемое действие показано стрелочками < или >, в зависимости от того, где найдено отличие. Нажав «?», можно получить подсказку по командам. Буквой f отмечается действие, рекомендуемое Unison’ом. Например:

dir1      dir2

file   —->      file1 [f]

     <—- file    file2 [f]

changed —->    file3 [f]

changed <-?-> changed file4 []

Proceed with propagating updates? [] ?

Commands:

 y or g     Yes: proceed with updates as selected above

 n         No: go through selections again

 q         exit unison without propagating any changes

Для того чтобы разрешить указанные действия, выбираем y:

Proceed with propagating updates? [] y

Единственная ситуация, с которой не сможет справиться Unison без вашей подсказки, это когда изменились оба файла. Такие ситуации помечаются как <-?->. Нажав клавишу d, можно просмотреть различия, выданные командой diff.

changed <-?-> changed file1 [] d

diff -u ‘/home/grinder/dir2/file1’ ‘/home/grinder/dir1/file1’

 

— /home/grinder/dir2/file1 2008-02-23 14:59:18.000000000 +0200

+++ /home/grinder/dir1/file1 2008-02-23 14:59:10.000000000 +0200

@@ -1 +1 @@

-2222

+1111

Клавиша х подскажет дату изменений; чтобы проигнорировать этот файл, нажимаем I. И наконец, чтобы объединить изменения, нажимаем m.

dir2      dir1

changed <-M-> changed file1 [] m

Синхронизировать два каталога в Linux и Windows можно несколькими способами. Если все действия производятся в Windows, то просто подключаемся по SSH (в Ubuntu необходимо установить пакет openssh, так как сервера в поставке по умолчанию нет). Если наоборот, то мне кажется, что проще смонтировать Windows-ресурс. Для удобства прописываем строку для монтирования в файле /etc/fstab:

//win_computer/shared /mnt/win cifs noauto,users,password=,iocharset=utf8,codepage=cp866 0 0

Если для доступа к удаленному каталогу требуется пароль, не забудьте указать его в строке после password=, ну, или вбивайте вручную при монтировании. Я также использую параметр noauto, чтобы ресурс не монтировался автоматически. Иначе если он не будет доступен при загрузке, это увеличит время. И в iocharset укажите правильную кодировку, чтобы имена файлов на кириллице показывались правильно. Кстати, в некоторых случаях Unison отказывается работать с такими файлами, так что привычка обзывать файлы латинскими буквами не будет лишней. Теперь монтируем Windows-каталог:

$ sudo mount /mnt/win

И синхронизируем как два обычных локальных каталога.

Чтобы в процессе команда задавала меньше вопросов, используем параметр –batch или –auto.

Профили

Программа имеет большое количество параметров, просмотреть их можно, введя unison —help, более подробно они описаны в документации — http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html. Чтобы не вводить их каждый раз, удобнее создать профили. Как уже говорилось, профиль — это обычный текстовый файл. В нем записаны все команды, которые необходимо выполнить, причем профили могут ссылаться друг на друга, для чего используется директива include. Поэтому общие для всех параметры лучше определить в одном файле:

$ kate ~/.unison/default.prf

# команда для объединения конфликтных файлов

merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW

# шаблон для файлов

backup = Name *

# журнал никогда не был лишним

log = true

logfile = /home/knan/.unison/unison.log

# шаблоны файлов, которые будут проигнорированы

ignore = Name temp.*

ignore = Name *~

Теперь второй профиль, в котором указываем уже каталоги.

$ kate ~/.unison/work.prf

# каталоги для синхронизации

root = /home/grinder/work

root = /media/work

# подключаем профиль

include = default default.prf

ignore = Name *mp3

# задает меньше вопросов

auto = true

Теперь, чтобы синхронизировать каталоги, указанные в этом профиле, достаточно ввести unison work.

Работа с GUI

Большинство пользователей, наверное, предпочтет все-таки графический интерфейс.

Если устанавливался пакет unison-gtk, то в меню К (если KDE) появится нужный пункт. Из консоли вызвать графическую версию Unison можно, использовав параметр -ui:

$ unison -ui graphic или unison-gtk

Если ранее были созданы профили, программа попросит выбрать один из них. В противном случае вначале необходимо будет создать новый профиль. Для этого указываем исходный (локальный) каталог и второй каталог, в настройках которого можно уже указать удаленное подключение. После создания профиля будут проверены оба каталога; если они не синхронизированы, появится окно, предупреждающее о намерении сравнить их содержимое. Нажимаем ОК и ждем, пока Unison соберет и выведет информацию о каталогах. Стрелка укажет, в каком направлении будет произведена синхронизация. Если будет обнаружен конфликт (например, Unison не может их перезаписать, хотя файлы и изменились, или изменились оба файла), такая пара отмечается вопросительным знаком. Для их слияния нажимаем кнопку Merge. Чтобы синхронизировать все одним махом, достаточно нажать кнопку Go. Используя кнопки на передней панели можно указать направление изменения — справа налево или слева направо.

* * *

Unison — не единственная, хотя, по моему мнению, самая удобная утилита, позволяющая синхронизировать каталоги. Эту же функцию имеет и файловый менеджер Krusader. Достаточно в нем открыть нужные каталоги в панелях и выбрать в меню пункт Инструменты > Синхронизировать каталоги (Ctrl -Y), появится окно Синхронизация каталогов (рис. 3), в котором можно указать дополнительные функции: задать шаблон имени файла, время последнего доступа или изменения, тип файла, размер, права и другие.

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

В моем любимом Midnight Commander нет такой функции, но ее легко можно добавить самостоятельно. Для этого в файл настройки меню этого файлового менеджера — пользовательский (~/.mc/menu) или системный (/etc/mc/mc.menu) — добавляем такую строку:

U unison directories

           unison -batch %d %D

Теперь достаточно нажать F2 и затем клавишу U, и каталоги, открытые в противоположных панелях, будут без лишних вопросов синхронизированы средствами Unison.

Другой вариант: программа Komparator (http://sourceforge.net/projects/komparator) написана с использованием Qt-библиотек. Чтобы ее установить, достаточно ввести:

$ sudo apt-get install komparator

Теперь в Правый URL и Левый URL указываем каталоги, которые нужно сравнить, и нажимаем Искать.

Результат после анализа будет показан в трех вкладках в панели внизу: Файлы-дубликаты, Новые файлы и Отсутствующие файлы. Как и в Krusader, можно задать шаблон имени, размер, время изменения и другие параметры поиска. Для удобства задаются предустановки.

Программа Conduit (www.conduit-project.org) построенная на гномьих библиотеках. Она также предназначена для синхронизации, но ее функция несколько шире.

Она позволяет синхронизировать фотографии, электронную почту, данные контактов, заметки, календарь и другую информацию со многими онлайн-сервисами и электронными устройствами (мобильные телефоны, iPod, PDA и другие). При необходимости данные автоматически конвертируются в нужный формат. Список сервисов, о которых знает Conduit, довольно приличный: Flickr, Picasa, SmugMug, ShutterFly и другие.

Так как в Linux нередко используются несколько браузеров, не лишней будет небольшая программа bookmarkbridge (bookmarkbridge.sourceforge.net), позволяющая синхронизировать закладки.

В Ubuntu она устанавливается командой sudo apt-get install bookmarkbridge.

В репозитарии нашлась еще одна специализированная консольная утилита tra, но по сравнению с Unison она мне показалась недостаточно понятной.

Вот как бы и все, о чем хотелось сегодня рассказать. Я думаю, проблем с синхронизацией данных у вас не будет.

Linux forever!

Сергей (grinder) ЯРЕМЧУК

Robo User
Web-droid editor

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *