FastNetMon

Показаны сообщения с ярлыком rsync. Показать все сообщения
Показаны сообщения с ярлыком rsync. Показать все сообщения

воскресенье, 8 августа 2010 г.

Установка Rsync сервера на CentOS Linux

По мотивам статьи http://phpsuxx.blogspot.com/2010/04/rsync.html решил написать мануал по установке rsync сервера и для CentOS.

Ставим xinetd (необходим для запуска rsync сервера):
yum install -y xinetd


Ставим сам rsync:
yum install -y rsync


Открываем конфиг rsync для xinetd:
vi /etc/xinetd.d/rsync


И заменяем в конфиге:
disable = yes

на
disable = no


Применяем настройки xinetd:
/etc/init.d/xinetd restart


Добавляем xinetd в автозапуск:

chkconfig xinetd on


Убеждаемся, что теперь xinetd слушает порт rsync:

netstat -lnpt | grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7721/xinetd


Далеее создаем конфиг /etc/rsyncd.conf по аналогии с мануалом http://phpsuxx.blogspot.com/2010/04/rsync.html, но указываем немного другие имена групп:

uid = nobody
gid = nobody


После чего применяем изменения:
/etc/init.d/xinetd restart


Все, настройка закончена :) Базовые операции с rsync можете просмотреть в статье, ссылку на которую я привел выше.

Источник: http://am3n.profusehost.net/index.php?id=70

Установка Rsync сервера на Debian 6 Squeeze Linux через init.d

Ставим rsync:
apt-get install -y rsync


Если есть желание составить конфиг самому, то вот пример:
vi /usr/share/doc/rsync/examples/rsyncd.conf


В противном случае, создаем файл конфига:
vi /etc/rsyncd.conf


И вносим туда следующие строки:
# Global config
# pid file=/var/run/rsyncd.pid

[filearchive]
comment = Rsync file storage
path = /var/www/rsync
use chroot = yes
lock file = /var/lock/rsyncd
read only = yes
list = yes
uid = nobody
gid = nogroup
strict modes = yes
ignore errors = no
timeout = 600
transfer logging = yes
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz


filearchive представляет собой один из ресурсов, который будет доступен по протоколу rsync, это своего рода виртуальная папка, список доступных ресурсов можно просмотреть при подключении к rsync серверу.

Теперь создаем папку для хранения файлов, которые будем раздавать по rsync протоколу:
mkdir /var/www/rsync


Ради примера зальем туда небольшой tar.gz архив:
wget -P /var/www/rsync http://download.openvz.org/template/precreated/debian-6.0-x86_64.tar.gz

Настройка через /etc/init.d (рекомендуется)

Открываем конфиг:
vim /etc/default/rsync

Корректируем там:
RSYNC_ENABLE=false

Запускаем:
/etc/init.d/rsync start


Убеждаемся, что запустились:
ps aux |grep rsync
root 19542 0.0 0.0 2168 836 ? S 02:27 0:00 /usr/bin/rsync --no-detach --daemon --config /etc/rsyncd.conf
root 19553 0.0 0.0 1780 584 pts/0 S+ 02:27 0:00 grep rsync

Не стоит пугаться тому, что rsync работает от имени рута, при подключении клиентов они форкаются с заданными правами (nobody 20248):
ps aux|grep rsy
root 11901 0.5 0.0 35512 1864 ? Sl Mar29 2:17 /usr/sbin/rsyslogd -c4
root 19989 0.0 0.0 2168 832 ? S 02:37 0:00 /usr/bin/rsync --no-detach --daemon --config /etc/rsyncd.conf
nobody 20248 4.4 0.0 3576 1900 ? S 02:42 0:00 /usr/bin/rsync --no-detach --daemon --config /etc/rsyncd.conf
root 20256 0.0 0.0 1780 584 pts/0 S+ 02:42 0:00 grep rsy

Проверяем, слушается ли порт:
netstat -lnpt |grep 873
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 19608/rsync
tcp6 0 0 :::873 :::* LISTEN 19608/rsync

Настройка через inet.d (не рекомендуется)

Ставим inetd демон:
apt-get install -y openbsd-inetd


Добавляем rsync в конфиг inetd (результат работы команды можно наблюдать в /etc/inetd.conf):
update-inetd --add 'rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon'


Перезапускаем inetd:
/etc/init.d/openbsd-inetd restart


Убеждаемся, что все хорошо и что inetd слушает 873й порт (порт rsync):
netstat -lnpt | grep inetd
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 11880/inetd

Тестирование


Теперь с удаленной машины либо локально делаем запрос листинга "хранилищ" rsync:
rsync localhost::
filearchive Rsync file storage


Это означает, что все хорошо и мы получили список, состоящий из нашего единственного ресурса.

Попробуем теперь получить список файлов ресурса filearchive:
rsync xx.xx.xx.xx::filearchive
drwxr-xr-x 4096 2010/08/08 03:54:38 .
-rw-r--r-- 140180113 2010/07/10 07:59:47 debian-5.0-x86_64.tar.gz


И, наконец, попробуем выполнить синхронизацию файла с удаленного ресурса filearchive с локальной папкой:

mkdir /root/archivecopy
rsync --progress xx.xx.xx.xx::filearchive/debian-5.0-x86_64.tar.gz /root/archivecopy


В результате получим файл в требуемой папке:

ls -la /root/archivecopy
total 134M
drwxr-xr-x 2 root root 4.0K 2010-08-08 04:02 .
drwxr-xr-x 16 root root 4.0K 2010-08-08 03:58 ..
-rw-r--r-- 1 root root 134M 2010-08-08 04:02 debian-5.0-x86_64.tar.gz


