Rsync

Матеріал з Wiki.Zina
Перейти до навігації Перейти до пошуку

Основные параметры

[ред. | ред. код]

Простое копирование

[ред. | ред. код]
rsync -a <что копировать> <куда копировать>
  • -a — archive mode — это набор сразу несколькких параметров , включающих в себя рекурсивность, сохранение прав, групп, времени, копирование симлинков и специальных файлов.

Важно: формат имен каталогов

[ред. | ред. код]

При копировании каталогов (а не файлов) следует обратить внимание на знак / замыкающий имя каталога-источника, т.к. rsync будет интерпретировать результат по-разному:

rsync -a каталог-источник каталог-назначения/
rsync -a каталог-источник/ каталог-назначения/

Наличие завершающих слешей / обязательно, иначе результат копирования будет содержать корневую папку каталог-источник внутри каталога-назначения.

Копирование файла а из dir1 в dir2:

rsync -a ~/dir1/a ~/dir2/

Копирование всех файлов из dir1 в dir2:

rsync -a ~/dir1/ ~/dir2/

Копирование самой директории dir1 (со всем содержимым) в dir2:

rsync -a ~/dir1 ~/dir2/

Сжатие / компрессия во время передачи

[ред. | ред. код]

Параметр -z или --compress:

rsync -az <что копировать> <куда копировать>

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

Отображение информации во время копирования

[ред. | ред. код]
  • -v, --verbose — отображдение большего количества информации
  • -h, --human-readable — отображение чисел в человекопонятном формате
  • --progress — прогресс копирования

Соответственно, более информативный вид команды:

rsync -avh --progress <что копировать> <куда копировать>

Синхронизация каталогов

[ред. | ред. код]

По умолчанию rsync копирует только:

  • новые файлы, которых еще нету на месте назначения,
  • измененные файлы, отличающиеся от тех, что есть на месте назначения.

Т.е. уже по умолчанию он хорошо работает и корректно синхронизирует место назначения с источником, не гоняя по сети ненужные файлы.

а) на месте назначения есть более свежие версии файлов

[ред. | ред. код]

В ситуации, когда на месте назначения могут быть файлы более новые, чем на источнике, и их нужно сохранить, следует добавить параметр -u (--update).

Также в этой ситуации может помочь двусторонняя синхронизация (объединить содержимое dir1 и dir2):

rsync -a ~/dir1/ ~/dir2/ && rsync -a ~/dir2/ ~/dir1/

б) на источнике были удалены файлы, которые больше не нужны

[ред. | ред. код]

По умолчанию rsync не удаляет на месте назначения файлы, которые были удалены на источнике. Это поведение можно изменить с помощью параметра --delete.

Точная копия каталогов (с удалением всех файлов из dir2, которых нет в dir1):

rsync -a --delete ~/dir1/ ~/dir2/

Исключения, которые не нужно копировать

[ред. | ред. код]

Исключить каталоги, синхронизация которых не требуется (например, каталог dir3, находящийся в dir1, при копировании последнего в dir2 будет пропущен):

rsync -a ~/dir1/ --exclude="./~dir3/" ~/dir2/

Исключение нескольких каталогов делается повторением парметра --exclude. Примеры исключений из реальной жизни:

--exclude="- mod-tmp/" 
--exclude="- munin/" 
--exclude="- nginx-logs/" 
--exclude="- httpd-logs/" 
--exclude="- mysql_db_error.log"

Большие файлы и докачка

[ред. | ред. код]

По умолчанию в rsync в случае разрыва соединения частично переданные файлы удаляются. Чтобы изменить это, необходимо добавить параметр --partial.

Есть короткий параметр -P, который включает в себя два других параметра:

  • --partial — сохранять частично скопированные файлы.
  • --progress — отображать прогресс передачи файлов.

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

Можно использовать параметр --partial-dir=DIR (например --partial-dir=.rsync-partial), чтобы в место назначения попадали только полностью скопированные файлы, а частично скопированные хранились в отдельной папке.

Параметр --append-verify сравнивает файлы на обоих концах передачи по контрольным суммам. Этот параметр позволяет сделать полноценную и безопасную синхронизацию даже в случае, если был обрыв передачи при предыдущем копировании.

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

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

