Інструмент 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 vs. Scp: в чому різниця?
Scp (secure copy) є відомим протоколом командного рядка, який використовується для копіювання файлів. Він працює за лінійним принципом, тобто просто копіює файли з джерела до місця призначення, використовуючи SSH для забезпечення безпеки.
Синтаксис команди scp наступний:
scp option SOURCE DESTINATION
Однак, чому варто використовувати rsync, а не scp?
Використання rsync має ряд значних переваг:
- Швидкість виконання: rsync є швидшим за scp, оскільки застосовує протокол віддаленого оновлення. Це дозволяє передавати лише відмінності, а не весь файл. Якщо ви налаштовуєте регулярну синхронізацію, повну копію потрібно робити лише перший раз, а наступні рази rsync копіює лише оновлені частини.
- Економія пропускної здатності: Завдяки тому, що rsync не потрібно копіювати весь файл, це значно зменшує споживання пропускної здатності. Крім того, він також використовує алгоритми стиснення/декомпресії для зменшення розміру файлів під час передачі.
- Більше параметрів командного рядка: rsync пропонує більше параметрів командного рядка, що дозволяє точніше налаштувати процес синхронізації.
В цілому, rsync є чудовим інструментом для інкрементальної синхронізації, тоді як scp підходить для простих завдань передачі файлів. Якщо вам потрібен простий підхід, scp є хорошим вибором для повсякденних завдань. Однак, для повторюваних завдань з синхронізацією даних, rsync виявляється більш ефективним.
Синтаксис команди rsync
Основний синтаксис команди rsync виглядає так:
rsync [OPTION] SOURCE [USER@]HOST:DEST
Пояснення термінів:
- OPTION — це параметри команди rsync.
- SOURCE — вихідний каталог.
- DEST — каталог призначення.
- USER — ім’я віддаленого користувача (необов’язково).
- HOST — ім’я віддаленого хоста або IP-адреса.
Параметри надають додаткову функціональність. Наприклад, параметр `-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` у терміналі. Ви отримаєте детальну інформацію про можливості, параметри та інші важливі дані.
nitt ~ $ 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
Для того щоб rsync мав файли для роботи, створимо декілька тестових файлів за допомогою наступної команди:
touch source-directory/file{1..100}
Це створить 100 порожніх файлів у вихідному каталозі. Ви можете перевірити це, ввівши команду `ls source-directory`.
ls source-directory Output: nitt rsync-tutorial $ ls dest-directory source-directory nitt rsync-tutorial $ touch source-directory/file{1..100} nitt rsync-tutorial $ 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 parameter SOURCE DESTINATION
Скопіюємо файли з нашого вихідного каталогу до цільового, виконавши наступну команду:
rsync -r source-directory/ dest-directory
Ця команда рекурсивно скопіює файли з вихідного каталогу до цільового.
nitt rsync-tutorial $ ls dest-directory source-directory nitt rsync-tutorial $ ls dest-directory nitt rsync-tutorial $ 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 nitt rsync-tutorial $ rsync -r source-directory/ dest-directory nitt rsync-tutorial $ 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
Скопіюйте та вставте наступний текст у nano-редактор:
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
#Output nitt rsync-tutorial $ 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 nitt rsync-tutorial $
Зверніть увагу, ми використали опцію `–existing`. Це оновлює лише наявні файли. Якщо ви запустите команду без цього параметра, файл не оновить вміст, навіть якщо команда виконається успішно.
Якщо файл, який ви копіюєте, не існує у цільовій папці, скористайтеся такою командою:
rsync -v source-directory/newfile dest-directory
#Output nitt rsync-tutorial $ 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
#Output nitt rsync-tutorial $ 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 nitt rsync-tutorial $
Копіювання файлу або каталогу з локального на віддалений сервер
Синтаксис rsync для передачі з локального на віддалений сервер виглядає так:
rsync option SOURCE [email protected]:DEST
Вам знадобиться 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.
rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Копіювання файлу або каталогу з віддаленого на локальний сервер
Синтаксис rsync для передачі з віддаленого на локальний комп’ютер виглядає так:
sync option [email protected]:SRC DEST
Для отримання файлів або каталогу з віддаленого сервера, виконайте команду:
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
Для копіювання декількох файлів або каталогів, вкажіть їхні шляхи в фігурних дужках, розділених комами:
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
nitt rsync-tutorial $ 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) nitt rsync-tutorial
Результат буде схожий на звичайний запуск, але в кінці буде вказано `(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
Команда скопіює файли розміром не менше 15 Кб. Файли меншого розміру будуть проігноровані.
Аналогічно, використовуйте параметр `–max-size` для встановлення максимального розміру файлів.
rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Тут rsync ігноруватиме файли розміром понад 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 пропонує набагато більше можливостей, ніж ми розглянули тут. Для більш глибокого вивчення, ви можете переглянути сторінку довідки rsync, де детально описаний кожен аспект інструменту.
Не забудьте ознайомитися з шпаргалками командного рядка для Windows, Linux та macOS для покращення вашої продуктивності.