Но это еще не все! Если повторить предыдущую команду еще раз, то файл не будет скачен повторно, так как rsync выясняет, что файл не был изменен и его не нужно переливать повторно:
140180113 100% 116.55MB/s 0:00:01 (xfer#1, to-check=0/1)

sent 82988 bytes received 47504 bytes 52196.80 bytes/sec
total size is 140180113 speedup is 1074.24


Также можно выгрузить ресурс целиком:
rm -rf /root/archivecopy
mkdir /root/archivecopy
rsync -av xx.xx.xx.xx::filearchive /root/archivecopy


Вот результат:
ls -la /root/archivecopy
total 134M
drwxr-xr-x 2 root root 4.0K 2010-08-08 03:54 .
drwxr-xr-x 16 root root 4.0K 2010-08-08 04:09 ..
-rw-r--r-- 1 root root 134M 2010-07-10 07:59 debian-5.0-x86_64.tar.gz


Но тут надо быть аккуратнее, так как rsync может за компанию изменит права и самой папке /root/archivecopy, тут я не уверен в его поведении.

http://www.togaware.com/linux/survivor/Rsync_Server.html

понедельник, 15 февраля 2010 г.

Использование rsync для передачи файлов на удаленный сервер

Довольно часто приходится копировать иерархии папок с одного места на другое с сохранением владельцев/разрешений. Обычно, я это делал посредством cp -a + sshfs, но есть намного более правильное для этой задачи средство - rsync. Который умеет ряд замечательных фишек, например, ограничение скорости передачи данных, работу поверх ssh, возможность передачи только изменившихся файлов и проч.

Для работы поверх SSH сначала необходимо настроить доступ по сертификату на удаленный сервер: http://phpsuxx.blogspot.com/2009/12/ssh_17.html

Простейшая команда для синхронизации двух файловых иерархий выглядит так (обращаю внимание, никаких оканчивающих слешей в путях быть не должно!!! иначе поведение rsync будет не таким, как ожидается):
rsync -avH --numeric-ids /var/backup vuser@domain.ru:/backup2/user


Причем, /var/backup - это локальная папка, а вот передается она на удаленный сервер domain.ru в папку /backup2/user, при этом целевая папка не обязательно должна существовать - rsync создаст ее сам. Ключ v выводит дополнительную информацию, которая крайне полезна во время отладки. А вот о ключе -a стоит поговорить подробнее, так как он крайне полезен и удобен:


This is equivalent to -rlptgoD. It is a quick way of saying you want recursion and want to preserve almost everything (with -H being a notable omission). The only exception to the above equivalence is when --files-from is specified, in which case -r is not implied.

Note that -a does not preserve hardlinks, because finding multiply-linked files is expensive. You must separately specify -H.


То есть при копировании будут следующие настройки:
1) рекурсивная передача
2) символические ссылки будут копироваться как символические ссылки а не файлы, на которые они указывают
3) после копирования будут сохранены разрешения на файлы и папки (unix chmod)
4) будет сохранено время изменения
5) будет сохранена группа-владелец файла / папки
6) будет сохранен пользователь-владелец файла / папки
7) будут сохранены в исходном виде файлы устройств
8) будут сохранены в исходном виде специальные файлы (именованные сокеты и fifo)

Обращаю внимание, что для сохранения пунктов 5, 6, 7, 8 на удаленной системе у Вас должны быть root полномочия.

Ключ -H предназначен для копирования hard (жестких) ссылок как ссылок, а не как отдельных файлов, набор фич ключа -a этого не делает и об этом указано в документации.

А ключик --numeric-ids предназначен для того, чтобы при восстановлении данных о владельце на принимающей стороне не происходило разыменование имени группы / пользователя (владельцев файлов), а копировались лишь числовые значения uid / gid. То есть, вместо того, чтобы на исходном сервере сохранить данные о владельце в виде www-data:www-data, скопировать файл на целевой сервер, узнать, какой uid/gid соответствует группе-пользователю www-data на целевом сервере и установить их (uid/gid) для файла, мы просто копируем 33:33 (uid/gid www-data) как данные о пользователе-группе и устанавливаем их на целевом сервере.

Но почему это делать обязательно? Допустим, мы переносим OpenVZ контейнер (с Debian на борту) с сервера, где на ноде www-data создан как 33:33 на сервер, где www-data по каким-то причинам оказался 44:44, как результат мы получим 44:44 как владельца всех файлов сайта в контейнере, что, разумеется, приведет к его неработоспособности.

Теперь о фишках, исходная папка занимает довольно много места:

du -sh /var/backup
280M /var/backup


Теперь запускаем первый раз выше означенную команду передачи файлов на удаленный сервер:

sent 292542176 bytes received 982 bytes 11472280.71 bytes/sec
total size is 292502769 speedup is 1.00


Тут все как и ожидалось - передано 280 мегабайт и ускорения (speedup) нету никакого.

Теперь повторяем запуск и видим следующее чудо:

sent 209914 bytes received 337186 bytes 364733.33 bytes/sec
total size is 292502769 speedup is 534.64


Ускорение аж в 500 раз и передано треть мегабайта вместо 280 мегабайт, что налицо является огромной экономией - вот в этой фиче и есть основная ценность rsync - он не передает только изменившиеся файлы :)

Кстати, есть еще один интересный режим работы rsync - он включается ключом --delete, в этом режиме rsync удаляет в целевой папке файлы, которые по каким-то причинам пропали с исходной машины. Разумеется, это происходит когда rsync запускается несколько раз подряд.

Также при проблеме с пропускной способностью канала стоит добавить ключик -z, который включит сжатие передаваемых файлов.