• Копирование файлов с помощью rsync. Rsync — Примеры синхронизации

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

    Попробую сберечь вам немного времени на чтение мануала и рассказать о самом важном и полезном. Простыми словами, как есть.

    Зачем нужен rsync?

    Зачем пользоваться rsync если есть привычные cp и scp , спросите вы.

      В одной части rsync удобней и лучше упомянутых аналогов потому что он дает вам возможность увидеть все что он сделает при копировании файлов до непосредственно операции копирования.

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

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

    Принцип применения

    Если мы говорим о простом копировании файлов, то первым делом всегда стоит сделать пробный прогон (ключ -n) в режиме с показом подробностей (-v):

    rsync -avn source example.com:destination

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

    После того как вы убедились что копируется именно то, что вы хотите, можно запускать самое настоящее копирование:

    rsync -av source example.com:destination

    В этой команде ключ -a подразумевает рекурсивное копирование всех файлов и каталогов включая их атрибуты, такие как дата создания и дата изменения. Ключ -v даст вам подробный отчет о работе по мере выполнения и по окончании.

    Правила копирования каталогов

    С одной стороны правила очень простые.

      Если в конце пути до именованного источника нет слеша, то скопируется сам каталог.

      $ rsync -avn path/to/source example.com:destination sending incremental file list source/ source/example.html ...

      Если слеш есть, или источник указывает на каталог без имени, то скопируется содержимое каталога.

      $ rsync -avn path/to/source/ example.com:destination ^^^ sending incremental file list example.html ... # Что эквивалентно такой команде: $ cd path/to/source; rsync -avn . example.com:destination

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

    Потому лучше всегда следовать обычному сценарию с предварительной проверкой операции.

    Некоторые полезные ключи

    Сначала поговорим об опциях которые вам будет здорово знать без шпор и шпаргалок.

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

      Если вы копируете файлы с какого-то очень занятого, или слабого, сервера, то можно исключить трату ресурсов процессора на вычисление изменившихся частей файлов, скопировав их целиком. Для этого нужен ключ -W .

      Если вам хочется знать сколько всего, по мнению rsync, осталось работать, вам нужен ключ --info=progress2 . Если вы копируете целую файловую систему, то этот ключ, будучи использован сам по себе, вас разочарует: информация об итоговом объёме будет постоянно обновляться. Это происходит потому что rsync не пытается считать всю файловую систему до того как начнёт копирование, а делает обе задачи сразу.

      Но не отчаивайтесь! Если вы хотите знать точно сколько осталось работать с самого начала, то можно отключить последовательное сканирование ключём --no-inc-recursive или, короче, --no-i-r .

      $ rsync -ah --partial --info=progress2 --no-i-r source example.com:destination 623.38M 0% 82.23MB/s 0:11:10

      Ключи выше есть начиная с версии 3.1.0, то есть уже работают в Debian stable.

      Если требуется не просто скопировать файлы, а полностью синхронизировать содержимое каталогов, удалив лишние файлы, при этом вам почему-то не с руки синхронизировать файлы с помощью Git , то пригодится ключ --delete (или эквивалентный ему --del).

      С этим ключём rsync удалит лишние файлы из каталого-назначения.

      $ rsync -avn --delete source example.com:destination sending incremental file list deleting source/bad.txt source/ source/test.txt

      Ключ -n в команде выше был оставлен намеренно.

    О сжатии замолвим слово

    Вопреки популярному заблуждению от использования сжатия внутри rsync (ключ -z) больше вреда, чем пользы. Дело в том что всюду используемый OpenSSH уже с версии конца 2005 года по-умолчанию использует сжатие передаваемых данных. Сами понимаете, сжатие уже сжатых данных только лишь использует ресурсы процессора, не уменьшая объем передаваемых данных.

    В том, что при соединении с вашим сервером уже используется сжатие, можно убедиться так:

    $ ssh -v [email protected] false 2>&1 | grep compression debug1: Enabling compression at level 6.

    Если эта команда не покажет , в числе прочих, такую строчку про включение сжатия как выше, то может быть вам стоит использовать сжатие. Стоит проверить что от сжатия есть толк. Особенно это касается маломощных устройств с быстрым соединением: вашему NAS может быть быстрее скопировать что-то по гигабитному линку без сжатия, чем пытаться обогнать гигабитную сеть маломощным процессором.

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

    Копируем частично

    Наверняка вам когда-нибудь понадобится чтобы rsync пропускал некоторые файлы при копировании.

    В самом простейшем случае вам нужно чтобы rsync не копировал файлы разных систем контроля версий, включая каталог вроде.svn и.git . В этой задаче вам не нужно ничего кроме ключа -C (или --cvs-exclude в полной форме). Так файлы большинства популярных VCS будут проигнорированы будто их нет. Не забываем использовать -n при первом запуске.

    rsync -nC example.com:source destination

    Может получиться так что вы, по ошибке, скопируете кучу таких файлов от VCS. В этом случае для получения чистой копии вам пригодится ключ --delete-excluded , с которым все исключенные файлы будут удалены.

    rsync -nC --delete-excluded example.com:source destination

    Исключаем через.rsync-filter

    Если нужные более гибкие правила, что особенно актуально если копирование делается регулярно, то лучше не мелочиться и оформить все исключения в файле.rsync-filter .

    $ cat source/.rsync-filter - test.bin - *.tmp - /.cache - /example/ - /**/Trash/ - /.mozilla/firefox/*/Cache/ + Projects/**/Trash/

    Для исключения чего-либо из списка на перенос нужно добавить в этот файл строчку с правилом (- или + в начале строки).

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

      # никакой файл test.bin не будет скопирован - test.bin # все файлы.tmp будут пропущены - *.tmp

      Если нужно исключить файл или каталог относительно каталога в котором находится.rsync-filter , то укажем со слешем в начале:

      # не будет скопирован каталог или файл.cache, но будут скопированы foo/.cache и foo/bar/.cache - /.cache # не будет скопирован каталог example, но будет скопирован файл example - /example/

      В правилах звездочка соответствует любым символам кроме слеша, а две звездочки соответствуют вообще любым символам:

      # будут пропущены каталоги.local/share/Trash/ и Documents/example/Trash/ - /**/Trash/ # не будет пропущен каталог.mozilla/firefox/abcd.profile/ext/Cache/ # но будет пропущен каталог.mozilla/firefox/abcd.profile/Cache/ - /.mozilla/firefox/*/Cache/

      Наконец, если нужно чтобы какие-то файлы всё-таки копировались, не смотря на ранее заданные правила, то их можно отметить правилом + в начале строки.

      # каталог Projects/Example/layout/Trash/ будет скопирован + Projects/**/Trash/

    Файлы.rsync-filter команда rsync умеет искать по всей структуре каталогов будучи запущена с ключём -F .

    Если нужно чтобы сами эти файлы не копировались, то нужно указать этот ключ два раза так:

    $ rsync -avFFn source example.com:destination sending incremental file list source/ source/example.html source/tmp/ source/tmp/foo.bin sent 174 bytes received 30 bytes 408.00 bytes/sec total size is 18,400 speedup is 90.20 (DRY RUN)

    Как видите, лишние файлы не скопировались:

    $ ls source/.rsync-filter source/foo.tmp source/foo.tmp source/.rsync-filter $ cat source/.rsync-filter - *.tmp

    Ограничим rsync по ssh

    Случается нужно разрешить работу rsync по ssh, удалённо и без пароля, только определённого для каталога и хоста, исключив копирование чего-либо в другие места или из других мест.

    Например, вы хотите чтобы можно было скопировать файлы на сервер backup.example.com только с хоста server.example.com , только и только в каталог backup-example , и только с этими опциями:

    $ rsync -aW --del source/ backup.example.com:destination/backup-example/

    То сначала нужно получить команду, которую rsync выполняет при вызове ssh на удаленном хосте:

    $ rsync -e "ssh -t -v" -aW --del source/ backup.example.com:destination/backup-example/ 2>&1 | grep command debug1: Sending command: rsync --server -lWogDtpre.iLsfxC --delete-during . destination/backup-example/

    Соответственно, в ~/.ssh/authorized_keys на example.com следует добавить для известного ssh ключа запуск этой команды по-умолчанию при подключении:

    from="server.example.com",command="rsync --server -lWogDtpre.iLsfxC --delete-during . destination/backup-example/",no-pty,no-port-forwarding ssh-rsa AAAA... # дальше ваш ключ

    Таким образом, даже если при запуске rsync будут указаны какие-то другие опции, на сервере-назначении всё равно выполнится команда rsync соответствующая исходным, заданным вами, опциям и настройкам.

    Если нужно чтобы ваш бекап нельзя было перезаписать или удалить на сервере назначения, то опцию --del следует заменить на --ignore-existing .

    Машина времени

    Те пользователи macOS и OS X, что делают бэкап, наверняка оценили работу Time Machine . Эта программа позволяет буквально в два клика вернуться к прошлой версии любого файла. Не смотря на все красивости, Time Machine не делает ничего такого чего мы не можем сделать с помощью rsync .

    #!/bin/bash set -o nounset -o errexit cd $(dirname " $0 " ) date = $(date --iso-8601 = seconds) test -L latest || ln -s " $date " latest rsync --delete-excluded --prune-empty-dirs --archive -F --link-dest = ../latest " $@ " "./ $date " rm latest ln -s " $date " latest

    Скрипт следует положить в корень того диска или каталога, куда следует делать бэкапы.

    Запускать с указанием единственного аргумента: каталога с исходными файлами. Например, так.

    /mnt/backups/backup /home

    После нескольких запусков получается такая структура каталога:

    2017-02-08T22:05:04+09:00 2017-02-08T22:10:05+09:00 2017-02-08T22:15:05+09:00 2017-02-08T22:20:06+09:00 2017-02-08T22:25:05+09:00 2017-02-08T22:30:04+09:00 latest -> 2017-02-08T22:30:04+09:00

    При этом latest указывает на самый последний бэкап.

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

    $ du -sh /mnt/backups 4,5M /mnt/backups $ du -sh /home 3,8M /home

    Всё множество копий занимает лишь немного больше места чем исходный каталог. Место уходит на изменившиеся файлы.

    Если ничего не менялось, то место всё равно расходуется на создание каталогов, которые нельзя хранить как жесткие ссылки .

    $ du -hs 2017-02-08T22:20:06+09:00 2017-02-08T22:25:05+09:00 2017-02-08T22:30:04+09:00 3,8M 2017-02-08T22:20:06+09:00 136K 2017-02-08T22:25:05+09:00 136K 2017-02-08T22:30:04+09:00

    Такая существенная экономия возможна благодаря упомянутым жестким ссылкам, которые rsync делает для файлов, не изменившихся с последнего копирования.

    $ stat -c "%i" 2017-02-08*/example.txt | uniq 31819810

    У одинаковых, не менявшихся, файлов будет один и тот же inode.

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

    rsync в основном предназначен для удаленной синхронизации.
    rsync используется для выполнения операций резервного копирования в UNIX / Linux.
    rsync — это утилита, которая используется для синхронизации файлов и директорий двух различных локаций. Считается как одна из самых эффективных. Резервные копии можно создавать как на локальном сервере так и на удаленном.

    Некоторые важные возможности rsync

    Скорость : В первый раз, rsync реплицирует полностью весь контент между источниками и каталогами назначения. В дальнейшем, rsync перемещает только измененные блоки или байты в назначенную локацию, причем делает это действительно быстро. Также имеется возможность ограничить скорость синхронизации.
    Безопасность : rsync позволяет шифровать информацию, используя ssh протокол в процессе перемещения данных.
    Меньшая пропускная способность : rsync использует блочное сжатие и распаковку данных на приемной и отправляющей стороне в указанном порядке, возможность «докачки» файлов. Таким образом пропускная способность будет использоваться rsync-ом всегда гораздо меньше по сравнению с остальными протоколами передачи данных.

    Если имеется доступ по ssh к серверу, это наиболее простой способ для осуществления синхронизации.

    Rsync по ssh — это частный случай использования, общий вид команды выглядит так:

    Rsync [ОПЦИИ] [ПОЛЬЗОВАТЕЛЬ@]СЕРВЕР:ИСТОЧНИК... [ПОЛУЧАТЕЛЬ] Pull (копирование файлов с удаленной системы на локальную) rsync [ОПЦИИ] ИСТОЧНИК 1 [ИСТОЧНИК N] [ПОЛЬЗОВАТЕЛЬ@]СЕРВЕР:ПОЛУЧАТЕЛЬ

    Push (копирование файлов с локальной машины на удаленную)
    Обязательным параметром является «ИСТОЧНИК», их может быть несколько.

    Рассмотрим несколько примеров:

    Примеры:

    Скопируется на сервер 192.168.1.1 содержимое папок /backup/file1/ /backup/file2/ в папку backup

    В этом примере уже скопируются сами папки

    # rsync -zavP /backup/file1/ /backup/file2/ [email protected]:/backup

    Как ограничить скорость передачи файлов? Нужно поставить опцию --bwlimit:

    # rsync -zavP --bwlimit=100 /backup/file1/ [email protected]:/backup

    Как синхронизировать файлы с проверкой по контрольной сумме?

    # rsync -сzavP /backup/file1/ [email protected]:/backup

    Как скопировать файлы с удаленной машины на локальную?

    # rsync -zavP [email protected]:/backup /backup/file1/

    Как исключить файл или директорию при копировании?
    Исключаем директорию temp файл test.txt и все файлы с расширением tgz расположенные в /home/data

    # rsync -azVP --exclude temp/ --exclude test.txt --exclude *.tgz /home/data/ [email protected]:/backup

    Как удалить файлы на приемнике, если их не существует на источнике?

    # rsync -azVP --exclude /temp/ --exclude test.txt --exclude *.tgz --force --delete /home/data/ [email protected]:/backup

    Исключаем директорию /temp файл test.txt и все файлы с расширением tgz расположенные в /home/data

    Как использовать нестандартный порт ssh при копировании rsync?

    # rsync -zavP "-e ssh -p 12345" /var/lib/ [email protected]:/backup # rsync --progress -avz -e ssh /home/ root@сайт:/home/

    Копирует с локального хоста содержимое папки home, на хост сайт в папку home. Для аутентификации используется учетная запись root. В случае обрыва соединения во время копирования, достаточно просто повторить команду и копирование начнется с того места, когда произошел обрыв соединения.

    Rsync --progress --bwlimit=10 -avz -e ssh /home root@сайт:/home/

    Небольшое изменение. Удаляем «/» после папки home и у нас уже копируется сама папка вместе со всем содержимым. Так же ограничиваем скорость копирования до 10кБ/с, что бы не забивать интернет канал.

    Опции:
    -a, --archive режим архива, при использовании заменяет несколько ключей (-rlptgoD)

    — n отладочный режим
    -t , --times – обновлять время модификации файла на приёмной стороне. При отсутствии этой опции или -a становиться неэффективной оптимизация передачи по времени изменения файлов
    -r рекурсивно. (Копирует все файлы, включая вложенные каталоги)
    -l при копировании сохраняет символические ссылки
    -p сохраняет права на файлы
    — t сохраняет время изменения файлов
    — g сохраняет группу файлов
    — o сохраняет владельца файлов (работает только из под root)
    — D сохраняет файлы устройств и специальны файлы
    — P, отображение прогресса при копировании;
    — q, не выводит сообщения об ошибках;
    — с, --checksum проверка файлов по контрольной сумме, а по размеру и дате модификации. Дополнительная нагрузка на процессор, сильно увеличивает время синхронизации;
    — size-only – использование для сверки только размер файлов
    — ignore-errors, продолжение копирования и удаления даже после появления ошибок;
    — max-delete, максимальное число удаляемых за один раз файлов и каталогов;
    — files-from=FILE, задается список файлов и директорий для копирования в файле;
    — numeric-ids – не транслировать имена владельца и группы в цифровые UID и GID, оставить на удалённой стороне номера как есть
    — R – использовать относительные пути при создании символических ссылок
    — A, --acls – сохранение списков ACL
    — H, --hard-links – сохранение жестких ссылок
    — S, --sparse – оптимизировать разреженные файлы
    — x, --one-file-system – не выходить за пределы текущей точки монтирования
    — u, update пропускать обновление файлов, которые новее исходных
    — h, human-readable вывод цифр в читаемом виде (Кб, Мб, Гб)
    -v verbose подробные вывод операций (отладочной информации)
    -z сжатие файлов при копировании
    — compress-level - уровень сжатия
    — e ssh использовать при копировании ssh

    Progress показывает прогресс выполнения копирования
    --bwlimit =KBPS ограничивает скорость передачи файлов (Kbit/s)
    --del – удалить файлы в папке назначения которых нет в источнике (точная копия)
    – –delete-after удалить после. Если в основном месте был удален какой-то файл, или каталог,
    то после синхронизации в backup сервере, в каталоге он тоже будет удален
    - - password-file Путь, где находится файл с паролем.

    Перед тем как запустить скрипт на рабочей машине, опробуйте всё в отладочном режиме, для этого используется ключ -n . В этом случае, rsync не будет менять или удалять файлы, но покажет, весь ход работы.

    Rsync -a --progress /home/ /mnt/export/

    Копирует внутри одного компьютера содержимое папки home, в папку /mnt/export/. Подобное копирование применяется когда необходимо сохранить все права на перемещаемые файлы.

    Потребность передачи файлов между серверами и компьютерами возникает довольно часто, особенно при администрировании нескольких устройств. Обычно для этих целей удобно использовать ssh и scp, но если файл очень большой, а изменена была только небольшая его часть, или вы хотите настроить постоянную автоматическую синхронизацию, то scp уже явно неидеальный вариант. Для этого существуют специальные утилиты. В этой статье мы рассмотрим одну из них. А именно будет рассмотрена rsync синхронизация в linux.

    Rsync — это программное обеспечение с открытым исходным кодом, которое можно использовать для синхронизации файлов и папок с локального компьютера на удаленный и наоборот. Примечательная особенность Rsync — возможность передавать зашифрованные файлы с помощью SSH и SSL. Кроме того, здесь передача файлов выполняется в один поток, в отличие от других подобных программ, создающий отдельный поток для передачи каждого файла. Это увеличивает скорость и убирает дополнительные задержки, которые становятся проблемой при передаче большого количества маленьких файлов.

    Возможно использование rsync для синхронизации файлов, каталогов, при этом может применяться сжатие и шифрование. Программа впервые была применена в июне 1996 года, она разработана Эндрю Тридгелом и Полом Маккеррасом. Rsync синхронизация выполняется по протоколу RSYNC, который специально разработан не просто для передачи файлов между двумя компьютерами, а для их синхронизации. Если точнее, то передается не файл полностью, а только то, что было изменено.

    Как вы уже поняли, в этой статье мы рассмотрим rsync примеры синхронизации, настройку rsync, а также ее основные возможности и опции.

    Особенности Rsync

    Давайте сначала рассмотрим примечательные особенности Rsync:

    • Возможность поддерживать синхронизацию целых деревьев каталогов
    • Можно сохранять символические ссылки, жесткие ссылки, владельцев и права файла, метаданные и время создания.
    • Не требует особых привилегий
    • Передача файлов одним потоком
    • Поддержка RSH, SSH в качестве транспорта
    • Поддержка анонимного Rsync

    Синтаксис Rsync

    Мы не будем подробно останавливаться на установке этой утилиты в системе. Она очень популярна, поэтому вы можете установить ее с помощью своего пакетного менеджера из официальных репозиториев. В Ubuntu команда установки будет выглядеть вот так:

    $ sudo apt-get install rsync

    А теперь, уже по традиции подобных статей, рассмотрим синтаксис команды rsync:

    $ rsync опции источник приемник

    В качестве источника и приемника может выступать удаленная или локальная директория. Например, ssh, rsync, samba сервер или локальная директория. Опции задают дополнительные параметры rsync.

    Опции Rsync

    Теперь давайте кратко рассмотрим параметры rsync. Здесь перечислены не все опции. Для более подробной информации смотрите man rsync:

    • -v — Выводить подробную информацию о процессе копирования
    • -q — Минимум информации
    • -c — Проверка контрольных сумм для файлов
    • -a — Режим архивирования
    • -R — относительные пути
    • -b — создание резервной копии
    • -u — не перезаписывать более новые файлы
    • -l — копировать символьные ссылки
    • -L — копировать содержимое ссылок
    • -H — копировать жесткие ссылки
    • -p — сохранять права для файлов
    • -g — сохранять группу
    • -t — сохранять время модификации
    • -x — работать только в этой файловой системе
    • -e — использовать другой транспорт
    • -z — сжимать файлы перед передачей
    • —delete — удалять файлы которых нет в источнике
    • —exclude — исключить файлы по шаблону
    • —recursive — перебирать директории рекурсивно
    • —no-recursive — отключить рекурсию
    • —progress — выводить прогресс передачи файла
    • —stat — показать статистику передачи
    • —version — версия утилиты

    Настройка сервера Rsync

    Как вы понимаете, нельзя просто так взять и закинуть на первую попавшуюся машину файлы без установки на нее специального программного обеспечения. На удаленной машине должен быть установлен и настроен RSYNC, SSH, Samba или FTP сервер, с помощью которого Rsync сможет авторизоваться на машине и передавать туда файлы.

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

    Сначала создайте конфигурационный файл со следующим содержимым:

    $ sudo nano /etc/rsyncd.conf

    Path = /tmp/share/ hosts allow = 192.168.1.* hosts deny = * list = true uid = root gid = root read only = false

    Здесь мы задаем путь к нашей папке для синхронизации, разрешаем доступ к серверу только с домашней сети (192.168.1.*) и запрещаем все остальные подключения. Параметры uid и gid указывают пользователя и группу, от которых будет запущен демон. Лучше не использовать root, а указать пользователя nobody и выдать ему права на ту папку, в которую будет выполняться rsync синхронизация каталогов.

    $ sudo service rsyncd start

    $ sudo service rsyncd enable

    Примеры синхронизации Rsync

    Копирование и синхронизация файлов на локальном компьютере

    Rsync позволяет синхронизировать файлы и папки в пределах одной машины. Давайте сначала рассмотрим использование rsync для синхронизации файла на локальном компьютере:

    $ rsync -zvh file /tmp/backups/

    Синхронизация папок на локальной машине

    Синхронизация папок rsync выполняется так же просто, как и файлов:

    $ rsync -avzh /home/user/documents /tmp/backups/

    Синхронизация с удаленным сервером

    Ненамного сложнее синхронизировать файлы с удаленным сервером. Скопируем локальную папку documents, на удаленный сервер:

    $ rsync -avz documents/ [email protected]:/home/

    Также само можно синхронизировать файлы с rsync из удаленного сервера:

    $ rsync -avz [email protected]:/home/ documents/

    Адрес удаленного сервера записывается в таком формате:

    имя_пользователя@адрес_машины:порт/папка/на/удаленной_машине

    Порт указывать не обязательно, тогда rsync синхронизация папок будет выполняться на стандартном порту.

    Синхронизация файлов по SSH

    Чтобы задать протокол подключения используется опция -e. При использовании SSH все передаваемые данные шифруются и передаются по защищенному каналу, таким образом, чтобы никто не мог их перехватить.

    Для использования SSH вам нужно знать пароль пользователя в системе.

    Синхронизация файлов rsync с удаленного сервера по ssh будет выглядеть вот так:

    $ rsync -avzhe ssh [email protected]:/root/install.log /tmp/

    А теперь передадим данные на тот же сервер:

    $ rsync -avzhe ssh backup.tar [email protected]:/backups/

    Просмотр прогресса при синхронизации

    Для просмотра прогресса копирования файла с одной машины на другую используется опция progress:

    $ rsync -avzhe ssh --progress /home/user/documents [email protected]:/root/documents

    Синхронизация не всех файлов в rsync

    Опции include и exclude позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями.

    Например, скопируем все файлы, начинающиеся на букву R:

    $ rsync -avze ssh --include "R*" --exclude "*" [email protected]:/root/documents/ /root/documents

    Удаление при синхронизации

    Во время синхронизации можно удалять файлы, которых нет на машине откуда идет rsync синхронизация, для этого используется опция —delete.

    Например:

    $ rsync -avz --delete [email protected]:/documents/ /tmp/documents/

    Если перед выполнением этой команды создать в папке файл которого нет на удаленном сервере, то он будет удален.

    Максимальный размер файлов

    Вы можете указать максимальный размер файлов, которые нужно синхронизировать. Для этого используется опция —max-size. Например, будем синхронизировать только файлы меньше 200 килобайт:

    $ rsync -avzhe ssh --max-size="200k" /user/documents/ [email protected]:/root/documents

    Удаление исходных файлов

    Есть возможность удалять исходные файлы после завершения синхронизации с удаленным сервером:

    $ rsync --remove-source-files -zvh backup.tar /tmp/backups/

    Таким образом, файл backup.tar будет удален после завершения копирования в папку /tmp/backups.

    рекрут 24 октября 2011 в 00:52

    Rsync: мощная утилита для быстрого, гибкого удаленного и локального копирования файлов

    Rsync разработан для замены rcp – древней программы для удаленного копирования под Unix. Благодаря широким возможностям синхронизации и передачи файлов, rsync часто применяется для создания зеркал.
    Использование хитроумного алгоритма, позволяет rsync передавать только изменения в файлах, причем для выявления изменений ему не надо сравнивать два файла. Кроме того, rsync производит сжатие на лету, позволяя тем самым передавать файлы с максимальной эффективностью.
    Кроме вышеописанных вкусностей, rsync обладает также и несколькими полезными возможностями обеспечения безопасности. Он поддерживает ssh – рекомендованный протокол для безопасной передачи данных; перед обработкой информации производит ее запись во временный файл, чтобы ничего не случилось с оригиналом, наконец, он поддерживает специальный режим безопасной отладки команд.
    Rsync прост в использовании, но не является программой «click-and-play». Это -мощный инструмент, который может быть очень полезным, но не стоит забывать об осторожности, так как его с помощью легко что-нибудь испортить.

    Синтаксис утилиты
    Синтаксис утилиты простой и довольно обыденный.
    rsync [опции] источник [приемник]
    Указав только источник, мы увидим список файлов без операции копирования.

    Опции и примеры
    Для простоты понимания, операции синхронизации привожу сперва локально.
    Быстрый способ синхронизировать два каталога, это использовать опцию -a :
    rsync -a foobar_src/ foobar_dst/
    В данном случае файлы и директории из источника скопируются в приемник, при этом, если там были файлы, то совпавшие по имени будут перезаписаны, а остальные не тронуты.

    Опция -a задает архивный режим работы утилиты, и является эквивалентом набора опций:
    -r, --recursive - рекурсивный режим;
    -l, --links - пересоздание symlinks , это значит, что символические ссылки будут так же переноситься;
    -p, --perms - перенос прав;
    -t, --times - передача времени модификации и его обновление на удаленной системе. Этот ключ должен быть установлен для точной синхронизации;
    -g, --group - установить группу конечного файла таким же, как и у исходного;
    -o, --owner - установить владельца конечного файла таким же, как и у исходного;
    -D, - same as --devices --specials - установить тип файла устройства и файла специального типа таким же, как у исходного.
    В итоге получаем копию директории источника. Кстати, это можно использовать при переносе ОС на другой винчестер, подправив /etc/fstab, установив/переустановив grub на новом винте - получаем рабочую систему, но это уже другая тема.

    Для вывода информации о работе утилиты, существует опция -v, --verbose . Чем больше опций -v , тем боле информативным будет вывод утилиты. Максимальная информативность достигается при четырех опциях -v, --verbose .

    Если у нас содержится в директории источника актуальная информация, то чтобы не засорять приемник информацией, которая в процессе работы была удалена или перемещена в источнике, нужно старые файлы и директории удалить. Для этого есть несколько опций удаления, каждая из которых предоставляет свой алгоритм удаления. Их аж шесть!
    --del - сокращенная форма --delete-during ;
    --delete - просто удалить посторонние файлы из приемника;
    --delete-before - приемник удаляет перед передачей;
    --delete-during - приемник удаляет в процессе передачи, но не перед;
    --delete-delay - отложенное удаление/найти файлы для удаления в процессе передачи, но удалить после передачи;
    --delete-after - приемник удаляет после передачи, но не перед ней;
    --delete-excluded - так же удалить исключенные файлы в приемнике, для этого задается шаблон (--exclude=PATTERN).

    Допустим у нас на приемнике есть более свежие файлы, и мы не хотим что бы они были перезаписаны старыми из источника, то для этого применяется ключ -u, --update .
    -u, --update - пропустить файлы, если на приемнике файл новее.
    Не стоит пугаться если изменились даты директорий, т.к. сами файлы небыли перезаписаны.

    Порой файлы могут повредится или быть модифицырованы, но совпадать и датой и размером. То можно использовать проверку контрольной суммы, опция -c, --checksum .

    Моей задачей было разобраться, как сделать резервную копию коллекций фотографий, музыки, наработок по университету и работе. При этом в источнике информация всегда актуальная, а то что удалено - мусор. Пример для решения моей задачи:
    rsync -auvv --delete-during foobar_src/ foobar_dst/
    Это обновит мой приемник, если он был уже чем то заполнен - вычистит то, чего нет в источнике, но не затронет файлы которые поновее, выведет статистику и состояние по каждому файлу.

    Удаленная работа
    Кроме того, очень полезным будет его способность работать через ssh. Что обеспечивает шифрование канала, что очень важно, если вы синхронизируете два сервера в сети интернет. Для уменьшение трафика, rsync так-же умеет сжимать данные, при передаче по сети.
    Необходимы следующие опции:
    -e - задать удаленный шелл для использования;
    -z - сжимать передаваемые данные, либо задать:
    -compress-level=9 - сжатие с установкой уровня компрессии.

    Пример копирования с удаленного хоста по протоколу ssh:
    rsync -avv --delete-during -compress-level=9 -e "ssh -p remote_ssh_port" user@host:/dir/to/foobar_src foobar_dst/
    При этом, на стороне источника нужно иметь установленную утилиту rsync.

    Надеюсь эта информация будет полезна многим. Больше информации про утилиту rsync вы сможете найти в ее же документации, благо она хорошо описана.
    Там же вы можете найти информацию о том, как поднять дэмон rSync для непосредственного подключения без использования удаленного ssh шелла, а так же описание множества других опций на любой вкус и цвет.

    Теги: rsync, копирование, резервирование файлов, синхронизация файлов

    Мартин Стрейчер (Martin Streicher)
    Опубликовано 11.02.2010

    Серия контента:

    За последние 20 лет применение компьютерных сетей стало чрезвычайно широким. Это произошло главным образом благодаря развитию Интернет, инвестициям в национальную и международную сетевую инфраструктуру и падению цен на сетевое и компьютерное оборудование. Сегодня сети являются повсеместными, и всё новые приложения увеличивают требования к масштабируемости и скорости сетей. Когда-то Интернет начинался с нескольких небольших рабочих станций , но сейчас он и его частные аналоги соединяют бесчисленное количество компьютеров.

    Часто используемые сокращения
    • FTP : File Transfer Protocol (протокол передачи файлов)
    • WebDAV : Web-based Distributed Authoring and Versioning (основанный на Web, распределенный протокол с поддержкой авторства и версионности файлов)

    На протяжении этого же периода UNIX® также рос и предлагал для использования все более мощное ПО. Протокол FTP был одним из первых инструментов для обмена файлами между системами, он широко распространен и в наши дни. Команда rcp (сокращение от "remote copy" – удаленное копирование) была шагом вперед по сравнению с FTP, так как она не только предоставляла возможности стандартной утилиты cp , но и копировала файлы с одной машины на другую. rdist , основанная на rcp , автоматически распространяла файлы с одной машины на множество систем.

    Сегодня все эти инструменты устарели, например, rcp и rdist не обеспечивают безопасность при передаче файлов. Теперь их место занимает scp . Хотя FTP все так же широко распространен, но везде, по возможности, следует использовать SFTP (Secure FTP), безопасную версию FTP. Есть также и другие возможности для обмена файлами, например WebDAV и BitTorrent™. Конечно, чем больше машин у вас есть, тем сложнее поддерживать их в синхронизованном или хотя бы известном состоянии. При работе с scp и WebDAV для этого необходимо написать свой собственный сценарий, выполняющий синхронизацию.

    Идеальным инструментом для распределения файлов является rsync . Он умеет возобновлять передачу файлов после разрыва соединения, передает только те куски файла, которые различаются в исходном файле и его копии назначения, а также может выполнять полное или инкрементное резервное копирование. Кроме того, он доступен на всех разновидностях UNIX, в том числе Mac OS X, благодаря чему с его помощью можно легко связать практически любые версии UNIX.

    Для знакомства с rsync сначала рассмотрим типичные варианты его использования, а затем перейдем к более сложным возможностям его применения. Для демонстрации работы rsync я буду использовать Mac OS X версии 10.5, Leopard (разновидность FreeBSD) и Ubuntu Linux® версии 8. Если вы используете другую операционную систему, то есть возможность перенести большинство примеров и на нее; обращайтесь к странице руководства (man) rsync на вашей машине чтобы узнать, поддерживаются ли у вас используемые здесь операции, и при необходимости попытаться найти аналог.

    Знакомимся с rsync

    Так же как cp , rsync копирует файлы из одного места в другое. В отличие от cp , rsync может осуществлять как локальное, так и удаленное копирование. Например, команда, приведенная в , копирует директорию /tmp/photos со всем ее содержимым в домашнюю директорию.

    Листинг 1. Копируем директорию и ее содержимое
    $ rsync -n -av /tmp/photos ~ building file list ... done photos/ photos/Photo 2.jpg photos/Photo 3.jpg photos/Photo 6.jpg photos/Photo 9.jpg sent 218 bytes received 56 bytes 548.00 bytes/sec total size is 375409 speedup is 1370.11

    Параметр -v включает вывод подробных сообщений. Параметр -a (здесь a обозначает архив), является краткой формой записи параметров -rlptgoD , обозначающих, что нужно выполнять рекурсивное (recurse) копирование, копируя символические ссылки как символические ссылки (links), сохраняя у всех файлов права доступа (permissions), время создания (times), группу(group) и владельца файла (owner), а также сохраняя файлы устройств и специальные файлы (devices). Обычно ключ -a создает зеркальную копию файлов за исключением случаев, когда система, на которую выполняется копирование, не поддерживает какие-либо атрибуты копируемых файлов. Например, при копировании директории с UNIX на Windows® не всегда удается идеально отобразить атрибуты. Ниже приводятся несколько предложений для работы в нестандартных ситуациях.

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

    Листинг 7. Копируем файлы на локальную машину
    rsync --port=7777 mymachine.example.com::pickup/ Hello! Welcome to Martin"s rsync server. drwxr-xr-x 4096 2009/08/23 08:56:19 . -rw-r--r-- 0 2009/08/23 08:56:19 article21.html -rw-r--r-- 0 2009/08/23 08:56:19 design.txt -rw-r--r-- 0 2009/08/23 08:56:19 figure1.png

    Поменяв местами адреса источника и назначения, можно записать в модуль файл(ы) с локальной машины, как показано в .

    Листинг 8. Меняем местами директории источника и назначения
    $ rsync -v --port=7777 application.js mymachine.example.com::dropbox Hello! Welcome to Martin"s rsync server. application.js sent 245 bytes received 38 bytes 113.20 bytes/sec total size is 164 speedup is 0.58

    Это был беглый, но довольно полный обзор возможностей rsync . Теперь давайте посмотрим, как можно применять этот пакет для повседневных задач. rsync особенно полезен для резервного копирования. А поскольку он умеет синхронизировать локальные и удаленные файлы или даже файловые системы, то он является идеальным инструментом для управления большими кластерами машин, которые должны быть (по крайней мере, частично) идентичными.

    Организуем резервное копирование своих данных с помощью rsync

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

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

    Установите на удаленной машине ключи SSH, демон rsync и создайте модуль для резервного копирования, разрешающий запись. После этого запустите rsync и, как показано в сценарии из , создавайте резервные копии, которые едва ли будут занимать много места.

    Листинг 9. Создаем ежедневные резервные копии файлов
    #!/bin/sh # This script based on work by Michael Jakl (jakl.michael AT gmail DOTCOM) and used # with express permission. HOST=mymachine.example.com SOURCE=$HOME PATHTOBACKUP=home-backup date=`date "+%Y-%m-%dT%H:%M:%S"` rsync -az --link-dest=$PATHTOBACKUP/current $SOURCE $HOST:PATHTOBACKUP/back-$date ssh $HOST "rm $PATHTOBACKUP/current && ln -s back-$date $PATHTOBACKUP/current"

    Замените HOST именем вашего сервера резервного копирования, а SOURCE – директорией, которую вы хотите сохранять. Замените PATHTOBACKUP на имя модуля. (Также три последние строки сценария можно заключить в цикл и, изменяя переменную SOURCE , делать резервные копии множества директорий). Данный сценарий работает следующим образом.

    • Сначала в переменную date помещается строка вида 2009-08-23T12:32:18 , содержащая текущую дату и время; эта строка будет уникально идентифицировать каждую резервную копию.
    • Главную работу здесь выполняет команда rsync. Параметры -az сохраняют всю информацию о файлах и выполняют сжатие данных перед их передачей, а параметр --link-dest=$PATHTOBACKUP/current указывает, что если какой-либо файл не менялся, нужно не копировать его в новый экземпляр резервной копии, а создать жесткую ссылку, указывающую на этот файл в существующем архиве. Другими словами, новая резервная копия содержит только файлы, претерпевшие изменения , остальные файлы являются ссылками.

      Рассмотрим сценарий более подробно (и подставим вместо всех переменных их значения). Текущим архивом является mymachine.example.com::home-backup/current . Новый архив для каталога /home/strike будет находиться в каталоге mymachine.example.com::home-backup/back-2009-08-23T12:32:18 . Если файл в /home/strike не был изменен, то файл в новом архиве будет представлен жесткой ссылкой на соответствующий файл в текущем архиве. В противном случае новый файл копируется в новый архив.

      Если вы каждый день изменяете лишь небольшое количество файлов и директорий, то дополнительное место, необходимое для очередного экземпляра резервной копии, будет ничтожно мало. Более того, так как все резервные копии (за исключением самой первой) довольно малы, можно поддерживать в своем распоряжении длинную историю ваших файлов.

    • В последнем шаге мы изменяем организацию резервных копий на удаленной машине, чтобы сделать вновь созданный архив текущим архивом и таким образом минимизировать различия, которые нужно будет записать во время следующего выполнения сценария. В последней команде удаляется текущий архив, (который является просто жесткой ссылкой) и создается символическая ссылка с тем же именем, указывающая на новый архив.

    Начав работать с удаленным rsync в повседневных задачах, вам, вероятно, понадобится, чтобы демон был всегда в рабочем состоянии. Для Linux- и UNIX-машин имеется загрузочный сценарий rsync , который обычно находится по адресу /etc/init.d/rsync . Воспользовавшись этим сценарием и утилитой вашей операционной системы, управляющей включением и выключением компонентов, можно организовать запуск rsync при загрузке системы. Если же вы запускаете демон rsync без привилегий суперпользователя или у вас нет доступа к загрузочным сценариям, то вы можете запускать rsync с помощью cron:

    @reboot /usr/bin/rsync --daemon --port=7777 --config=/home/strike/rsyncd/rsyncd.conf

    Эта команда запускает демон каждый раз при перезагрузке машины. Поместите эту строку в файл crontab и сохраните его.

    Вы уже видели, как можно заранее обнаружить проблему, используя предварительный просмотр с помощью -n . Также можно отслеживать состояние задач rsync с помощью двух параметров: --progress и --stats . Первый из этих параметров отображает шкалу хода выполнения задания. Второй показывает статистику сжатия и передачи данных. С помощью --compress можно ускорить передачу данных между машинами. Вместо пересылки данных в изначальном виде отправитель выполняет сжатие перед отправкой, а получатель их распаковывает, и в результате меньшее количество байтов передается за меньшее время.

    По умолчанию rsync копирует все файлы из источника данных в место назначения. Это называется дублированием. Если вы хотите организовать зеркалирование данных, т.е. чтобы локальные и удаленные данные в точности совпадали, следует использовать параметр --delete . Например, если в источнике имеются файлы A, B и C, то по умолчанию rsync создаст на удаленной машине копии всех трех файлов. Однако если удалить из источника, например, файл B и выполнить дублирование еще раз, то на удаленной машине файл B останется, т.е. удаленная копия перестанет быть точной копией локальных данных. Команда --delete обеспечивает зеркалирование данных, убирая из удаленной копии файлы, которые уже не существуют в исходных данных.

    Зачастую имеются файлы, которые вы не хотели бы помещать в архив или резервную копию. Это могут быть вспомогательные файлы, создаваемые редакторами (их имена обычно заканчиваются тильдой [ ~ ]) и другими утилитами, а также множество не имеющих для вас ценности файлов в вашей домашней директории, таких как MP3-файлы, которые при необходимости можно будет восстановить. В таком случае можно указать rsync шаблоны, по которым он будет исключать файлы из обработки. Можно указать в командной строке шаблон или же текстовый файл, содержащий список шаблонов. Также шаблоны можно использовать совместно с командой --delete-excluded , чтобы удалить подобные файлы из удаленной копии.

    Чтобы исключить файлы, соответствующие определенному шаблону, используйте команду --exclude . Помните, что если какие-либо символы в шаблоне имеют для оболочки особое значение, например * , то шаблон следует заключить в одиночные кавычки:

    $ rsync -a --exclude="*~" /home/strike/data example.com::data

    Допустим, что файл /home/strike/excludes содержит следующий список шаблонов:

    *~ *.old *.mp3 tmp

    Тогда скопировать все файлы за исключением тех, которые соответствуют какомy-либо из этих шаблонов, можно с помощью следующей команды:

    $ rsync -a --exclude-from=/home/strike/excludes /home/strike/data example.com::data

    Синхронизируй это

    Теперь, когда вы знакомы с rsync , у вас не осталось никаких причин не выполнять регулярное резервное копирование. Что случилось? Ваша собака разгрызла жесткий диск? (Бывает и такое!) Примите меры заранее, и тогда ваши данные останутся в полном порядке. Ведь теперь все ваши ценные файлы хранятся в