Відновити передачу одного файлу rsync


52

В Ubuntu я хочу скопіювати великий файл з мого жорсткого диска на знімний диск rsync. З іншої причини операція не може завершитися за один цикл. Тому я намагаюся розібратися, як використати rsyncдля відновлення копіювання файлу з того місця, де він минув останній час.

Я намагався використовувати опцію --partialабо --inplace, але разом з --progress, я знайшов rsyncз --partialабо на --inplaceсамому справі починається з самого початку , а НЕ від того , що залишилося в останній раз. Ручне зупинення на rsyncранньому етапі та перевірка розміру отриманого файлу також підтвердили те, що я знайшов.

Але з --append, rsync починається з того, що залишилося минулого разу.

Я збентежений , як я побачив на сторінці людини --partial , --inplaceі , --appendздається, пов'язані з відновленням копіювання з того, що залишилося в останній раз. Хтось здатний пояснити різницю? Чому б не працювати --partialчи не --inplaceпоновлювати копіювання? Чи правда, що для відновлення копіювання rsyncдоводиться працювати з цим --appendваріантом?

Крім того, якщо частковий файл був залишений, mvа cpне rsync, rsync --appendправильно відновить копіювання файлу?

Відповіді:


39

Щоб відновити перервану копію, слід використовувати rsync --append. З пояснення чоловічої сторінки --append:

Це змушує rsync оновлювати файл, додаючи дані на кінець файлу, що передбачає, що дані, які вже є на стороні прийому, ідентичні початку роботи файлу на стороні відправки. [...] Імпліє --inplace, [...]

Опція --inplaceзмушує rsync(понад) записувати вміст файлу призначення безпосередньо; без --inplace , rsyncбуде:

  1. створити новий файл з тимчасовим іменем,
  2. скопіюйте оновлений вміст у нього,
  3. поміняйте його файлом призначення та нарешті
  4. видаліть стару копію файлу призначення.

Звичайний режим роботи в основному запобігає конфліктам із програмами, у яких може бути відкритий файл призначення, та кількома іншими випадковими помилками, які належним чином перераховані у вікні сторінки rsync.

Зауважте, що якщо операція копіювання / оновлення не виконана в кроках 1.-3. вище, rsyncбуде видалено тимчасовий файл призначення; --partial опція відключає цю поведінку і rsyncзалишить частково перенесені тимчасові файли в файлової системі призначення. Таким чином, відновлення операції копіювання одного файлу не отримає багато, якщо ви не зателефонували першому rsyncз --partialабо --partial-dir(такий же ефект, як --partial, крім того, інструкція rsync створювати всі тимчасові файли у певній папці).


Дякую! Якщо частковий файл залишив mv або cp, а не rsync, чи буде rsync - застосувати правильно відновлення копіювання файлу?
Тім

1
@ Тім Коротше кажучи, --appendробить rsyncвважають , що, якщо два відповідних файлів мають різну довжину, то коротше , один ідентичний початковій частині довгою. Так, так, якщо ви почнете копіювати великий файл із cpі перервати процес копіювання, то rsync --appendскопіюйте лише решту частини файлу. ( Примітка: якщо cpпереривається гуркотом системи, існує невелика ймовірність того, що вміст файлів і метаданих не синхронізовані, тобто, файл пошкоджений В цьому випадку працює. rsyncЩе раз , НЕ --append повинні вирішити цю проблему.)
Ріккардо Муррі

2
Отже, якщо я правильно це розумію, немає способу сказати rsync перевірити частковий файл та відновити передачу до цього частково переданого файлу ?
Вінні

1
@Winny, дуже запізніло: для локальної копії немає розумного способу зробити це. Для мережевої копії це режим за замовчуванням, коли ви вказуєте --partialбез --append.
roaima

1
@ У Вінні --appendі --append-verifyнебезпечний випадок несправності: коли файл приймача однакового розміру або більше, але має різні дані. Я пропоную рішення--no-whole-file замість цього.
Том Хейл

21

Будьте в курсі, що --appendмається на увазі --inplace, що саме собою --partial.

  • Просто використовуючи, --partialви повинні rsyncзалишити часткові передачі та відновити їх у наступних спробах.

  • Використовуючи, --appendви повинні викликати rsyncяк залишення часткових файлів, так і відновлення їх наступного разу. Після передачі rsyncслід перевірити лише контрольну суму переданих даних.

  • --append-verify включає весь файл у перевірку контрольної суми, включаючи будь-яку частину, передану в попередній передачі.

  • За умови перевірки контрольної суми --appendабо --append-verifyз помилкою, це призведе до повного передачі файлу (за допомогою --inplace)

