Содержание


Синхронизация файлов на хостах локальной сети и резервное копирование с помощью утилиты Unison

Comments

Даже в небольших локальных сетях рано или поздно возникает проблема синхронизации содержимого файлов и папок на двух и более компьютерах. Опытный и аккуратный пользователь вполне может обойтись хорошо известной утилитой rsync. Вне всякого сомнения rsync является великолепным инструментом, подтверждающим свою репутацию уже в течение многих лет в мире Unix, тем не менее и у него есть один небольшой недостаток: односторонняя синхронизация. Разумеется, можно написать хитроумные shell-скрипты с использованием rsync, осуществляющие корректную синхронизацию в обоих направлениях, но можно в качестве альтернативного решения использовать программу Unison.

Unison использует достаточно эффективный подход к синхронизации, в чём-то схожий с подходом rsync, но работающий в двух направлениях. По словам авторов программы, «Unison – это инструмент синхронизации файлов для Unix и Windows-систем. Он позволяет хранить два варианта наборов файлов и каталогов на разных хостах (или на различных дисках одного и того же хоста), изменяемых по отдельности, независимо друг от друга, и в дальнейшем время от времени полностью синхронизировать их, перенося изменённые объекты между этими наборами».

Автором и лидером проекта является Бенджамин Пирс (Benjamin Pierce). В проектировании и разработке последних версий также приняли активное участие Тревор Джим (Trevor Jim) и Джером Вуийон (Jérôme Vouillon). Справедливости ради, следует отметить, что проект Unison развивается не слишком интенсивно: последняя стабильная версия 2.40.61 датирована 2009 годом, хотя в настоящее время в разработке находится бета-версия 2.45.4.

Решение практических задач с помощью Unison

Различные аспекты и тонкости использования программы Unison на уровне пользователя подробно описаны в документации http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html, поэтому более полезным станет рассмотрение решения конкретной практической задачи, например, синхронизации содержимого каталогов /var/www двух http-серверов.

Допустим, что в локальной сети существует сервер srv_a.home.lan с IP-адресом 192.168.3.101 и сервер srv_z.home.lan с IP-адресом 192.168.3.111. Задача состоит в том, чтобы периодически сихронизировать так называемый "контент" серверов, то есть содержимое файлов и подкаталогов, расположенных в /var/www.

Программа Unison должна быть установлена на обоих серверах. Установка не должна вызывать каких-либо затруднений, поскольку пакет Unison включён в репозитории большинства современных дистрибутивов. Важно только проследить за тем, чтобы версии устанавливаемых пакетов полностью совпадали. Кроме того, требуется наличие на серверах установленных пакетов openssh-server и ssh (так именуются пакеты в Debian, в других дистрибутивах наименования пакетов могут отличаться от указанных), поскольку синхронизацию лучше всего проводить по протоколу SSH из соображений безопасности. Вообще говоря, последнее требование не является обязательным, так как Unison может проводить операции синхронизации и через незащищённые соединения.

Подготовка: создание пары ключей "секретный/открытый" на одном из серверов

Прежде всего необходимо сгенерировать пару "секретный ключ – открытый ключ" на одном из серверов, в данном случае пусть это будет srv_a.home.lan. Операция генерации ключей показана в листинге 1.

Листинг 1. Создание пары "секретный ключ – открытый ключ" на сервере srv_a.home.lan
root@srv_a:~# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
d4:6f:ec:ec:5c:a6:63:af:73:97:e6:1d:f5:ad:d1:95 root@srv_a.home.lan
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|         .       |
|        . .      |
|       .   o    .|
|        S   +  Eo|
|           +   .=|
|            o +.=|
|           o++.=+|
|           .=*=o.|
+-----------------+
root@srv_a:~#

Здесь важно отметить, что в ответ на предложение ввести контрольную фразу (passphrase) необходимо просто нажать клавишу Enter, то есть не вводить никакого значения для этого параметра. Это делается для того, чтобы в дальнейшем исключить участие пользователя в процессе синхронизации.

Далее нужно скопировать сгенерированный открытый ключ на сервер srv_z.home.lan. Команда и все последующие действия и результаты показаны в листинге 2.

Листинг 2. Передача открытого ключа на сервер srv_z.home.lan
root@srv_a:~# ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.3.111
The authenticity of host '192.168.3.111 (192.168.3.111)' can't be established.
RSA key fingerprint is 42:53:b6:a8:bf:3f:e2:fa:5a:98:62:53:53:07:68:6c.
Are you sure you want to continue connecting (yes/no)? <<yes>>
Warning: Permanently added '192.168.3.111' (RSA) to the list of known hosts.
root@192.168.3.111's password: <<пароль root на srv_z>>
root@srv_a:~#

К листингу 2 необходимо сделать замечание: сообщение о невозможности установить соединение и предложение продолжить процесс установления данного соединения появляются только в том случае, если соединение с сервером srv_z устанавливается в первый раз. Поэтому на вопрос о продолжении установления соединения следует ответить "yes", как показано в листинге 2.

Для проверки работоспособности соединения можно зарегистрироваться на сервере srv_z с помощью команды:

