Універсальний інструмент синхронізації файлів: 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.