Для копирования файлов по сети можно использовать множество
инструментов.
Наиболее распространённым считается ftp, но многие используют и scp для небольших объемов.
С синхронизацией все немного сложнее.. В статье lftp - Синхронизация папок по ftp я описал, как можно выполнять синхронизацию по ftp, но это не очень удачная идея и применима, только когда нет альтернатив.
Для синхронизации данных можно использовать rsync по ssh.
Если у Вас есть доступ по ssh на сервер, то это наиболее простой и надёжный способ, который не требует никаких предварительных настроек. Кстати это и более безопасно.
Итак сначала расскажу про использование rsync вообще , т.к. rsync по ssh - это частный случай использования.
В общем виде команда выглядит так:
В документации по rsync вариант, когда копируются файлы с локальной системы на удалённую, называется «push». В случае же, когда файлы копируют с удалённой системы на локальную, называется «pull». В моих примерах я использую только push.
Как видно, обязательным параметром для rsync является ИСТОЧНИК, которых может быть более одного. А вот ПОЛУЧАТЕЛЬ может и вовсе отсутствовать, в этом случае rsync все лишь выведет список файлов источника.
Приведу краткий перечень основных ключей:
-a, работа в режиме архивирования, экфивалентна -rlptgoD.
Передав rsync эту опцию вы получите:
-r, рекурсивное копирование каталогов;
-l, копирование символических ссылок «как есть», то есть rsync не
будет следовать по ним, обращаясь к файлам;
-p, сохранение прав доступа к файлам;
-t, сохранение штампов времени модификации файлов;
-g, -o, сохранение владельца и группы файла соответственно;
-D, эквивалентно --devices --specials
--devices сохранение файлов устройств (опция будет работать
только для суперпользователя);
--specials сохранение специальных файлов.
-u Режим обновления - пропускаются файлы на получателе, имеющие
более позднюю дату модификации, чем в источнике.
-v, заставляющая rsync выводить имена копируемых файлах.
-q, не выводит сообщения об ощибках -
-z, включает режим сжатия
-P, отображать прогресс при копировании.
-с, заставляет rsync проверять файлы по контрольной сумме, а не просто
по размеру и дате модификации. Опция полезная, но дает
дополнительную нагрузку на проц и значительно увеличивает время
синхронизации.
Рекомендую использовать для передачи важных данных.
-n, режим тестирования, нужен для проверки, что скопирует rsync.
Используется с -v и/или -i
-i, показывать, какие изменения выполняются. Используется часто с -n
-H, - сохранять жесткие ссылки, оставляя их на другом конце бэкапа;
-x - не выходить за пределы текущей точки монтирования;
--delete - удалять из бэкапа файлы, которых уже нет на стороне источника.
--delete отличается от --delete-after тем, что удаление
производится вначале, а не на завершающей стадии процесса
бэкапа.
--delete-after работает быстрее, так как не требует лишней стадии
обхода списка файлов, но требует использования опции
--force для обработки таких ситуаций как удаление файла и
появление диретории с тем же именем;
--delete-excluded - удалять части которые уже есть на стороне
бэкапа, но появились в списке исключения;
-compare-dest=DIR - сохранять новые и измененные файлы в отдельной
директории, не трогая на время копирования
основную директорию назначения, в конце - разом,
путем переименования, обновить содержимое
бэкапа;
--link-dest=DIR - использовать жесткие ссылки на файлы в DIR, например,
для создания подобия снапшотов;
--ignore-errors - продолжать копирование и удаление после появления
ошибок;
--max-delete - ограничение максимально числа удаляемых за один раз
файлов и каталогов;
-A - сохранять не только права доступа, но и ACL; --files-from=FILE - задать
список директорий и файлов для бэкапа в файле;
Команды для синхронизации:
В общем виде для передачи данных копирование данных используем команду (1-я команда заливает на сервер, 2-я скачивает)
Для проверки, что будет делать rsyn добавляем опции -nvi.
Работа в тестовом режиме.
Важные моменты, которые нужно учитывать:
1. Если копируемая директория заканчивается слэшем, то файлы будут скопированы в каталог назначения относительно корня изначально заданной директории. Пример:
2. При транзитном переносе файлов через дополнительную машину не нужно забывать, что опция "-a" подразумевает трансляцию имен пользователей и групп в локальные uid/gid,
т.е. скопировав данные с первой машины на вторую, а потом со второй на локально подключенный жесткий диск, предназначенный для третьей машины, получим на третьей машины совершенно иных владельцев каталогов и файлов. Не тех которые были в /etc/password первой машины, а тех, которые в данным момент в /etc/password второй машины (изменятся типовые пользователи, например, web, ftp, dhcp, номера uid/gid которых отличаются на двух машинах).
Чтобы этого не произошло нужно испольщовать опцию "--numeric-ids".
3. Особенности задания файлов исключений ("--exclude-from=файл" или " --exclude маска1 --exclude маска2").
Для того чтобы исключить из бэкапа содержимое директории, но саму директорию оставить, нужно указать в "exclude" файле "/dir/*", а не "/dir/" (под "/dir" подпадет и /dir123, и файл /dir.txt, для директорий указание "/" в конце обязательно).
Звездочка ("*") в шаблоне действует только на имя файла/каталога, чтобы маской охватывалась часть пусти, включая "/", нужно писать "**".
Шаблон не начинающийся с '/' проверяется с конца строки.
Например "/dir/test" будет проверен c начала пути, а "dir/test.txt" или "*.log" с конца.
Если необходимо исключить все поддиректории в /dir, кроме /dir/best, в список исключений нужно поместить: + /dir/best/ - /dir/* При переборе содержимого "exclude" файла, срабатывает первое правило под которое подпадает текущий путь, не важно исключающие или нет.
В качестве корня выступает директория назначения, т.е. "/" в "exclude" файле = "/dir3/dir2" или "/dir3" из первого совета.
4. Запрещение двойного сжатия при передаче данных по SSH. rsync при задании опции "-z" более оптимально сжимает передаваемые данные, поэтому сжатие средствами ssh можно отключить:
5. Изменение уровня точности при сравнении локального и удаленного времени модификации файлов. Например, для того чтобы считать идентичными файлы время модификации которых отличается на 1 секунду необходимо указать: "--modify-window=1".
Ссылки:
Полезные рецепты при работе с rsync
Backup в Linux: rsync-клиент
cwRsync — реализация rsync под Windows
Наиболее распространённым считается ftp, но многие используют и scp для небольших объемов.
С синхронизацией все немного сложнее.. В статье lftp - Синхронизация папок по ftp я описал, как можно выполнять синхронизацию по ftp, но это не очень удачная идея и применима, только когда нет альтернатив.
Для синхронизации данных можно использовать rsync по ssh.
Если у Вас есть доступ по ssh на сервер, то это наиболее простой и надёжный способ, который не требует никаких предварительных настроек. Кстати это и более безопасно.
Итак сначала расскажу про использование rsync вообще , т.к. rsync по ssh - это частный случай использования.
В общем виде команда выглядит так:
Pull: rsync [ОПЦИИ] [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:ИСТОЧНИК... [ПОЛУЧАТЕЛЬ]
Push: rsync [ОПЦИИ] ИСТОЧНИК 1 [ИСТОЧНИК N] [ПОЛЬЗОВАТЕЛЬ@]ХОСТ:ПОЛУЧАТЕЛЬ
В документации по rsync вариант, когда копируются файлы с локальной системы на удалённую, называется «push». В случае же, когда файлы копируют с удалённой системы на локальную, называется «pull». В моих примерах я использую только push.
Как видно, обязательным параметром для rsync является ИСТОЧНИК, которых может быть более одного. А вот ПОЛУЧАТЕЛЬ может и вовсе отсутствовать, в этом случае rsync все лишь выведет список файлов источника.
Приведу краткий перечень основных ключей:
-a, работа в режиме архивирования, экфивалентна -rlptgoD.
Передав rsync эту опцию вы получите:
-r, рекурсивное копирование каталогов;
-l, копирование символических ссылок «как есть», то есть rsync не
будет следовать по ним, обращаясь к файлам;
-p, сохранение прав доступа к файлам;
-t, сохранение штампов времени модификации файлов;
-g, -o, сохранение владельца и группы файла соответственно;
-D, эквивалентно --devices --specials
--devices сохранение файлов устройств (опция будет работать
только для суперпользователя);
--specials сохранение специальных файлов.
-u Режим обновления - пропускаются файлы на получателе, имеющие
более позднюю дату модификации, чем в источнике.
-v, заставляющая rsync выводить имена копируемых файлах.
-q, не выводит сообщения об ощибках -
-z, включает режим сжатия
-P, отображать прогресс при копировании.
-с, заставляет rsync проверять файлы по контрольной сумме, а не просто
по размеру и дате модификации. Опция полезная, но дает
дополнительную нагрузку на проц и значительно увеличивает время
синхронизации.
Рекомендую использовать для передачи важных данных.
-n, режим тестирования, нужен для проверки, что скопирует rsync.
Используется с -v и/или -i
-i, показывать, какие изменения выполняются. Используется часто с -n
-H, - сохранять жесткие ссылки, оставляя их на другом конце бэкапа;
-x - не выходить за пределы текущей точки монтирования;
--delete - удалять из бэкапа файлы, которых уже нет на стороне источника.
--delete отличается от --delete-after тем, что удаление
производится вначале, а не на завершающей стадии процесса
бэкапа.
--delete-after работает быстрее, так как не требует лишней стадии
обхода списка файлов, но требует использования опции
--force для обработки таких ситуаций как удаление файла и
появление диретории с тем же именем;
--delete-excluded - удалять части которые уже есть на стороне
бэкапа, но появились в списке исключения;
-compare-dest=DIR - сохранять новые и измененные файлы в отдельной
директории, не трогая на время копирования
основную директорию назначения, в конце - разом,
путем переименования, обновить содержимое
бэкапа;
--link-dest=DIR - использовать жесткие ссылки на файлы в DIR, например,
для создания подобия снапшотов;
--ignore-errors - продолжать копирование и удаление после появления
ошибок;
--max-delete - ограничение максимально числа удаляемых за один раз
файлов и каталогов;
-A - сохранять не только права доступа, но и ACL; --files-from=FILE - задать
список директорий и файлов для бэкапа в файле;
Команды для синхронизации:
В общем виде для передачи данных копирование данных используем команду (1-я команда заливает на сервер, 2-я скачивает)
rsync -zavP /tmp/dir1 /tmp/dir2 root@10.10.10.10:/root
rsync -zavP root@10.10.10.10:/root /tmp/dir1
С гарантией соответствия исходным данным я использую команду:
rsync -czavP /tmp/dir1 /tmp/dir2 root@10.10.10.10:/root
rsync -czavP root@10.10.10.10:/root /tmp/dir1
Для проверки, что будет делать rsyn добавляем опции -nvi.
Работа в тестовом режиме.
rsync -nvizaP /tmp/dir1 /tmp/dir2 root@10.10.10.10:/root
rsync -nvizaP root@10.10.10.10:/root /tmp/dir1
Важные моменты, которые нужно учитывать:
1. Если копируемая директория заканчивается слэшем, то файлы будут скопированы в каталог назначения относительно корня изначально заданной директории. Пример:
rsync -a /dir1/dir2 /dir3 - будет создана иерархия /dir3/dir2/файлы
rsync -a /dir1/dir2/ /dir3 - будет создана иерархия /dir3/файлы
2. При транзитном переносе файлов через дополнительную машину не нужно забывать, что опция "-a" подразумевает трансляцию имен пользователей и групп в локальные uid/gid,
т.е. скопировав данные с первой машины на вторую, а потом со второй на локально подключенный жесткий диск, предназначенный для третьей машины, получим на третьей машины совершенно иных владельцев каталогов и файлов. Не тех которые были в /etc/password первой машины, а тех, которые в данным момент в /etc/password второй машины (изменятся типовые пользователи, например, web, ftp, dhcp, номера uid/gid которых отличаются на двух машинах).
Чтобы этого не произошло нужно испольщовать опцию "--numeric-ids".
3. Особенности задания файлов исключений ("--exclude-from=файл" или " --exclude маска1 --exclude маска2").
Для того чтобы исключить из бэкапа содержимое директории, но саму директорию оставить, нужно указать в "exclude" файле "/dir/*", а не "/dir/" (под "/dir" подпадет и /dir123, и файл /dir.txt, для директорий указание "/" в конце обязательно).
Звездочка ("*") в шаблоне действует только на имя файла/каталога, чтобы маской охватывалась часть пусти, включая "/", нужно писать "**".
Шаблон не начинающийся с '/' проверяется с конца строки.
Например "/dir/test" будет проверен c начала пути, а "dir/test.txt" или "*.log" с конца.
Если необходимо исключить все поддиректории в /dir, кроме /dir/best, в список исключений нужно поместить: + /dir/best/ - /dir/* При переборе содержимого "exclude" файла, срабатывает первое правило под которое подпадает текущий путь, не важно исключающие или нет.
В качестве корня выступает директория назначения, т.е. "/" в "exclude" файле = "/dir3/dir2" или "/dir3" из первого совета.
4. Запрещение двойного сжатия при передаче данных по SSH. rsync при задании опции "-z" более оптимально сжимает передаваемые данные, поэтому сжатие средствами ssh можно отключить:
export RSYNC_RSH="ssh -c arcfour -o Compression=no -x"
rsync -a -z -v -P --bwlimit=16 /dir1 /dir2 user@test.ru:/dir3/
где, --bwlimit=16 ограничивает пропускную способность при копировании бэкапа в 16 Кбайт в сек.5. Изменение уровня точности при сравнении локального и удаленного времени модификации файлов. Например, для того чтобы считать идентичными файлы время модификации которых отличается на 1 секунду необходимо указать: "--modify-window=1".
Ссылки:
Полезные рецепты при работе с rsync
Backup в Linux: rsync-клиент
cwRsync — реализация rsync под Windows
Спасибо. Полезно. Rsync удобно использовать для отлеживания изменений.
ОтветитьУдалитьА как указывать нестандартный порт ssh?
ОтветитьУдалить-p
Удалить'-e ssh -p 12345'
УдалитьКак можно автоматизировать ввод пароля для доступа по SSH?
ОтветитьУдалитьпо ключам ssh на обоих серверах
ОтветитьУдалитьПробовал cwRsync под Windows скорость намного медленнее чем Linux-Linux, а так быстрая штука
ОтветитьУдалитьrsa ключи открытый и закрытый прогугли
ОтветитьУдалитьСпасибо за статью, а организовать работу сервиса в режиме push на множество хостов?
ОтветитьУдалитьhttp://help.ubuntu.ru/wiki/lsyncd
УдалитьПервое что приходит в голову - просто запустить несколько rsync на разные хосты.
УдалитьЕсли хостов много, то можно написать небольшой скриптик для этого.
Не првоерял, но думаю проблем не должно быть если запустить в паралели синхронизацию на несколько хостов одновременно.
Есть два сервера, на обоих поднята Samba. Папка-источник и папка-получатель отшарены. Делаю на хосте-получателе rsync -a -e ssh host1:/dir1 /dir1, а потом сравниваю с виндовой машины Total Commander'ом - куча файлов, имеющиеся в источнике, в получателе отсутствует, вывода в консоль об ошибках не было. Что копать?
ОтветитьУдалить