rsync Резервное Копирование
В предыдущей статье мы закончили тем, что настроили сервер, а также попробовали получить список модулей, подключившись rsync-клиентом. Давайте теперь попробуем скопировать что-нибудь, чтобы убедиться что всё работает так, как нам нужно. В общем случае rsync вызывается командой:
rsync [ОПЦИИ] ИСТОЧНИК 1 [ИСТОЧНИК N] [ПОЛУЧАТЕЛЬ]
Как видно, обязательным параметром для rsync является ИСТОЧНИК, которых может быть более одного. А вот ПОЛУЧАТЕЛЬ может и вовсе отсутствовать, в этом случае rsync все лишь выведет список файлов источника.
Источником может быть как локальная машина, так и удалённая. Тоже самое и с получателем. То есть, меняя местами ИСТОЧНИК и ПОЛУЧАТЕЛЬ вы определяете в каком направлении будет происходить синхронизация. В документации по rsync вариант, когда копируются файлы с локальной системы на удалённую, называется «push». В случае же, когда файлы копируют с удалённой системы на локальную, называется «pull». В моих примерах я использую только push. Сделано это для того, чтобы на всех машинах использовался абсолютно одинаковые способ и направление копирования, что даст возможность создать универсальный bash-скрипт, который в будущем можно будет не заморачиваясь размещать на новых хостах в сети и включать в общую схему резервного копирования. Думаю, это хорошая практика — «сделать и забыть». Конечно, делать нужно качественно и продуманно, а забыть лишь после того, как всё задокументировано. :-)
Набор опций rsync достаточно велик, и я не буду рассматривать их все. Как всегда отсылаю вас к документации. Отмечу лишь то, что выполнения функции резервного копирования нам понадобится всего две опции.
Поскольку rsync разрабатывалась как программа для синхронизации файлов, что по сути и есть резервным копированием, разработчики позаботились, чтобы пользователям не нужно было запоминать туеву хучу опций и «упаковали» всё необходимое для резервного копирования в одну короткую опцию: -a. Передав rsync эту опцию вы получите:
- рекурсивное копирование каталогов;
- копирование символических ссылок «как есть», то есть rsync не будет следовать по ним, обращаясь к файлам;
- сохранение прав доступа к файлам;
- сохранение штампов времени модификации файлов;
- сохранение владельца и группы файла;
- сохранение файлов устройств (опция будет работать только для суперпользователя);
- сохранение специальных файлов.
Также мы воспользуемся опцией -u для того, чтобы пропускать файлы на получателе, имеющие более позднюю дату модификации, чем в источнике.
И ещё, на мой взгляд, не помешает опция -v, заставляющая rsync выводить подробную информацию о копируемых файлах. Это достаточно удобно, если вы будете запускать копирование планировщиком, а вывод команды получать на e-mail, контролируя таким образом корректность работы программы в случае необходимости.
Итак, источником синхронизации у нас будут файлы локальной системы P1 из каталога /home/user/doc, а получателем будет модуль backups удалённой системы S1, на которой уже настроен и запущен rsync-демон:
rsync -auv /home/user/doc rsync://s1/backups
После запуска вы увидите нечто подобное:
sending incremental file list
doc/
doc/cap-bottom.png
doc/cap-top.png
doc/common.css
doc/common.js
doc/help-faq.png
doc/icon-info.png
doc/logo.png
doc/print.css
doc/projection.css
doc/screen.css
doc/urchin.js
sent 57798 bytes received 221 bytes 23207.60 bytes/sec
total size is 57086 speedup is 0.98
Сразу же обращаю ваше внимание на тот момент, что для rsync представляет разницу наличие или отсутствие завершающего слеша при указании источника. Если вы посмотрите сейчас на содержимое каталога /var/backups/my_network сервера S1, то увидите, что все файлы были скопированы в каталог doc. Однако, если бы вы, указывая источник, поставили завершающий слеш, то каталог doc не был бы создан и все файлы были бы скопированы непосредственно в каталог /var/backups/my_network. Обязательно учтите этот момент, «чтобы потом не было мучительно больно».
К этому моменту, если всё у вас получилось, настройку rsync-сервера и клиента можно считать завершённой и вы можете «rsyncать» всё, что вашей душе угодно, лишь места на сервере хватило!