it-swarm-eu.dev

Může rsync pokračovat po přerušení?

Pro kopírování velkého počtu souborů jsem použil rsync, ale můj operační systém (Ubuntu) se nečekaně restartoval.

Po restartu jsem znovu spustil rsync, ale z výstupu na terminálu jsem zjistil, že rsync stále kopíruje ty, které již byly zkopírovány dříve. Slyšel jsem však, že rsync dokáže najít rozdíly mezi zdrojem a cílem, a proto je pouze zkopírovat. Takže se v mém případě ptám, jestli rsync může obnovit to, co zbylo naposledy?

203
Tim

Za prvé, pokud jde o část vaší otázky „pokračovat“, --partial Pouze řekne přijímajícímu konci, aby ponechal částečně přenesené soubory, pokud vysílací konec zmizí, jako by byly úplně přeneseny.

Při přenosu souborů jsou dočasně uloženy jako skryté soubory ve svých cílových složkách (např. .TheFileYouAreSending.lRWzDC) Nebo ve speciálně vybrané složce, pokud nastavíte přepínač --partial-dir. Pokud přenos selže a --partial Není nastaven, zůstane tento skrytý soubor v cílové složce pod tímto kryptickým názvem, ale pokud je nastaven --partial, Bude soubor přejmenován na skutečný cílový soubor. jméno (v tomto případě TheFileYouAreSending), přestože soubor není úplný. Jde o to, že přenos můžete později dokončit opětovným spuštěním rsync s --append Nebo --append-verify.

Takže --partial sám neobnoví neúspěšný nebo zrušený přenos. Chcete-li jej obnovit, budete muset při příštím spuštění použít jednu z výše uvedených příznaků. Pokud tedy potřebujete zajistit, aby cíl nikdy neobsahoval soubory, které se zdají být v pořádku, ale jsou skutečně neúplné, neměli byste použít --partial. A naopak, pokud se chcete ujistit, že nikdy nezanecháváte zbloudilé neúspěšné soubory, které jsou skryty v cílovém adresáři, a víte, že budete moci dokončit přenos později, je vám k dispozici --partial.

Pokud jde o výše uvedený přepínač --append, Jedná se o skutečný přepínač „pokračovat“ a můžete jej použít bez ohledu na to, zda používáte --partial. Ve skutečnosti, když používáte --append, Nejsou nikdy vytvořeny žádné dočasné soubory. Soubory se zapisují přímo do jejich cílů. V tomto ohledu dává --append Stejný výsledek jako --partial Při neúspěšném přenosu, ale bez vytvoření skrytých dočasných souborů.

Abychom to shrnuli, pokud přesouváte velké soubory a chcete, aby možnost obnovit zrušenou nebo neúspěšnou operaci rsync od přesného bodu, který se zastavil rsync, musíte použít --append nebo --append-verify zapněte další pokus.

Jak ukazuje @Alex níže, od verze 3.0.0 rsync má nyní novou možnost --append-verify, Která se chová jako --append, Která existovala před tím, než tento přepínač existoval. Pravděpodobně budete vždy chtít chovat --append-verify, Proto zkontrolujte svou verzi pomocí rsync --version. Pokud používáte Mac a nepoužíváte rsync od homebrew, budete mít (alespoň do El Capitan včetně) starší verzi a musíte použít --append místo --append-verify. Proč neudržovali chování na --append A místo toho pojmenovaný nováček --append-no-verify Je trochu záhadný. V obou případech je --append Na rsync před verzí 3 stejný jako --append-verify V novějších verzích.

--append-verify Není nebezpečný: Vždy bude číst a porovnávat data na obou koncích a nejen předpokládat, že jsou si rovni. To se provádí pomocí kontrolních součtů, takže je to snadné v síti, ale vyžaduje čtení společného množství dat na obou koncích drátu, než může skutečně pokračovat v přenosu připojením k cíli.

Za druhé, řekl jste, že „jste slyšeli, že rsync je schopen najít rozdíly mezi zdrojem a cílem, a proto je pouze zkopírovat.“

To je správné a nazývá se to delta transfer, ale je to jiná věc. Chcete-li to povolit, přidáte přepínač -c Nebo --checksum. Jakmile je tento přepínač použit, rsync prozkoumá soubory, které existují na obou koncích drátu. To se provádí v blocích, porovnává kontrolní součty na obou koncích a pokud se liší, přenáší pouze různé části souboru. Jak ale ukazuje @ Jonathan níže, srovnání se provádí pouze v případě, že soubory mají stejnou velikost na obou koncích - různé velikosti způsobí, že rsync nahraje celý soubor a přepíše cíl se stejným názvem.

To vyžaduje zpočátku trochu výpočet na obou koncích, ale může to být velmi efektivní při snižování zatížení sítě, pokud například často zálohujete velmi velké soubory s pevnou velikostí, které často obsahují drobné změny. Příklady, které přicházejí na mysl, jsou soubory obrazů virtuálních pevných disků používané ve virtuálních strojích nebo v cílech iSCSI.

Je pozoruhodné, že pokud použijete --checksum Pro přenos dávky souborů, které jsou do cílového systému zcela nové, rsync ještě před převodem vypočítá jejich kontrolní součty ve zdrojovém systému. Proč nevím :)

Stručně řečeno:

Pokud často používáte rsync k „přesunutí věcí z bodu A do bodu B“ a chcete možnost tuto operaci zrušit a později ji obnovit, ne použijte --checksum, Ale - do použijte --append-verify.

