Поиск по сайту:

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


Введение

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

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

Предпосылки

Чтобы попрактиковаться в использовании 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

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

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

Заключение

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

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