Копія або команда rsync


83

Наступна команда працює належним чином ...

cp -ur /home/abc/* /mnt/windowsabc/

Чи має rsync якусь перевагу над цим? Чи є кращий спосіб синхронізувати папку для резервного копіювання кожні 24 години?


як саме це не працює належним чином?
lunixbochs

12
-u вказує на "оновлення": копіюйте лише відсутні або попередні файли. -r вказує на "рекурсивний": деталізація структури каталогу. Довелося шукати, допомагаючи іншим нубам. :-)
mightypile

для отримання інформації про конкретні прапори в розділах довідки команд, я зазвичай дотримуюся приблизно такого, <cp --help | grep -e -u> або якщо ви хочете скопати інформацію про прапор 'r', використовуйте <cp --help | grep -e -r>. Він покаже вам лише ту частину довідки, вміст якої ви написали після "-e".
парамвір

Відповіді:


58

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


59

rsync не обов'язково є більш ефективним через більш детальну інвентаризацію файлів і блоків, які він виконує. Алгоритм є фантастичним у тому, що він робить, але ви повинні зрозуміти свою проблему, щоб знати, чи справді це буде найкращим вибором.

У дуже великій файловій системі (скажімо, багато тисяч або мільйони файлів), де файли, як правило, додаються, але не оновлюються, "cp -u", швидше за все, буде більш ефективним. cp приймає рішення про копіювання виключно на метадані і може просто дійти до справи копіювання.

Зауважте, що вам може знадобитися деяка буферизація, наприклад, за допомогою tar, а не прямого cp, залежно від розміру файлів, продуктивності мережі, іншої активності диска тощо. Я вважаю таку ідею дуже корисною:

tar cf - . | tar xCf directory -

Самі метадані насправді можуть стати значними накладними витратами на дуже великі (кластерні) файлові системи, але rsync та cp поділять цю проблему.

Здається, rsync часто є найкращим інструментом (і, загалом, додатки - це мій звичайний вибір за замовчуванням), але, ймовірно, є багато людей, які наосліп використовують rsync, не продумуючи його.


18

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

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

Здається, обидві команди приблизно однакові, хоча архівування та розпакування, очевидно, оподатковує систему, де пропускна здатність не є вузьким місцем.


6

Особливо якщо ви використовуєте файлову систему копіювання на запис, наприклад BTRFS або ZFS, rsyncце набагато краще.

Я використовую BTRFS, і це є у мене в моєму ~/.bashrc:

alias cp="rsync -ah --inplace --no-whole-file --info=progress2"

Важливим позначенням для FS CoW, таких як BTRFS, є те, --inplaceщо він копіює лише змінену частину файлів, не створює нових для невеликих змін між файлами inode тощо. Дивіться це .


1
Згідно --inplaceопціонної інструкції : The option implies --partial. Тож, гадаю --partial, не потрібно, принаймні в поточній версії.
Dcortez

4

Майте на увазі, що під час внутрішньої передачі файлів на машині, тобто не через мережеву передачу, використання прапора -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

3

Для локальної копії єдиною перевагою rsync є те, що він уникне копіювання, якщо файл вже існує в цільовому каталозі. Визначення "вже існує" - це (a) однакова назва файлу (b) однакового розміру (c) однакова позначка часу. (Можливо, той самий власник / група; я не впевнений ...)

"Алгоритм rsync" чудово підходить для поступових оновлень файлу через повільне мережеве посилання, але він не буде купувати вам багато для локальної копії, оскільки йому потрібно прочитати існуючий (частковий) файл, щоб запустити його "різницеве" обчислення.

Отже, якщо ви часто виконуєте такий тип команд, а набір змінених файлів невеликий щодо загальної кількості файлів, ви повинні виявити, що rsync швидший, ніж cp. (Також у rsync є --deleteопція, яка може вам виявитися корисною.)


3

Насправді справа не в тому, що є більш ефективним.

Команди 'rsync' і 'cp' не є еквівалентними і досягають різних цілей.

1- rsync може зберегти час створення існуючих файлів. (за допомогою параметра -a)
2- rsync буде запускати багатопроцесорний процес і передавати дані за допомогою локальних або мережевих сокетів. (тобто розгалужується на декілька процесів)
3- Багатопроцесорна обробка та різьбові потоки збільшать вашу пропускну здатність при копіюванні великої кількості невеликих файлів і навіть з кількома більшими файлами.

Таким чином, нижній рядок rsync - для великих даних, а cp - для менших локальних копій. (Від МБ до малого діапазону ГБ). Коли ви починаєте потрапляти в кілька ГБ або в діапазоні TB, використовуйте rsync. І, звичайно, мережеві копії, rsync до кінця.


"rsync може зберегти час створення існуючих файлів. (за допомогою параметра -a)" - "cp -a" може зробити те саме, і це може зробити навіть краще, ніж "rsync -a". "Краще" означає збереження якомога більшої кількості вихідних даних та метаданих; читайте unix.stackexchange.com/questions/443911/… . Rsync та cp майже еквівалентні щодо -a.
Рублацава,

Дякую @Rublacava. Я сканував Інтернет, шукаючи спеціально для -aпорівняння.
Франсуа

1

якщо ви використовуєте cp, не зберігає наявні файли під час копіювання однойменних папок. Скажімо, у вас є ці папки:

/myFolder
  someTextFile.txt

/someOtherFolder
  /myFolder
    wellHelloThere.txt

Потім ви копіюєте одне над іншим:

cp /someOtherFolder/myFolder /myFolder

результат:

/myFolder
  wellHelloThere.txt

Це принаймні те, що відбувається на macOS, і я хотів зберегти файли diff, тому використовував rsync.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.