Интернет вездсущ. Так-то оно так, только всё ещё встречаются на наших широтах места, где не то что DSL, но и хоть какой-нибудь GPRS днём с огнём не сыщешь. В частности я, иногда выбирающийся подальше от цивилизации, всё равно беру ноутбук с собой, чтобы иной раз, при случае, поработать в тени речных ив. И тут, само собой возникает определённое неудобство. Что делать, когда вдали от домашней сети наваял что-то новенькое, удалил старенькое, но всё это происходит «локально», то бишь, изменения в структуре хранимых на жёстком диске данных, никак не «отмечаются» в домашнем хранилище? Данная проблема и побудила описать этот простой и элегантный, на мой взгляд, способ синхронизации данных между двумя Linux-хостами.
Итак, задача: реализовать двухстороннюю синхронизацию между двумя Linux-хостами. Скажу сразу, я не маялся в поисках подходящих GUI-утилит (коих множество), а пошёл по пути наименьшего сопротивления, воспользовавшись присутствующим в каждом Linux-дистрибутиве инструментом — старой-доброй rsync.
В моём случае имеется следующее: рабочая станция (стационарный компьютер, работающий дома под управлением Ubuntu 10.10) и ноутбук, который я везде таскаю, работающий под управлением Debian 5.0.6.
Настройка сервера rsync
Первым делом необходимо настроить rsync-сервер на обоих компьютерах. В моих системах пакет rsync установлен по умолчанию. Если в вашей системе это не так, установите его способом, принятым в вашей системе. Для Debian-подобных систем будет достаточно команды:
sudo apt-get install rsync
После установки пакета, необходимо разрешить его автозапуск в файле/etc/default/rsync:
RSYNC_ENABLE=true
И убедиться в том, что скрипт запуска вызывается при старте системы:
sudo update-rc.d rsync defaults
Далее, необходимо открыть доступ для клиентов rsync к нужным каталогам. В моём случае понадобилось предоставить доступ лишь к домашним каталогам на ноутбуке и рабочей станции. Вот пример моего файла настроек /etc/rsyncd.conf (имейте ввиду, что по умолчанию этого файла нет в системе, даже пустого):
[ashep] comment = ashep path = /home/ashep use chroot = true uid = ashep gid = users log file = /var/log/rsyncd/ashep.log read only = false write only = false hosts allow = adesktop.ashep hosts deny = * transfer logging = true
Используемые параметры описаны здесь. В данном же случае хочу обратить ваше внимание на следующее:
- параметр log file можно не указывать, если вам это не нужно. Я же предпочитаю протоколировать всё, что только можно;
- если вы не определите параметр log file, то нет смысла в определении transfer logging;
- transfer logging в большинстве случаев полезен лишь на стадии тестирования, поэтому его можно и не включать в целях экономии ресурсов системы;
- обратите внимание на значение параметра hosts allow в примере и замените его на соответствующее вашему случаю имя компьютера или IP-адрес;
- тоже самое касается и параметров uid и gid.
Всё, сервер можно считать настроенным. Перезапустите его, чтобы сделать готовым принимать входящие подключения:
sudo /etc/init.d/rsync restart
Синхронизация
Теперь, когда rsync-серверы настроены на обоих хостах, можно выполнять синхронизацию. Сперва «зальём» копию домашнего каталога с рабочей станции на ноутбук (команда выполняется с рабочей станции):
rsync -vr /home/ashep/ rsync://alaptop.ashep/ashep
Обратите внимание на завершающий слеш при указании локального пути (/home/ashep/). Наличие этого слеша говорит rsync о том, что необходимо копировать каталоги,находящиеся внутри каталога /home/ashep/. Если не завершить локальный путь завершающим слешем, то на получателе будет создан каталог /home/ashep/ashep/, что неприемлемо в рассматриваемом случае.
Теперь, представим, что мы какое-то время находились с ноутбуком в деревне у бабушки, плодотворно поработали и хотим синхронизировать изменённые файлы на рабочую станцию. Сделать это можно как с рабочей станции:
rsync -vr -del rsync://alaptop.ashep/ashep /home/ashep
так и с ноутбука:
rsync -vr -del /home/ashep/ rsync://adesktop.ashep
Обратите внимание на ключ -del, который приводит к тому, что файлы, отсутствующие в источнике, будут удалены на получателе, если они там окажутся. И не забывайте о завершающих слешах при указании локального пути источника!