Посібник Rysnc та 11 прикладів його ефективного використання

Універсальний інструмент синхронізації файлів: Rsync

Rsync – це безкоштовна утиліта командного рядка, призначена для синхронізації файлів як в локальному середовищі, так і між віддаленими системами. Цей потужний інструмент дозволяє ефективно передавати окремі файли та цілі каталоги.

Завдяки своїй функціональності, Rsync ідеально підходить для різноманітних завдань, таких як міграція даних, створення резервних копій та дзеркальне відображення. Це робить його незамінним помічником для веб-розробників та системних адміністраторів у їхніх щоденних операціях з управління даними.

У цій статті ми розглянемо принципи роботи Rsync та продемонструємо декілька корисних прикладів його застосування.

Принцип дії Rsync

Rsync – це утиліта командного рядка для віддаленої синхронізації, розроблена для Unix-подібних операційних систем. Вона забезпечує користувачам можливість безперешкодно переміщувати та синхронізувати файли між різними комп’ютерами або хостами.

В основі роботи Rsync лежить алгоритм дельта-передачі. Цей алгоритм копіює лише ті зміни, які існують між двома файлами на різних хостах (джерело та призначення). Джерело та призначення можуть бути як локальними, так і віддаленими. Синхронізація даних за допомогою Rsync може здійснюватися двома способами:

  • Через SSH або RSH для синхронізації між двома хостами.
  • За допомогою TCP-демона Rsync.

Оскільки Rsync спочатку створювався для Unix-подібних систем, він без проблем працює і в Linux.

Процес роботи Rsync виглядає так:

  • Rsync встановлює SSH-з’єднання з віддаленим хостом та запитує пароль для автентифікації.
  • Після успішного з’єднання, Rsync на віддаленому хості взаємодіє з джерелом даних.
  • Потім ці програми визначають, які файли та каталоги потребують синхронізації. Алгоритм дельта-передачі аналізує відмінності між файлами.

Якщо Rsync виявляє файл на джерелі, якого немає на віддаленому хості, він копіює та переносить його на хост-систему. Якщо файл існує на обох системах, але має відмінності, Rsync копіює лише ці зміни. Файли, ідентичні на обох системах, ігноруються.

Rsync здійснює поступове оновлення, зберігаючи відмінності у тимчасовому файлі перед відправкою їх до місця призначення.

Перед початком роботи з Rsync переконайтеся, що:

  • Ви маєте права root або sudo.
  • У вас є доступ до терміналу або командного рядка.
  • У вас є доступ до SSH для безпечного виконання команд Rsync.
  • У вас є дві машини для тестування Rsync.

Для нашого посібника ми будемо використовувати Linux Mint 21.1 Vera. Ви можете без проблем використовувати будь-який інший дистрибутив Linux.

Rsync проти Scp: чому Rsync є кращим вибором?

Scp (secure copy) – популярний протокол командного рядка для копіювання файлів. Він використовує лінійний підхід до копіювання, тобто просто копіює файли з джерела до місця призначення через SSH.

Синтаксис команди Scp виглядає так:

scp [параметри] ДЖЕРЕЛО ПРИЗНАЧЕННЯ

Проте, виникає питання: чому використовувати Rsync замість Scp?

Переваги використання Rsync:

  • Вища швидкість: Rsync швидший за Scp завдяки протоколу віддаленого оновлення. Він передає лише відмінності між файлами, а не копіює весь файл. Це особливо корисно для регулярної синхронізації, коли повна копія потрібна лише один раз.
  • Економія пропускної здатності: Оскільки Rsync не потрібно знову копіювати весь файл, це зменшує використання пропускної здатності. Він також застосовує стиснення та декомпресію для зменшення розміру файлів під час передачі.
  • Більше параметрів командного рядка: Rsync має більше налаштувань, ніж Scp, що дозволяє більш гнучко керувати процесом синхронізації.

Підсумовуючи, Rsync – це чудовий інструмент для інкрементної синхронізації. Scp корисний для простих завдань безпечної передачі файлів. Scp підійде для щоденних задач, якщо потрібен простий підхід, однак для повторюваних завдань Rsync є більш ефективним.

Синтаксис команди Rsync

Основний синтаксис команди Rsync такий:

rsync [параметри] [джерело] [призначення]

