Как использовать Rsync для синхронизации локальных и удаленных каталогов

Введение

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

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

Разверните ваши фронтенд-приложения из GitHub с помощью платформы приложений DigitalOcean. Позвольте DigitalOcean масштабировать ваше приложение.

Предварительные требования

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

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

Независимо от того, какие типы машин вы используете для следования этому руководству, вам нужно будет создать SSH-ключи на обоих из них. Затем скопируйте открытый ключ каждого сервера в файл authorized_keys другого сервера, как описано в Шаге 2 этого руководства.

Это руководство было протестировано на машинах с установленной Ubuntu 20.04, хотя в общем случае оно должно работать с любыми компьютерами, работающими под управлением операционной системы на базе Linux и имеющими установленный rsync.

Определение Rsync

Rsync – это очень гибкий средство синхронизации, доступное через сеть. Благодаря его широкому распространению в Linux и подобных Unix-системах и его популярности как инструмента для системных скриптов, он включен по умолчанию в большинство дистрибутивов Linux.

Понимание синтаксиса Rsync

Синтаксис rsync работает аналогично другим инструментам, таким как ssh, scp и cp.

Сначала перейдите в ваш домашний каталог, запустив следующую команду:

  1. cd ~

Затем создайте тестовый каталог:

  1. mkdir dir1

Создайте еще один тестовый каталог:

  1. mkdir dir2

Теперь добавьте несколько тестовых файлов:

  1. touch dir1/file{1..100}

Теперь есть каталог с именем dir1 с 100 пустыми файлами в нем. Подтвердите, перечислив файлы:

  1. ls dir1
Output
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90 file10 file19 file28 file37 file46 file55 file64 file73 file82 file91 file100 file2 file29 file38 file47 file56 file65 file74 file83 file92 file11 file20 file3 file39 file48 file57 file66 file75 file84 file93 file12 file21 file30 file4 file49 file58 file67 file76 file85 file94 file13 file22 file31 file40 file5 file59 file68 file77 file86 file95 file14 file23 file32 file41 file50 file6 file69 file78 file87 file96 file15 file24 file33 file42 file51 file60 file7 file79 file88 file97 file16 file25 file34 file43 file52 file61 file70 file8 file89 file98 file17 file26 file35 file44 file53 file62 file71 file80 file9 file99

У вас также есть пустой каталог с именем dir2. Чтобы синхронизировать содержимое dir1 с dir2 на том же системе, выполните rsync и используйте флаг -r, который означает “рекурсивно” и необходим для синхронизации каталогов:

  1. rsync -r dir1/ dir2

Другой вариант – использовать флаг -a, который является комбинированным флагом и означает “архив”. Этот флаг синхронизирует рекурсивно и сохраняет символические ссылки, специальные и устройственные файлы, времена изменения, группы, владельцев и разрешения. Он используется чаще, чем -r, и является рекомендуемым флагом для использования. Выполните ту же команду, что и в предыдущем примере, на этот раз с использованием флага -a:

  1. rsync -a dir1/ dir2

Обратите внимание, что в конце первого аргумента в синтаксисе предыдущих двух команд есть косая черта (/) и выделена здесь:

  1. rsync -a dir1/ dir2

Эта косая черта указывает на содержимое dir1. Без косой черты dir1, включая каталог, будет размещен внутри dir2. Результатом будет иерархия, подобная следующей:

~/dir2/dir1/[files]

Еще одним советом является дважды проверить ваши аргументы перед выполнением команды rsync. Rsync предоставляет метод для этого, передавая опции -n или --dry-run. Флаг -v, что означает “подробно”, также необходим для получения соответствующего вывода. Вы будете комбинировать флаги a, n и v в следующей команде:

  1. rsync -anv dir1/ dir2
Output
sending incremental file list ./ file1 file10 file100 file11 file12 file13 file14 file15 file16 file17 file18 . . .

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

  1. rsync -anv dir1 dir2
Output
sending incremental file list dir1/ dir1/file1 dir1/file10 dir1/file100 dir1/file11 dir1/file12 dir1/file13 dir1/file14 dir1/file15 dir1/file16 dir1/file17 dir1/file18 . . .

Этот вывод теперь демонстрирует, что передан сам каталог, а не только файлы внутри каталога.

Использование Rsync для синхронизации с удаленной системой

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

  1. rsync -a ~/dir1 username@remote_host:destination_directory

Этот процесс называется операцией push, потому что он “переносит” каталог с локальной системы на удаленную систему. Противоположная операция – pull, используется для синхронизации удаленного каталога с локальной системой. Если каталог dir1 находился бы на удаленной системе вместо вашей локальной системы, синтаксис был бы следующим:

  1. rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

Как и в случае с командой cp и аналогичными инструментами, исходный объект всегда является первым аргументом, а целевой объект – всегда вторым.

Использование других опций Rsync

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

Если вы передаете файлы, которые еще не были сжаты, как текстовые файлы, вы можете уменьшить сетевой трафик, добавив сжатие с помощью опции -z:

  1. rsync -az source destination

Флаг -P также полезен. Он объединяет флаги --progress и --partial. Первый флаг обеспечивает строку состояния для передач, а второй флаг позволяет возобновлять прерванные передачи:

  1. rsync -azP source destination
Output
sending incremental file list created directory destination source/ source/file1 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101) sourcefile10 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101) source/file100 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101) source/file11 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101) source/file12 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101) . . .

Если вы снова запустите команду, вы получите сокращенный вывод, поскольку изменения не были внесены. Это иллюстрирует способность Rsync использовать времена модификации для определения внесенных изменений:

  1. rsync -azP source destination
Output
sending incremental file list sent 818 bytes received 12 bytes 1660.00 bytes/sec total size is 0 speedup is 0.00

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

  1. touch dir1/file{1..10}

Затем, если вы снова запустите rsync с -azP, вы заметите в выводе, как Rsync интеллектуально перекопирует только измененные файлы:

  1. rsync -azP source destination
Output
sending incremental file list file1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101) file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101) file2 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101) file3 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101) . . .

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

Вы можете изменить это поведение с помощью параметра --delete. Прежде чем использовать этот параметр, вы можете использовать -n, параметр --dry-run, для выполнения теста и предотвращения нежелательной потери данных:

  1. rsync -an --delete source destination

Если вы предпочитаете исключить определенные файлы или каталоги, находящиеся внутри синхронизируемого каталога, вы можете сделать это, указав их в списке, разделенном запятыми, после параметра --exclude=:

  1. rsync -a --exclude=pattern_to_exclude source destination

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

  1. rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

Наконец, параметр --backup Rsync можно использовать для создания резервных копий важных файлов. Он используется совместно с параметром --backup-dir, который указывает каталог, где должны храниться файлы резервных копий:

  1. rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

Заключение

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

A mastery of Rsync allows you to design complex backup operations and obtain fine-grained control over how and what is transferred.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories