Rsync — це безкоштовний інструмент командного рядка, який дозволяє синхронізувати файли локально та віддалено. З його допомогою ви можете передавати файли та каталоги.
Це робить його дуже корисним для міграції даних, резервного копіювання та дзеркального відображення, що робить його чудовим для веб-майстрів і адміністраторів для регулярних завдань передачі даних.
Ця стаття навчить нас, як працює Rysnc, і наведе кілька корисних прикладів.
Як працює Rsync?
Rsync — це утиліта командного рядка для віддаленої синхронізації для Unix-подібних систем. Це дає користувачеві можливість безперешкодно передавати/синхронізувати файли між машинами або двома хостами.
Під капотом rsync використовує алгоритм дельта-передачі. Цей алгоритм передбачає копіювання відмінностей між двома файлами на двох хостах (джерело та призначення). Джерело та призначення можуть бути локальними або віддаленими. Команда rsync може виконувати завдання копіювання/синхронізації даних двома способами. Це:
- Використовуйте ssh, rsh для копіювання/синхронізації між двома хостами.
- Використовуйте демон TCP rsync для копіювання/синхронізації.
Оскільки він розроблений для роботи в Unix-подібних системах, він також працює в Linux.
Покроковий процес rsync використовує так:
- Rsync використовує SSH для підключення до віддаленого хосту та запитує пароль.
- Після підключення rsync віддаленого хоста зв’язується з джерелом.
- Потім ці програми визначатимуть файли та каталоги, які потребують синхронізації. Він використовує алгоритм дельта-передачі для перевірки різниці між файлами.
Якщо команда rsync не знаходить файл на віддаленому пристрої, але не на хості, вона скопіює та передасть його до хост-системи. Подібним чином, для вже існуючих файлів (як на хості, так і на віддаленому) він скопіює різницю між ними (тобто, змінені частини). Нарешті, він ігноруватиме наявні файли в обох системах без жодних змін.
Команда rsync забезпечує поступове оновлення, зберігаючи різницю у тимчасовому файлі перед тим, як надсилати її до місця призначення.
Перш ніж почати:
- Ви повинні мати привілеї root або sudo
- Мати доступ до терміналу/командного рядка
- Доступ SSH для безпечного виконання команд rsync
- Вам також потрібні дві машини для створення rsync.
Для підручника ми будемо використовувати Linux Mint 21.1 Vera. Ви можете легко дотримуватися посібника без проблем, використовуючи будь-який інший дистрибутив Linux.
Навіщо використовувати rsync через Scp?
Scp (захищена копія) — це популярний протокол командного рядка, який дозволяє користувачам копіювати файли. Він дотримується лінійного підходу до копіювання. Це означає, що він просто копіює файли з джерела до місця призначення. Щоб це зробити безпечно, він використовує SSH.
Синтаксис команди scp такий:
scp option SOURCE DESTINATION
Однак залишається питання, навіщо використовувати rsync замість scp?
Що ж, використання rsync має багато переваг. Ці переваги включають:
- Швидше виконання: Rsync швидший за scp, оскільки використовує протокол віддаленого оновлення. Це дозволяє передавати лише відмінності, а не весь файл. Отже, якщо ви налаштовуєте регулярну синхронізацію з часом, вам потрібно зробити повну копію лише вперше. З наступного разу він копіює лише оновлені частини за допомогою алгоритму дельта-передачі.
- Менше споживання пропускної здатності: оскільки rsync не потрібно знову копіювати весь файл, це призводить до меншого споживання пропускної здатності. Крім того, він також використовує алгоритми стиснення/декомпресії для мінімізації розміру файлу під час передачі.
- Більше параметрів командного рядка: Rsync також перевершує scp за кількістю параметрів командного рядка. Це означає, що ви можете налаштувати rsync більше, ніж scp.
Підсумовуючи, rsync є чудовим інструментом інкрементної синхронізації. Інструмент scp також корисний для безпечної передачі/синхронізації файлів. У реальному сценарії scp підходить для повсякденних завдань, якщо вам потрібен більш простий підхід. Однак для повторюваних завдань використовуйте rsync.
Синтаксис команди Rsync
Команда rsync така:
Нижче наведено визначення термінів:
- OPTION – це параметри rsync
- SOURCE – вихідний каталог
- DEST – каталог призначення
- USER – віддалене ім’я користувача
- ХОСТ – ім’я віддаленого хоста або IP-адреса
Параметри — це параметри, які пропонують додаткову функціональність команди. Наприклад, ви можете рекурсивно синхронізувати дані за допомогою параметра -r. Однак параметр -r не синхронізує право власності на групи та користувачів, мітки часу, дозволи чи символічні посилання. Замість цього ви можете використати параметр -a, який запускає команду в режимі архіву, забезпечуючи збереження всіх прав власності, дозволів і символічних посилань під час копіювання.
Інші параметри rsync включають:
- -z: стискати дані для економії місця
- -h: забезпечує виведення у форматі, зрозумілому людині
- -b: виконує резервне копіювання під час процесу синхронізації даних
- -e: використовувати протокол SSH для віддаленої передачі даних
- -progress: відобразити хід синхронізації даних
- -v: попросити rsync відобразити детальний вихід
- –n: виконати пробний запуск, щоб перевірити параметри та налаштування для синхронізації даних
- -q: придушити вихід команди rsync і параметри
Встановлення rsync
Більшість систем Unix і Linux постачаються з інстальованим rsync. Якщо у вашій системі немає 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 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
Примітка: ми залишили каталог dest порожнім.
Копіювати каталоги локально рекурсивно
Незважаючи на те, що rsync насамперед призначений для копіювання файлів між локальним і віддаленим сервером, він однаково корисний для копіювання файлів локально.
У цьому випадку ми використаємо наступний синтаксис rsync.
параметр rsync ДЖЕРЕЛО ПРИЗНАЧЕННЯ
Скопіюйте файли з нашого вихідного каталогу до цільового каталогу, виконавши таку команду.
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
Тепер скопіюйте та вставте наступний текст у наноредактор.
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-адресу віддаленої машини, щоб це працювало. Крім того, вам потрібно додати 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
Щоб скопіювати кілька файлів або каталогів з локального на віддалений, вам потрібно вказати шлях у фігурних дужках (розділених комами) після IP-адреси сервера.
rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory
Так само ви можете згадати файли.
Показати поточний прогрес під час передачі
Для резервного копіювання більшого обсягу даних доцільно спостерігати за прогресом у реальному часі. Для цього вам потрібно використовувати прапорець –progress. Додайте його до команди rsync, і ви побачите швидкість передачі, час, що залишився, і кількість переданих даних.
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
Rysnc також дає змогу оцінити перед фактичним запуском. Сухий прогін дозволяє побачити, чи правильно ви робите. Зрештою, ви не хочете помилково оновлювати файли чи навіть видаляти їх.
Вам потрібно використовувати опцію –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
Результат схожий на той, який ми запускали раніше. Однак ви помітите згадку (СУХИЙ РАБОТ) у кінці результату.
Встановіть мінімальний і максимальний розмір файлу
Rysnc також дозволяє встановити мінімальний або максимальний розмір файлу під час передачі.
Отже, якщо ви хочете передати з мінімальним розміром 15 Кб, вам потрібно використовувати –min-size=15 Кб.
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 КБ.
Встановити обмеження пропускної здатності
Якщо ви виконуєте інші завдання, які потребують великої пропускної здатності, ви можете налаштувати rysnc на встановлення обмеження пропускної здатності для передачі. Для цього використовуйте –bwlimit=KB/s.
rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Тут ми встановлюємо пропускну здатність 100 Кбіт/с під час передачі.
Заключні слова
Це веде нас до кінця нашого посібника з команд rsync. Ми навчилися використовувати rysnc і ефективно розглянули багато команд.
Однак rysnc пропонує набагато більше, ніж те, що ми розглянули. Ось чому ви також можете переглянути сторінку довідки rsync, де описано кожен аспект rsync.
Далі перегляньте шпаргалки командного рядка для Windows, Linux і macOS.