Де:

  • OPTION – параметри Rsync.
  • SOURCE – вихідний каталог.
  • DEST – цільовий каталог.
  • USER – ім’я віддаленого користувача.
  • HOST – ім’я віддаленого хоста або IP-адреса.

Параметри надають додаткові можливості команді. Наприклад, параметр -r дозволяє рекурсивно синхронізувати дані. Однак, -r не зберігає права власності, мітки часу, дозволи та символічні посилання. Параметр -a (режим архіву) копіює всі атрибути файлів.

Інші корисні параметри Rsync:

  • -z: стискає дані для економії місця.
  • -h: відображає вивід у зрозумілому форматі.
  • -b: створює резервні копії під час синхронізації.
  • -e: використовує SSH для віддаленої передачі даних.
  • –progress: відображає хід синхронізації.
  • -v: детальний вивід.
  • -n: пробний запуск для перевірки налаштувань.
  • -q: пригнічує вивід.

Встановлення Rsync

Більшість Unix та Linux систем поставляються з попередньо встановленим Rsync. Якщо у вас його немає, скористайтесь відповідними командами для вашого дистрибутиву:

Debian/Ubuntu/Mint
sudo apt-get install rsync
Arch Linux
pacman -S rsync
Gentoo
emerge sys-apps/rsync
CentOS/Fedora/REHL
sudo yum install rsync
openSUSE
sudo zypper install rsync

У нашому випадку, на Linux Mint, Rsync вже встановлений. Щоб перевірити це, введіть команду “rsync” у терміналі. Це покаже інформацію про його можливості та параметри.

    rsync  version 3.2.3  protocol version 31
    Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
    Web site: https://rsync.samba.org/
    Capabilities:
        64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
        socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
        batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
        symtimes, prealloc, stop-at, no crtimes
    Optimizations:
        SIMD, no asm, openssl-crypto
    Checksum list:
        xxh128 xxh3 xxh64 (xxhash) md5 md4 none
    Compress list:
        zstd lz4 zlibx zlib none

    rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
    are welcome to redistribute it under certain conditions.  See the GNU
    General Public Licence for details.

    rsync is a file transfer program capable of efficient remote update
    via a fast differencing algorithm.
  

Тепер давайте подивимося на використання Rsync на практиці.

Створимо два каталоги для нашого посібника:

  • вихідний каталог
  • цільовий каталог

Для цього виконайте такі команди:

        mkdir source-directory
        mkdir dest-directory
    

Також створимо тестові файли:

touch source-directory/file{1..100}

Це створить 100 порожніх файлів у вихідному каталозі. Перевірте це командою “ls source-directory”.

        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
  

Цільовий каталог залишається порожнім.

Локальне рекурсивне копіювання каталогів

Хоча Rsync переважно використовується для копіювання між локальним та віддаленим серверами, він також корисний для локального копіювання файлів.

В цьому випадку ми будемо використовувати такий синтаксис:

rsync [параметри] [джерело] [призначення]

Скопіюємо файли з вихідного каталогу до цільового:

rsync -r source-directory/ dest-directory

Команда рекурсивно копіює файли з вихідного до цільового каталогу.

      ls dest-directory
      ls source-directory
        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
      rsync -r source-directory/ dest-directory
      ls dest-directory
        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
  

Це скопіює кожен файл з вихідного каталогу до цільового.

Локальне копіювання одного файлу

Тепер, навчившись синхронізувати каталоги, подивимося, як копіювати окремий файл.

Для цього відредагуємо файл “file1” у вихідному каталозі та синхронізуємо його з однойменним файлом у цільовому.

Для редагування файлу виконайте команду:

nano source-directory/file1

Скопіюйте та вставте наступний текст у текстовий редактор:

        We're updating file1 in the source-directory.
        Once we update, we'll push the new update to the dest-directory.
        rsync doesn't need to re-copy the file using the delta-transfer algorithm.
        This algorithm checks the differences and then updates destination files
        accordingly.
        So, once you save file1 in the source-directory, open file1 in
        the dest-directory. It'll be empty.
        However, if we check it after running rsync, you'll see that file1 in dest-directory
        is updated.
    

Збережіть та закрийте файл.

Тепер скопіюємо файл за допомогою Rsync:

sudo rsync -v --existing source-directory/file1 dest-directory
        file1
        sent 557 bytes  received 35 bytes  1,184.00 bytes/sec
        total size is 474  speedup is 0.80
    

