• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Стаття також доступна російською (перейти до перегляду).

Базова інструкція з rsync — фундамент для подальшого вивчення автоматизації, безпеки

Зміст:

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

Характеристики Rsync та особливості використання 

Програма з'явилася на заміну своїм застарілим аналогам, зокрема, таким, як scp та rcp, і тому має з ними деякі спільні риси, зокрема, у загальному синтаксисі. Наприклад, команда копіювання на віддалений хост має наступний синтаксис:

rsync [опції] … SRC … [REMOTE_USER@]HOST:DEST 

Тутопції – уточнюючі параметри команди запуску програми; SRC – будь який об’єкт файлової системи або їх група для копіювання; HOST – адреса віддаленого хоста; DEST – каталог призначення на віддаленому хості

Синтаксис команди копіювання із віддаленого хоста буде наступним:

rsync [опції] … [REMOTE_USER@]HOST:SRC [DEST] 

Як бачимо, команда копіювання завжди повинна містити джерело даних та пункт призначення, і будь-який з них може бути віддаленим, але не обидва водночас.   

Утиліта була створена для Unix-подібних ОС, але має безліч реалізацій і для інших платформ, зокрема, Windows(cwRsync) та macOS (Grsync). Вона включена у більшість Linux-дистрибутивів.  

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

Для передачі даних утиліта може використовувати захищений протокол ssh або власний протокол rsync із попередньо налаштованим Rsync-сервером. Але стандартним засобом передачі є ssh.  

Утиліта має даемон rsyncd, котрий при потребі завжди можна запустити за допомогою опції–daemon, вказаній у команді запуску 

Виділимо основні особливості утиліти

  • Конвеєрна передача файлів;

  • Використовує будь-яку прозору віддалену оболонку, у тому числі ssh та rsh;

  • Копіює посилання, власників, групи, права доступу та інші метадані файлів; 

  • Підтримка рекурсії при копіюванні та синхронізації;

  • Використовує інкрементальне копіювання для мінімізації витрат ресурсів та підвищення продуктивності;

  • Передача файлів у зашифрованому вигляді;

  • Підтримує анонімні та аутентифіковані даемони rsync;

  • Можливість вказати виключення для копіювання;

  • Не вимагає привілей суперкористувача для її застосування.

Локальне копіювання та синхронізація файлів / каталогів

На нашій локальній машині під управлінням ОС Debian 12 змоделюємо ситуацію, при котрій два каталоги з файлами будуть синхронізуватися один з одним. 

У домашній директорії root-користувача буде знаходитися каталог із ім’ям Files (первісне джерело даних) та каталог із ім’ям Synfiles (пункт призначення). На їх прикладі з’ясуємо на практиці як «працює» команда rsync при використанні найбільш вживаних опцій. Але перед тим виконаємо підготовчий етап – оновимо індекс пакетів та встановимо утиліту Rsync із репозиторію.   

$ apt update

$ apt update

$ apt-get install rsync

$ apt-get install rsync

Вихід команди: Setting up rsync (3.27-1+debian12u2) . Утиліта успішно встановлена. Тепер можна переходити до роботи з утилітою.

Початковий етап створення файлів та копіювання до пункту призначення

Створимо файл у каталогу Files (першоджерело) та внесемо до нього довільну інформацію:

$ nano ~/files/testfile1.txt 

$ nano ~/files/testfile1.txt

Переглянемо статистику для всіх файлів вказаного каталогу:

$ stat -c "%s %n" ~/files/*

$ stat -c "%s %n" ~/files/*

Вихід:

431 /root/files/testfile1.txt

Тепер ми знаємо, що розмір створеного файлу 431 байт.  

Застосуємо команду синхронізації із кількома параметрами: 

-v – вивід детальної інформації про хід процесу копіювання;
-h – вивід чисел у зручному для сприйняття форматі; 
-r – рекурсивний перехід по вкладеним каталогам.

Введемо в терміналі:

$ rsync -vhr ~/files ~/synfiles

$ rsync -vhr ~/files ~/synfiles

Вихід команди:

sending incremental file list
files/
files/testfile1.txt
sent 567 bytes  received 39 bytes  1.21K bytes/sec
total size is 431  speedup is 0.71

Команда скопіювала каталог Files із усім його вмістом у каталог Synfiles. Перевіримо це:

$ ls -h ~/synfiles/  

$ ls -h ~/synfiles/

Вихід: files . Каталог створено.

Перевіримо його вміст:

$ stat -c "%s %n" ~/synfiles/files/*

$ stat -c "%s %n" ~/synfiles/files/*

Вихід: 431 /root/synfiles/files/testfile1.txt

Можна переконатися, що каталог Synfiles містить синхронізовану копію каталогу Files із усіма його вмістом. 

Оновлення синхронізованої копії

Вочевидь, оновлення файлів повинно відбуватися за певними правилами. Наприклад, якщо дата внесення змін у той самий файл «пункту призначення» більш нова, ніж у «джерелі», то оновлювати його не потрібно. Цього можна досягти, застосувавши опцію -u або –update у команді синхронізації. Продемонструємо це. 

Внесемо зміни до файлу testfile1.txt «пункту призначення»:

$ nano ~/synfiles/files/testfile1.txt 

$ nano ~/synfiles/files/testfile1.txt

Перевіримо його новий розмір:

$ stat -c "%s %n" ~/synfiles/files/*

Вихід: 1295 /root/synfiles/files/testfile1.txt

Розмір файлу тепер становить 1295 байт.

Синхронізуємо каталоги із використанням опції -u:

$ rsync -uvhr ~/files ~/synfiles/

$ rsync -uvhr ~/files ~/synfiles/

Вихід команди:

sending incremental file list
sent 86 bytes  received 17 bytes  206.00 bytes/sec
total size is 431  speedup is 4.18

Перевіримо статистику по файлам обох каталогів:

$ stat -c "%s %n" ~/files/* && stat -c "%s %n" ~/synfiles/files/*

$ stat -c "%s %n" ~/files/* && stat -c "%s %n" ~/synfiles/files/*

Вихід:

431 /root/files/testfile1.txt
1295 /root/synfiles/files/testfile1.txt

Можна переконатися, що «новий» розмір файлу не змінився, тобто, його оновлення не відбулося. Однак, якщо б дата внесення змін була старішою або, навіть, рівною даті «джерела», то такі файли завжди оновлюються утилітою.  

Режим моделювання

Режим моделювання застосовується у випадку невпевненості у результатах виконання операції копіювання / синхронізації даних. Він дає змогу отримати інформацію по операціям, котрі будуть виконані при запуску команди rsync. При цьому фактичних змін внесено не буде. Включити вказаний режим можна за допомогою опції --dry-run або в скороченні -n. 

У цьому випадку команда синхронізації буде виглядати наступним чином:

$ rsync -uvhr --dry-run ~/files ~/synfiles/

Або

$ rsync -uvhrn ~/files ~/synfiles/

Окрім того, параметр --dry-run доцільно використовувати сумісно із опцією -i, що дає змогу отримати вичерпну інформацію по всім змінам для кожного окремого файлу, котрий буде оновлений / синхронізований. У цьому разі наша команда буде виглядати наступним чином:

$ rsync -uvhrin ~/files ~/synfiles/

Синхронізація з «виключеннями»

Нерідко трапляється ситуація, коли необхідно синхронізувати каталоги за винятком декотрих файлів «джерела». Це можна зробити за допомогою опції --exclude. Продемонструємо це.

Створимо новий файл у «джерелі» та внесемо до нього довільні дані:

$ nano ~/files/testfile2.txt 

$ nano ~/files/testfile2.txt

Перевіримо статистику:

$ stat -c "%s %n" ~/files/*

$ stat -c "%s %n" ~/files/*

Вихід:

431 /root/files/testfile1.txt
863 /root/files/testfile2.txt

Синхронізуємо каталоги за виключенням нового файлу із ім’ям testfile2.txt:  

$ rsync -uvhr --exclude 'testfile2.txt' ~/files ~/synfiles/

$ rsync -uvhr --exclude 'testfile2.txt' ~/files ~/synfiles/

Вихід команди:

sending incremental file list
sent 86 bytes  received 17 bytes  206.00 bytes/sec
total size is 431  speedup is 4.18

Перевіримо статистику у обох каталогах:

$ stat -c "%s %n" ~/files/* && stat -c "%s %n" ~/synfiles/files/*

$ stat -c "%s %n" ~/files/* && stat -c "%s %n" ~/synfiles/files/*

Вихід:

431 /root/files/testfile1.txt
863 /root/files/testfile2.txt
1295 /root/synfiles/files/testfile1.txt

Можна переконатися, що вказаний файл у «пункті призначення» відсутній.

Тепер синхронізуємо каталоги без опції --exclude:

$ rsync -uvhr ~/files ~/synfiles/

$ rsync -uvhr ~/files ~/synfiles/

Вихід:

sending incremental file list
files/testfile2.txt
sent 1.02K bytes  received 36 bytes  2.11K bytes/sec
total size is 1.29K  speedup is 1.23

Дивимося статистику:

$ stat -c "%s %n" ~/files/* && stat -c "%s %n" ~/synfiles/files/*

$ stat -c "%s %n" ~/files/* && stat -c "%s %n" ~/synfiles/files/*

Вихід:

431 /root/files/testfile1.txt
863 /root/files/testfile2.txt
1295 /root/synfiles/files/testfile1.txt
863 /root/synfiles/files/testfile2.txt

Файл із ім’ям testfile2.txt з’явився у цільовому каталогу, як і повинно бути.

Слід зазначити, що утиліта також підтримує опцію --include, тобто, «включення». Вона застосовується аналогічно першій, тільки з протилежною дією, і тому ми її розглядати не будемо. 

Підтримка актуальності даних

Актуальність даних передбачає повну ідентичність вмісту каталогів на стороні «джерела» та «призначення». Досягти цього можна, зокрема, завдяки застосуванню опції --delete. Наведемо приклад.

Видалимо з первісного каталогу файл із ім’ям testfile1.txt, після чого синхронізуємо каталоги із опцією --delete:

$ rm ~/files/testfile1.txt

$ rm ~/files/testfile1.txt

$ rsync -vhr --delete ~/files ~/synfiles/

$ rsync -vhr --delete ~/files ~/synfiles/

Вихід команди:

sending incremental file list
deleting files/testfile1.txt
files/testfile2.txt
sent 996 bytes  received 59 bytes  2.11K bytes/sec
total size is 863  speedup is 0.82

Перевіряємо статистичну інформацію:

$ stat -c "%s %n" ~/files/* && stat -c "%s %n" ~/synfiles/files/*

$ stat -c "%s %n" ~/files/* && stat -c "%s %n" ~/synfiles/files/*

Вихід:

863 /root/files/testfile2.txt
863 /root/synfiles/files/testfile2.txt

Можна переконатися, що каталоги повністю синхронізувалися між собою. Застосована опція «працює» таким чином, що «вичищає» всі файли з «пункту призначення», котрі відсутні у «джерелі», підтримуючи цим актуальність наявних даних. 

Створення резервних копій

Розглянемо питання створення резервних копій або бекапів каталогу, що синхронізується. Такий бекап фактично буде синхронізуватися разом із даними «джерела» та «пункту призначення». Це забезпечується тим, що опція -b (від backup) для автоматичного створення бекапу присутня в тій самій команді синхронізації, котра запускається для «джерела» та «призначення». Наведемо приклад. 

Наш каталог бекапу буде мати ім’я mybackups та знаходитися у домашній директорії root-користувача. Повний шлях до нього вказується за допомогою параметру --backup-dir. Звісно тут можна вказати будь-який шлях та, навіть, розмістити бекап на іншому диску. Ми можемо створити каталог бекапу самостійно або ж це зробить за нас утиліта Rsync одразу після її запуску у разі його  відсутності.

Введемо в терміналі:      

$ rsync -bavh --backup-dir='/root/mybackups/' ~/files  ~/synfiles/

$ rsync -bavh --backup-dir='/root/mybackups/' ~/files  ~/synfiles/

Вихід:

files/
files/testfile2.txt
sent 1.01K bytes  received 39 bytes  2.10K bytes/sec
total size is 863  speedup is 0.82

Спочатку переконаємося, що первісний каталог продубльовано:

$ ls mybackups/

$ ls mybackups/

Вихід: files 

Ми бачимо, що каталог Files скопійований до каталогу mybackups. 

Переглянемо статистику для нього:

$ stat -c "%s %n" mybackups/files/*

$ stat -c "%s %n" mybackups/files/*

Вихід: 863 mybackups/files/testfile2.txt

Можна переконатися, що файл із ім’ям testfile2.txt повністю співпадає із файлом первісного каталогу. Це означає, що тепер паралельно процесу синхронізації даних «джерела» та «пункту призначення» буде у автоматичному режимі відбуватися резервне копіювання даних

Рішення від FREEhost.UA

Для надійного зберігання резервних копій чудово підійде сервер STG54 — оптимальне поєднання продуктивності та великого дискового простору. Ви отримаєте власний сервер із повним контролем доступу та можливістю автоматичного резервування даних за допомогою rsync. Дізнайтеся більше про сервер для бекапів у відповідному розділі.

Висновки

Ми розглянули основні характеристики Rsync та її базові можливості по оновленню / синхронізації даних. Але реальні можливості утиліти набагато ширші, ніж ми тут показали. Насамперед, це стосується питань автоматизації та безпеки, котрі ми обов’язково розглянемо у наступній нашій статті.  

Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.

Дивіться наш канал Youtube на https://www.youtube.com/freehostua.

Ми у чомусь помилилися, чи щось пропустили?

Напишіть про це у коментарях, ми з задоволенням відповімо та обговоримо Ваші зауваження та пропозиції.

Дата: 28.10.2025
Автор: Олександр Ровник
Голосування

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:

comments powered by Disqus
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA