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?
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!)
Stačí zadat částečný adresář, jak doporučují manuálové stránky rsync:
--partial-dir=.rsync-partial
K tomu je ve skutečnosti vestavěná funkce pomocí --partial-dir
možnost, která má oproti --partial
a --append-verify
/--append
alternativní.
--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í.
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.
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í.
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
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ší").
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
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 ...