ssh root@192.168.3.111

и проверить в каталоге .ssh наличие файла authorized_keys, а также его содержимое командой:

cat $HOME/.ssh/authorized_keys

Открытый ключ, сгенерированный операциями, показанными в листинге 1, и скопированный на сервер srv_z (см. листинг 2), показан в листинге 3.

Листинг 3. Открытый ключ, содержащийся в файле $HOME/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAACBAN0OwIDClgmVQkqwWlyiLlWuQnvKHcmNheye+1OVyshnw7WZmMvRw
6K8dTgfKQWDPSkE47jvIhfRKYngqvOTqv5gjoShJngJrPk7bFL3CoO/Z74n6mqX6REzJ3SRP1c+rrIAz/
sYSA4mLXxvjLpyqOZ8xOGpeyxrSByHRfiKPCmbAAAAFQCIwJoWjJpOWFoEkHfo6pNoZcMb2QAAAIBK3P0
M0hBjhOMVqKpTdOcgL4605gbhEGRcOiEnpjX6aycVP3NT4wEzZzGX4e2kton24gLCwqiwFVYbmau/tAEd
jAhRO5K5mFAQu9Aax44fjguIXVG31AKIdDuHiO5uxaSVSx4IuROcirwcbnhZgIi5ohXNlxO2jSmFFlMZF
JwYYgAAAIARoYmqC9f11Hr8WpWoFl6yCR3I3yKJ39HjpVhqSh6sgSB3eZasKu5N20Y6YUKxaDoFZ+4mc9
SEtfbei3Ondmi9fKGjojLtBwMpFJ2tvE+dk3UeY/Wb+yb5Cx9fja+SA5IA4UsEVaSkJNsSKFqMhAZgzle
JGfBFvDboPVdw11E/2g== root@srv_a.home.lan

Ключи авторизации созданы, теперь можно начинать работу.

Запуск Unison и выполнение операции синхронизации

Для синхронизации определённых каталогов выполняется следующая команда:

unison /var/www ssh://192.168.3.111//var/www

Процесс выполнения этой команды показан в листинге 4.

Листинг 4. Операция синхронизации с помощью Unison
root@srv_a~# unison /var/www ssh://192.168.3.111//var/www
Contacting server...
Connected [//srv_a.home.lan//var/www -> //srv_z.home.lan//var/www]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
        /var/www
        //srv_z.home.lan//var/www
This can happen either
because this is the first time you have synchronized these roots,
or because you have upgraded Unison to a new version with a different
archive format.
Update detection may take a while on this run if the replicas are large.
...
...
Waiting for changes from server|webalizer
Reconciling changes
local          srv_z.home.lan
dir    --->    apps [f]
file   --->    index.html [f]
link   --->    ispconfig [f]
dir    --->    php-fcgi-scripts/apps [f]
dir    --->    webalizer [f]
link   --->    webmail [f]
Proceed with propagating updates? [y/n] <<y>>
Propagating updates
UNISON 2.27.57 started propagating changes at 18:43:29 on 17 May 2012
[BGN] Copying apps from /var/www to //srv_z.home.lan//var/www
[BGN] Copying index.html from /var/www to //srv_z.home.lan//var/www
[BGN] Copying ispconfig from /var/www to //srv_z.home.lan//var/www
...
[END] Copying ispconfig
[END] Copying apps
[END] Copying index.html
...
UNISON 2.27.57 finished propagating changes at 18:43:30 on 17 May 2012
Saving synchronized state
Synchronization complete at 18:43:30 (6 items transferred, 0 skipped, 0 failed)
root@srv_a~#

В листинге 4 для экономии места пропущены некоторые информационные сообщения, выводимые программой Unison в процессе работы.

Автоматизация выполнения операции синхронизации

Поскольку синхронизация содержимого каталогов серверов должна происходить без участия пользователя, необходимо исключить все элементы этой операции, которые требуют интерактивности. В первую очередь, следует создать файл, содержащий требуемые параметры синхронизации, в данном случае /root/.unison/default.prf. Для расматриваемого здесь примера файл default.prf приведён в приложении к данной статье.

А для того, чтобы полностью автоматизировать процесс конфигурации, необходимо создать задание для планировщика cron, выполнив команду crontab -e и напечатав, например, следующую строку:

* */1 * * * /usr/bin/unison &> /dev/null

После этого синхронизация каталогов на заданных серверах будет выполняться каждый час.

Возможности резервного копирования с помощью Unison

Описанным выше способом можно выполнять операции резервного копирования как в пределах одного хоста, так и между различными хостами локальной сети. Кроме того, Unison позволяет выполнять операции не только суперпользователю root, но и рядовым пользователям в пределах отведённого им пространства. Для удобства менее опытных пользователей существует графическая оболочка для программы Unison, позволяющая без затруднений выполнять синхронизацию буквально в несколько щелчков кнопкой мыши.

Заключение

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


Ресурсы для скачивания


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=852600
ArticleTitle=Синхронизация файлов на хостах локальной сети и резервное копирование с помощью утилиты Unison
publish-date=12182012