Синхронизация файлов на хостах локальной сети и резервное копирование с помощью утилиты Unison Описание: В статье рассматривается применение утилиты Unison для выполнения повседневных задач синхронизации файлов и папок между хостами локальной сети, а также для организации процесса резервного копирования. Введение Даже в небольших локальных сетях рано или поздно возникает проблема синхронизации содержимого файлов и папок на двух и более компьютерах. Опытный и аккуратный пользователь вполне может обойтись хорошо известной утилитой 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 Code: 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 Code: root@srv_a:~# ssh-copy-id -i $HOME/.ssh/id_dsa.pub [email protected] 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. [email protected]'s password: <<пароль root на srv_z>> root@srv_a:~# К листингу 2 необходимо сделать замечание: сообщение о невозможности установить соединение и предложение продолжить процесс установления данного соединения появляются только в том случае, если соединение с сервером srv_z устанавливается в первый раз. Поэтому на вопрос о продолжении установления соединения следует ответить "yes", как показано в листинге 2. Для проверки работоспособности соединения можно зарегистрироваться на сервере srv_z с помощью команды: Code: ssh [email protected] и проверить в каталоге .ssh наличие файла authorized_keys, а также его содержимое командой: Code: cat $HOME/.ssh/authorized_keys Открытый ключ, сгенерированный операциями, показанными в листинге 1, и скопированный на сервер srv_z (см. листинг 2), показан в листинге 3. Code: 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 и выполнение операции синхронизации Для синхронизации определённых каталогов выполняется следующая команда: Code: unison /var/www ssh://192.168.3.111//var/www Процесс выполнения этой команды показан в листинге 4. Листинг 4. Операция синхронизации с помощью Unison Code: 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 и напечатав, например, следующую строку: Code: * */1 * * * /usr/bin/unison &> /dev/null После этого синхронизация каталогов на заданных серверах будет выполняться каждый час. Возможности резервного копирования с помощью Unison Описанным выше способом можно выполнять операции резервного копирования как в пределах одного хоста, так и между различными хостами локальной сети. Кроме того, Unison позволяет выполнять операции не только суперпользователю root, но и рядовым пользователям в пределах отведённого им пространства. Для удобства менее опытных пользователей существует графическая оболочка для программы Unison, позволяющая без затруднений выполнять синхронизацию буквально в несколько щелчков кнопкой мыши. Заключение В данной статье рассматривался процесс синхронизации объектов файловых систем на хостах локальной сети с помощью программы Unison, подробно описаны операции, выполняемые в ходе этого процесса. Unison вполне способен стать повседневным инструментом любого пользователя для синхронизации и резервного копирования файлов и каталогов. Автор: Алексей Снастин, независимый разработчик ПО, начальник отдела Дата: 18.12.2012 http://www.ibm.com/developerworks/ru/library/l-Unison_edited/