Наступна команда працює належним чином ...
cp -ur /home/abc/* /mnt/windowsabc/
Чи має rsync якусь перевагу над цим? Чи є кращий спосіб синхронізувати папку для резервного копіювання кожні 24 години?
Наступна команда працює належним чином ...
cp -ur /home/abc/* /mnt/windowsabc/
Чи має rsync якусь перевагу над цим? Чи є кращий спосіб синхронізувати папку для резервного копіювання кожні 24 години?
Відповіді:
rsync не обов'язково є більш ефективним через більш детальну інвентаризацію файлів і блоків, які він виконує. Алгоритм є фантастичним у тому, що він робить, але ви повинні зрозуміти свою проблему, щоб знати, чи справді це буде найкращим вибором.
У дуже великій файловій системі (скажімо, багато тисяч або мільйони файлів), де файли, як правило, додаються, але не оновлюються, "cp -u", швидше за все, буде більш ефективним. cp приймає рішення про копіювання виключно на метадані і може просто дійти до справи копіювання.
Зауважте, що вам може знадобитися деяка буферизація, наприклад, за допомогою tar, а не прямого cp, залежно від розміру файлів, продуктивності мережі, іншої активності диска тощо. Я вважаю таку ідею дуже корисною:
tar cf - . | tar xCf directory -
Самі метадані насправді можуть стати значними накладними витратами на дуже великі (кластерні) файлові системи, але rsync та cp поділять цю проблему.
Здається, rsync часто є найкращим інструментом (і, загалом, додатки - це мій звичайний вибір за замовчуванням), але, ймовірно, є багато людей, які наосліп використовують rsync, не продумуючи його.
Команда, як написано, створить нові каталоги та файли з поточною позначкою дати та часу, а ви як власник. Якщо ви єдиний користувач у вашій системі і робите це щодня, це може не мати великого значення. Але якщо збереження цих атрибутів має значення для вас, ви можете змінити свою команду за допомогою
cp -pur /home/abc/* /mnt/windowsabc/
-P збереже право власності, позначки часу та режим файлу. Це може бути досить важливим залежно від того, для чого ви створюєте резервну копію.
Альтернативною командою з rsync буде
rsync -avh /home/abc/* /mnt/windowsabc
За допомогою rsync, -a вказує на "архів", який зберігає всі зазначені вище атрибути. -v вказує "багатослівний", який просто перелічує, що він робить з кожним файлом під час запуску. -z тут залишено для локальних копій, але для стиснення, що допоможе, якщо ви робите резервну копію через мережу. Нарешті, -h вказує rsync повідомляти про розміри у зручних для читання форматах, таких як MB, GB тощо.
З цікавості я запустив одну копію для підготовки системи та уникнення упереджень до першого запуску, а потім приурочив наступне для тестового запуску 1 Гб файлів з внутрішнього накопичувача SSD на жорсткий диск, підключений до USB. Вони просто копіюються в порожні цільові каталоги.
cp -pur : 19.5 seconds
rsync -ah : 19.6 seconds
rsync -azh : 61.5 seconds
Здається, обидві команди приблизно однакові, хоча архівування та розпакування, очевидно, оподатковує систему, де пропускна здатність не є вузьким місцем.
Особливо якщо ви використовуєте файлову систему копіювання на запис, наприклад BTRFS або ZFS, rsync
це набагато краще.
Я використовую BTRFS, і це є у мене в моєму ~/.bashrc
:
alias cp="rsync -ah --inplace --no-whole-file --info=progress2"
Важливим позначенням для FS CoW, таких як BTRFS, є те, --inplace
що він копіює лише змінену частину файлів, не створює нових для невеликих змін між файлами inode тощо. Дивіться це .
--inplace
опціонної інструкції : The option implies --partial
. Тож, гадаю --partial
, не потрібно, принаймні в поточній версії.
Майте на увазі, що під час внутрішньої передачі файлів на машині, тобто не через мережеву передачу, використання прапора -z може мати значну різницю у часі, необхідному для передачі.
Передача в межах однієї машини
Case 1: With -z flag:
TAR took: 9.48345208168
Encryption took: 2.79352903366
CP took = 5.07273387909
Rsync took = 30.5113282204
Case 2: Without the -z flag:
TAR took: 10.7535531521
Encryption took: 3.0386879921
CP took = 4.85565590858
Rsync took = 4.94515299797
Для локальної копії єдиною перевагою rsync є те, що він уникне копіювання, якщо файл вже існує в цільовому каталозі. Визначення "вже існує" - це (a) однакова назва файлу (b) однакового розміру (c) однакова позначка часу. (Можливо, той самий власник / група; я не впевнений ...)
"Алгоритм rsync" чудово підходить для поступових оновлень файлу через повільне мережеве посилання, але він не буде купувати вам багато для локальної копії, оскільки йому потрібно прочитати існуючий (частковий) файл, щоб запустити його "різницеве" обчислення.
Отже, якщо ви часто виконуєте такий тип команд, а набір змінених файлів невеликий щодо загальної кількості файлів, ви повинні виявити, що rsync швидший, ніж cp. (Також у rsync є --delete
опція, яка може вам виявитися корисною.)
Насправді справа не в тому, що є більш ефективним.
Команди 'rsync' і 'cp' не є еквівалентними і досягають різних цілей.
1- rsync може зберегти час створення існуючих файлів. (за допомогою параметра -a)
2- rsync буде запускати багатопроцесорний процес і передавати дані за допомогою локальних або мережевих сокетів. (тобто розгалужується на декілька процесів)
3- Багатопроцесорна обробка та різьбові потоки збільшать вашу пропускну здатність при копіюванні великої кількості невеликих файлів і навіть з кількома більшими файлами.
Таким чином, нижній рядок rsync - для великих даних, а cp - для менших локальних копій. (Від МБ до малого діапазону ГБ). Коли ви починаєте потрапляти в кілька ГБ або в діапазоні TB, використовуйте rsync. І, звичайно, мережеві копії, rsync до кінця.
-a
порівняння.
якщо ви використовуєте cp, не зберігає наявні файли під час копіювання однойменних папок. Скажімо, у вас є ці папки:
/myFolder
someTextFile.txt
/someOtherFolder
/myFolder
wellHelloThere.txt
Потім ви копіюєте одне над іншим:
cp /someOtherFolder/myFolder /myFolder
результат:
/myFolder
wellHelloThere.txt
Це принаймні те, що відбувається на macOS, і я хотів зберегти файли diff, тому використовував rsync.