Ви повинні мати змогу відновити операцію mvабо виконати cpоперацію, rsyncале, можливо, ви хочете скористатися цим --append-verifyваріантом для спокою.

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

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

Більше інформації на сторінці man


--appendі --append-verifyє небезпечний випадок несправності: коли файл приймача однакового розміру або більше, але має різні дані. Я пропоную рішення--no-whole-file замість цього.
Том Хейл

Документація @TomHale передбачає, що для того, щоб файл можна було пропустити, він повинен мати точно однаковий розмір і час модифікації на обох кінцях. Якщо це серйозне занепокоєння, тоді --checksumслід використовувати. Я не можу знайти його чітко, але, логічно, будь-який із варіантів відновлення повинен мати на увазі, --no-whole-fileоскільки --whole-fileмає бути несумісним.
TomG

--append-verifyбуде пропускати однакові або більші розміри файлів з різними датами , які можуть бути "несподіваними". Немає необхідності у --checksum всіх файлах, як rsyncце все одно буде робити ціла контрольна сума файлів, але тільки в тому, що він передає.
Том Хейл

--checksumповідомляє rsyncконтрольну суму файлів перед відправкою, що забезпечує передачу всіх змінених файлів, незалежно від розміру / часу. У вас є джерело несподіваної --append-verifyповедінки, оскільки те, що ви описуєте, не відповідає документації та моєму (обмеженому) досвіду?
TomG

--append-verifyПосилається на --appendяке говорить: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.Навіть якщо файл потрібно перенести через --checksum, його все одно можна пропустити.
Том Хейл

6

Девід Шварц правильний, --partial(а ще краще -P) робить те, що ви хочете. Я перевірив це на 37G-файлі, який був зупинений на ~ 8 г у мережі. rsync швидко просканував перші частини часткового (показав прогрес, як це було завдяки -P), а потім відновив передачу до кінця часткового файлу.


Мережева копія трактується по-різному до локальної копії, що тут є проблемою.
roaima

@roaima У вас є джерело для цього або документ, який більш докладно пояснює, у чому полягають відмінності? Мені не вдалося знайти його на (величезній) сторінці.
Jonas Schäfer

@JonasWielicki сторінка man натякає на неї під --whole-fileописом опції.
roaima

@roaima Дуже дякую! Це також означає, що правильне рішення є --no-W(що насправді працює!)
Йонас Шефер

@JonasWielicki це надзвичайно неефективно, тому його вимкнено за замовчуванням. Ви дійсно не хочете користуватися, --no-Wякщо ви точно не зрозуміли, що це означає для локальних файлів. Дивіться unix.stackexchange.com/a/181018/100397
roaima

2

Ти робив це правильно, --partialробить те, що хочеш. Здається, це починається з початку, тому що він завжди починається на початку списку фрагментів даних файлів, які потрібно скопіювати. Цей --appendпараметр небезпечний і призведе до пошкодження файлу, якщо дані з якихось причин не збігаються.


Локальні копії не порівнюються, вони просто перезаписуються (або --appendпродовжуються після зміщення байтів).
roaima

1

За замовчуванням rsyncувімкнеться --whole-fileпри перенесенні з локального диска на локальний диск. Це перезапустить перервану передачу спочатку, а не перевірку частин, які вже є.

Щоб вимкнути це, скористайтеся:

--no-whole-file

Поєднання цього з будь-яким --inplaceабо --partialдозволить відновити передачу пізніше.

Мій псевдонім для використання rsyncдля копіювання:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

Попередження : будьте обережні з використанням, --append-verifyоскільки це буде пропускати будь-які цільові файли однакового розміру або більше.


Для мережевих передач rsyncпорівнюють вихідні та відповідні файли призначення перед передачею, щоб надсилати лише ті частини, які змінилися (дельта-передача). --no-whole-fileговорить rsyncзробити те ж саме для локального копіювання на місце. Документація не припускає, що це може вплинути на відновлення часткової передачі окремих файлів. rsyncбуде пропускати файли з абсолютно однаковим розміром та часовими позначками за дизайном. Ні, --append-verifyні --no-whole-fileслід змінювати таку поведінку, але --checksumслід працювати з
душевним спокоєм

--append-verifyбуде пропускати однакові або більші розміри файлів з різними датами , які можуть бути "несподіваними". Немає необхідності у --checksum всіх файлах, як rsyncце все одно буде робити ціла контрольна сума файлів, але тільки в тому, що він передає.
Том Хейл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.