Ми використали опцію “–existing”. Це оновить наявні файли. Без неї файл не оновиться, навіть якщо команда виконається успішно.

Якщо файлу немає в цільовому каталозі, використовуйте таку команду:

rsync -v source-directory/newfile dest-directory
        newfile
        sent 82 bytes  received 35 bytes  234.00 bytes/sec
        total size is 0  speedup is 0.00
    

Копіювання декількох файлів

Для копіювання кількох файлів потрібно вказати шляхи до всіх файлів та цільовий каталог.

Створимо два нових файли “newfile2” і “newfile3” у вихідному каталозі:

touch source-directory/newfile{2..3}

Тепер синхронізуємо їх:

rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
        newfile2
        newfile3
        sent 135 bytes  received 54 bytes  378.00 bytes/sec
        total size is 0  speedup is 0.00
    

Копіювання з локального на віддалений

Синтаксис Rsync для передачі з локального на віддалений виглядає так:

rsync [параметри] ДЖЕРЕЛО [користувач@IP-адреса]:[призначення]

Необхідно мати IP-адресу віддаленої машини. IP-адресу потрібно вказувати після вихідного файлу.

rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Перед передачею з’явиться запит на пароль. Якщо на віддаленій машині є інший користувач, вкажіть його ім’я перед IP-адресою через символ @.

rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory

Для копіювання декількох файлів або каталогів, вкажіть шляхи до них:

rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Вказівка спеціальних протоколів віддаленої передачі

Rsync дозволяє використовувати певні протоколи передачі файлів за допомогою параметра “-e”.

Наприклад, для використання SSH потрібно додати “-e ssh”:

rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Копіювання з віддаленого на локальний

Синтаксис Rsync для передачі з віддаленого на локальний:

rsync [параметри] [користувач@IP-адреса]:[джерело] [призначення]

Це працює як запит на отримання. Щоб завантажити файли/каталоги з віддаленого сервера на вашу локальну машину, виконайте таку команду:

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Ця команда перенесе файли з цільового каталогу віддаленої машини до вихідного каталогу локальної машини.

Аналогічно, можна завантажити певний файл, вказавши його повний шлях:

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory

Для копіювання декількох файлів або каталогів, потрібно вказати їх шляхи в фігурних дужках, розділених комами, після IP-адреси:

rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory

Так само можна вказати і файли.

Відображення прогресу передачі

Для копіювання великих об’ємів даних зручно спостерігати за процесом у реальному часі. Для цього використовуйте параметр “–progress”. Він показує швидкість передачі, час, що залишився, та кількість переданих даних.

rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Видалення вихідних файлів після передачі

Використовуйте параметр “–remove-source-files”, щоб видалити вихідні файли після завершення передачі. Це може бути корисно для захисту файлів або звільнення місця.

rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Сухий запуск Rsync

Rsync дозволяє проводити пробний запуск, щоб перевірити налаштування перед фактичною синхронізацією. Це дозволяє уникнути помилкових оновлень або видалень файлів.

Для цього використовуйте опцію “–dry-run”:

sudo rsync -v --dry-run source-directory/file1 dest-directory
        file1
        sent 43 bytes  received 19 bytes  124.00 bytes/sec
        total size is 474  speedup is 7.65 (DRY RUN)
    

Результат схожий на попередній запуск, але містить позначку “(DRY RUN)”.

Встановлення мінімального та максимального розміру файлу

Rsync дозволяє встановлювати мінімальний та максимальний розмір файлів, які потрібно передавати.

Для передачі файлів розміром від 15 КБ: “–min-size=15k”:

rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Файли меншого розміру будуть ігноруватися.

Аналогічно, для обмеження максимального розміру файлу використовуйте “–max-size”:

rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Файли розміром понад 450 КБ будуть ігноруватися.

Обмеження пропускної здатності

Щоб не перевантажувати мережу під час передачі великих обсягів даних, можна обмежити пропускну здатність за допомогою параметра “–bwlimit=KB/s”:

rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Тут ми обмежили пропускну здатність до 100 КБ/с.

Заключні слова

На цьому наш посібник з Rsync закінчено. Ми навчилися використовувати Rsync для різних задач.

Rsync має набагато більше можливостей, ніж ми розглянули. Рекомендуємо ознайомитися з довідкою Rsync для отримання додаткової інформації.

Не забудьте також переглянути шпаргалки командного рядка для Windows, Linux і macOS.