Итого: для копирования больших файлов с возможностью докачки нужно использовать ключи --partial (или -P, или --partial-dir=.rsync-partial) и --append-verify. Параметр --partial говорит о том, что нужно оставлять даже не полностью скопированные файлы, а --append-verify говорит о том, что если файл уже есть нужно проверить, возможно он не полностью синхронизирован, и синхронизировать остаток.

Работа с удаленной машиной

[ред. | ред. код]

Для использования SSH не нужно никаких дополнительных параметров типа -e ssh. Если цель указывается в виде user@host:/path/to/files, то и так по умолчанию будет использован SSH.

Параметр -e ssh может потребоваться, если нужно указать какие-то специфические особенности использования SSH:

  • указать нестандартный порт SSH: -e 'ssh -p 2222'
  • указать нестандартное расположение приватного ключа: -e 'ssh -i /path/to/private/key/file.pem'

Синхронизация-копирование с локальной машины на хостинг

[ред. | ред. код]
rsync -avzh --delete --progress /var/www/observer.test/html/ zinamuseum@zinahost.com:www/observer.megalit.org/

Копирование на NAS

[ред. | ред. код]

Для доступа к NAS снаружи нужно в роутере прописать перенаправление TCP порта 873.

Указывать наш NAS rsync-у будем в виде

rsync@134.249.168.79::NetBackup/

Копируем директорию на удаленную систему

rsync -av /tmp/photos rsync@134.249.168.79::NetBackup/
rsync -av --progress /var/www/ rsync@134.249.168.79::NetBackup/91.197.131.59/2014-11-07 &

Копирование с NAS на сервер

[ред. | ред. код]
rsync -zauvP --exclude="- cache/**" /var/www/s_techlguagmailc/ root@77.120.120.73:/var/www/s_techlguagmailc/

Копирование с одного сервера на другой

[ред. | ред. код]
rsync -zauvP --exclude="- cache/" --exclude="- mod-tmp/" /var/www/s_techlguagmailc/ root@77.120.120.73:/var/www/s_techlguagmailc/
rsync -zauvP --exclude="- cache/" /var/www/ rsync@134.249.168.79::NetBackup/91.197.131.59/2014-11-07

Находимся на новом сервере, копируем файлы сайта со старого сервера host.com в папку old:

rsync --recursive --perms --times --partial --progress --verbose USER@HOST.COM:/var/www/USER/data/www old
rsync -rptPv USER@HOST.COM:www old
  • -z — compress file data during the transfer
  • -a — archive mode; equals -rlptgoD (no -H, -A, -X)
    • -r, --recursive — recurse into directories
    • -l — copy symlinks as symlinks
    • -p, --perms — preserve permissions
    • -t, --times — preserve modification times
    • -g — preserve group
    • -o — preserve owner (super-user only)
    • -D — preserve device files (super-user only) and preserve special files
  • -u, --update — skip files that are newer on the receiver
  • -v, --verbose — increase verbosity
  • --partial — keep partially transferred files
  • --progress — show progress during transfer
  • -P — same as --partial --progress — keep partially transferred files, show progress during transfer

Копирование в пределах одного компьютера с исключением папок

[ред. | ред. код]
rsync -avP --exclude="- cache/" --exclude="- default/files/" --exclude="- ckfinder" /var/www/obzor/data/www/obzor.com.ua/ /var/www/obzor/data/www/beta.obzor.lg.ua/

или, если мы находимся внутри папки www:

rsync -avP --exclude="- cache/" --exclude="- default/files/" --exclude="- ckfinder" obzor.com.ua/ beta.obzor.lg.ua/

Запуск в фоне

[ред. | ред. код]
screen команда
ctrl-a
d

Вернуть из фона:

screen -list
(видим имя_процесса)
screen -r имя_процесса

Скрипт деплоя на основе rsync

[ред. | ред. код]
#!/bin/sh

LOCAL="/var/www/example.test/html/" # site directory on the local machine
USER=username
HOST=zinahost.com
DIR="www/example.com/" # the directory on hosting server where your web site files should go

rsync -azv --delete --progress ${LOCAL} ${USER}@${HOST}:${DIR}

exit 0

Чтобы rsync не спрашивал пароль, нужно настроить авторизацию SSH по ключу.

Ссылки

[ред. | ред. код]