Používáte-li rsync k zálohování věcí často, použití --append-verify Pro vás pravděpodobně nebude moc, pokud nemáte zvyk posílat velké soubory, které se neustále zvětšují, ale po napsání se zřídka upraví. . Jako bonusový tip, pokud zálohujete úložiště, které podporuje snímkování, jako je btrfs nebo zfs, přidání přepínače --inplace Vám pomůže zmenšit velikost snímku od změny souborů nejsou znovu vytvořeny, ale změněné bloky jsou psány přímo přes ty staré. Tento přepínač je také užitečný, pokud chcete zabránit tomu, aby program rsync vytvářel kopie souborů na cílovém místě, když došlo pouze k malým změnám.

Při použití --append-verify Se rsync bude chovat stejně jako vždy u všech souborů, které mají stejnou velikost. Pokud se liší v úpravách nebo jiných časových razítcích, přepíše cíl zdrojem, aniž by tyto soubory dále zkoumal. --checksum Porovná obsah (kontrolní součty) každé dvojice souborů se stejným názvem a velikostí.

AKTUALIZOVÁNO 2015-09-01 Změněno tak, aby odráželo body vytvořené @Alexem (díky!)

AKTUALIZOVÁN 2017-07-14 Změněno tak, aby odráželo body vytvořené @ Jonathan (díky!)

307

TL; DR:

Stačí zadat částečný adresář, jak doporučují manuálové stránky rsync:

--partial-dir=.rsync-partial

Delší vysvětlení:

K tomu je ve skutečnosti vestavěná funkce pomocí --partial-dir možnost, která má oproti --partial a --append-verify/--append alternativní.

Výňatek z manuálových stránek rsync:

--partial-dir=DIR
      A  better way to keep partial files than the --partial option is
      to specify a DIR that will be used  to  hold  the  partial  data
      (instead  of  writing  it  out to the destination file).  On the
      next transfer, rsync will use a file found in this dir  as  data
      to  speed  up  the resumption of the transfer and then delete it
      after it has served its purpose.

      Note that if --whole-file is specified (or  implied),  any  par-
      tial-dir  file  that  is  found for a file that is being updated
      will simply be removed (since rsync  is  sending  files  without
      using rsync's delta-transfer algorithm).

      Rsync will create the DIR if it is missing (just the last dir --
      not the whole path).  This makes it easy to use a relative  path
      (such  as  "--partial-dir=.rsync-partial")  to have rsync create
      the partial-directory in the destination file's  directory  when
      needed,  and  then  remove  it  again  when  the partial file is
      deleted.

      If the partial-dir value is not an absolute path, rsync will add
      an  exclude rule at the end of all your existing excludes.  This
      will prevent the sending of any partial-dir files that may exist
      on the sending side, and will also prevent the untimely deletion
      of partial-dir items on the receiving  side.   An  example:  the
      above  --partial-dir  option would add the equivalent of "-f '-p
      .rsync-partial/'" at the end of any other filter rules.

Ve výchozím nastavení používá rsync náhodný dočasný název souboru, který se při selhání přenosu odstraní. Jak bylo uvedeno, pomocí --partial můžete nechat rsync ponechat neúplný soubor jako by byl úspěšně přenesen, takže je možné k němu později připojit pomocí --append-verify/--append možnosti. Existuje však několik důvodů, proč to není optimální.

  1. Vaše záložní soubory nemusí být úplné a bez kontroly vzdáleného souboru, který musí být stále nezměněn, neexistuje žádný způsob, jak to zjistit.

  2. Pokud se pokoušíte použít --backup a --backup-dir, právě jste přidali novou verzi tohoto souboru, která nikdy nikdy neopustila vaši historii verzí.

Pokud však použijeme --partial-dir, rsync zachová dočasný částečný soubor a při příštím spuštění obnoví stahování pomocí tohoto částečného souboru a výše uvedené problémy nám netrpí.

67

Možná budete chtít přidat -P možnost k vašemu příkazu.

Ze stránky man:

--partial By default, rsync will delete any partially transferred file if the transfer
         is interrupted. In some circumstances it is more desirable to keep partially
         transferred files. Using the --partial option tells rsync to keep the partial
         file which should make a subsequent transfer of the rest of the file much faster.

  -P     The -P option is equivalent to --partial --progress.   Its  pur-
         pose  is to make it much easier to specify these two options for
         a long transfer that may be interrupted.

Takže místo:

Sudo rsync -azvv /home/path/folder1/ /home/path/folder2

Dělat:

Sudo rsync -azvvP /home/path/folder1/ /home/path/folder2

Samozřejmě, pokud nechcete aktualizace postupu, můžete použít --partial, tj.:

Sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2
39
N2O

Přišel jsem pozdě, ale měl jsem stejnou otázku a našel jsem jinou odpověď.

Příznak --partial ("Keep částečně přenesené soubory" v rsync -h) Je užitečný pro velké soubory, jako je --append ("Připojit data do kratších souborů"), ale otázka je o velkém počt souborů.

Chcete-li se vyhnout souborům, které již byly zkopírovány, použijte -u (Nebo --update: "Přeskočte soubory, které jsou v přijímači novější").

2
lazysoundsystem

Používám tento jednoduchý skript. Neváhejte a upravte určité příznaky a/nebo je parterizujte.

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial [source] [dest]:
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done
1

Myslím, že násilně voláte rsync, a proto si všechna data stahujete, když si na ně vzpomínáte znovu. použijte --progress možnost zkopírovat pouze ty soubory, které nejsou zkopírovány, a --delete možnost odstranit všechny soubory, pokud již byly zkopírovány a nyní ve zdrojové složce neexistuje ...

rsync -avz --progress --delete -e  /home/path/folder1/ /home/path/folder2

Pokud používáte ssh k přihlášení do jiného systému a ke kopírování souborů,

rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2

dejte mi vědět, pokud se v tomto chápání tohoto pojmu vyskytne chyba ...

1
Yadunandana