Tek bir dosyanın transferini rsync ile sürdür


52

Ubuntu'da büyük bir dosyayı sabit diskimden çıkarılabilir bir sürücüye kopyalamak istiyorum rsync. Başka bir nedenden ötürü, işlem tek bir işlemle tamamlanamaz. Bu yüzden rsync, dosyayı son bıraktığı yerden kopyalamaya devam etmek için nasıl kullanılacağını bulmaya çalışıyorum .

Ben seçeneği kullanmak için çalıştık --partialya --inplace, ama birlikte --progressbuldum rsyncile --partialveya --inplacefiilen başlar yerine son kez kalanları gelen başlangıcı. El ile rsyncerken durmak ve alınan dosyanın boyutunu kontrol etmek de bulduğumu doğruladı.

Ancak --append, rsync ile geçen sefer kalanlardan başlıyor.

Üzerinde gördüğümüz gibi karıştı adam sayfasında --partial , --inplaceve --appendson kez kalanları gelen kopyalama sürdürme alakalı görünen. Birisi farkı açıklayabilir mi? Neden yok --partialya --inplacekopyalama sürdürme çalışacak mı? Kopyalamaya devam rsyncetmek için --appendseçenekle çalışmak zorunda olduğu doğru mu?

Ayrıca, kısmi bir dosya rsync tarafından değil mvveya cprsync tarafından bırakılmışsa rsync --append, dosya kopyalamaya devam eder mi?

Yanıtlar:


39

Kesilen bir kopyaya devam etmek için kullanmanız gerekir rsync --append. Man sayfasının açıklamasından --append:

Bu, rsync'in dosyanın ucuna veri ekleyerek bir dosyayı güncellemesine neden olur; bu , alıcı tarafta zaten var olan verilerin gönderen taraftaki dosyanın başlangıcı ile aynı olduğunu varsayar. [...] --inplace, [...] anlamına gelir

Opsiyon --inplacemarkaları rsync(over) doğrudan hedef dosya içeriğini yazma; olmadan --inplace , rsyncolur:

  1. geçici bir adla yeni bir dosya oluşturmak,
  2. güncellenmiş içeriği içine kopyalamak,
  3. Hedef dosya ile değiştir ve son olarak
  4. Hedef dosyanın eski kopyasını sil.

Normal çalışma modu esas olarak, hedef dosya açık olabilecek uygulamalarla çatışmaları ve rsynckılavuzda uygun şekilde sıralanan diğer bazı aksaklıkları önler .

Bir kopyalama / güncelleme işleminin 1.-3. adımlarda başarısız olduğunu unutmayın. yukarıdaki rsyncgeçici hedef dosyayı silecektir; --partial seçeneği bu davranışı devre dışı bırakır ve rsynchedef dosya sistemi üzerinde kısmen transfer geçici dosyalar bırakacaktır. Bu nedenle, tek bir dosya kopyalama işlemine devam etmek, ilk veya rsyncile çağrılmadıkça fazla bir şey kazanmaz ( ek olarak , tüm geçici dosyaları belirli bir dizinde oluşturma talimatı ile aynı ).--partial--partial-dir--partialrsync


Teşekkürler! Kısmi bir dosya mv veya cp rsync tarafından bırakılmamışsa, rsync --append dosya kopyalama işlemini doğru bir şekilde sürdürür mü?
Tim

1
Kısacası @Tim, --appendyapar rsynciki karşılık gelen dosyalar daha sonra bir daha kısa bir artık başlangıç kısmına aynıdır, farklı uzunlukta ise, inanıyoruz. Bu nedenle, evet, büyük bir dosyayı kopyalamaya başlarsanız cpve kopyalama işlemini keserseniz, rsync --appenddosyanın yalnızca kalan kısmını kopyalar. ( Not: eğer cpbir sistemin çökmesine tarafından kesilir, dosya içeriği ve meta çalışan, bu durumda dosyası bozuk, yani senkronize olmadığını küçük bir şans var. rsyncBir kez daha olmadan --append sorunu çözmek gerekir.)
Riccardo Murri

2
Öyleyse bunu doğru anlarsam, rsync'e kısmi bir dosyayı doğrulamasını ve kısmen aktarılmış dosyaya aktarmaya devam etmesini söylemenin bir yolu yok mu?
Winny,

1
@Winny, çok gecikmeli olarak: yerel bir kopya için bunu yapmanın mantıklı bir yolu yoktur. Bir ağ için bu belirttiğiniz varsayılan moddur kopyalama --partialolmadan --append.
roaima

1
@Winny --appendve --append-verifytehlikeli bir arıza durumunda: alıcının dosyası aynı boyutta veya daha büyük olduğunda ancak farklı veriler olduğunda. Bunun yerine bir çözüm--no-whole-file önerim .
Tom Hale

21

Bunun, --appendima --inplaceettiği şeyin farkında olun --partial.

  • Sadece kullanarak --partialsize neden gerektiğini rsynckısmi transferleri bırakın ve sonraki girişimlerde bunları devam ettirmek.

  • Kullanarak --appendsizi neden gerektiğini rsynchem kısmi dosyaları bırakın ve onları bir dahaki sefere devam etmek. Aktarımdan sonra rsync, yalnızca iletilen verilerin sağlama toplamını doğrulamanız gerekir.

  • --append-verify önceki bir transferde transfer edilen herhangi bir kısmı dahil, tüm dosyayı sağlama toplamı doğrulamasına dahil eder.

  • Ya --appendda --append-verifybaşarısız bir sağlama toplamı doğrulamasıyla dosyanın tamamen yeniden iletilmesine neden olması gerekir (kullanarak --inplace)

Bir operasyonu sürdürmek mvveya ile cpoperasyona devam edebilmelisiniz , rsyncancak iç --append-verifyhuzuru için bu seçeneği kullanmak isteyebilirsiniz .

Yalnızca alıcıdaki boyutunu, göndericideki boyutundan daha kısa olan (zaman damgasından bağımsız olarak) veya alıcıda bulunmayan dosyaları kopyalamak için--append neden kullanmanın unutmayın . Bu seçenekle ilgili belgelere göre:rsync

Bir dosyanın aktarılması gerekiyorsa ve alıcıdaki boyutu göndericideki boyutla aynı veya daha uzunsa, dosya atlanır.

Man sayfasında daha fazla bilgi


--appendve --append-verifytehlikeli bir arıza durumunda: alıcının dosyası aynı boyutta veya daha büyük olduğunda ancak farklı veriler olduğunda. Bunun yerine bir çözüm--no-whole-file önerim .
Tom Hale

@TomHale belgeleri, bir dosyanın atlanması için, her iki uçta da aynı boyutta ve değişiklik zamanına sahip olması gerektiğini önerir. Bu makul bir endişe ise, o --checksumzaman kullanılmalıdır. Ben açıkça belirtilen bulamıyor ama mantıksal olarak sürdürüldü-muktedir seçeneklerinden herhangi ima etmelidir --no-whole-file, çünkü --whole-fileuyumsuz olması gerekir.
TomG

--append-verify"beklenmedik" olabilen farklı tarihlerdeki aynı veya daha büyük boyutlu dosyaları atlayacaktır . Zaten tüm dosya sağlama toplamı gibi , --checksum tüm dosyalara ihtiyaç yoktur rsync, ancak yalnızca aktardıklarında.
Tom Hale

--checksumgöndermeden öncersync dosyaları kontrol etmeyi söyler ; Beklediğiniz davranış için bir kaynağınız var; çünkü açıkladığınız şey belgelerle veya benim (sınırlı) tecrübemle uyuşmuyor mu? --append-verify
TomG

--append-verifyBu ifadeye atıfta bulunur --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.Bir dosya nedeniyle aktarılması gerekiyorsa bile --checksumatlanabilir.
Tom Hale

6

David Schwartz haklı, --partial(ya da daha iyisi -P) istediğini yapar. Bunu bir ağ üzerinden ~ 8g durduran bir 37G dosyasında doğruladım. rsync, kısmi bölümün ilk kısımlarını hızlı bir şekilde taradı (sayesinde olduğu gibi ilerleme gösterdi -P) ve daha sonra kısmi dosyanın sonuna transfer edildi.


Bir ağ kopyası, burada sorun olan yerel bir kopyadan farklı şekilde ele alınır.
roaima

@roaima Bunun için bir kaynağınız veya farklılıkların neler olduğunu daha ayrıntılı olarak anlatan bir dokümanınız var mı? Onu (devasa) sayfalarda bulamıyorum.
Jonas Schäfer

@JonasWielicki man sayfası --whole-fileseçenek açıklaması altında buna itina eder .
roaima

@roaima Çok teşekkür ederim! Bu aynı zamanda uygun geçici çözümün --no-W(ki aslında işe yaramaktadır!)
Jonas Schäfer

@JonasWielicki aşırı derecede verimsizdir, bu yüzden varsayılan olarak devre dışıdır. --no-WYerel dosyalar için tam olarak ne anlama geldiğini anlamadığınız sürece kullanmak istemezsiniz . Bkz unix.stackexchange.com/a/181018/100397
roaima

2

Doğru yapıyordun --partial, ne istiyorsan onu yap . En baştan başlıyor gibi görünüyor, çünkü her zaman kopyalaması gereken dosya veri listesinin başında başlar. --appendSeçenek tehlikelidir ve veri nedense aynı değilse bozuk dosyanın sonuçlanacaktır.


Yerel kopyalar karşılaştırılmaz, sadece üzerine yazılır (veya --appendbayt ofsetinden devam ettirilir).
roaima

1

Varsayılan olarak, yerel diskten yerel diske aktarma rsyncözelliğini etkinleştirir --whole-file. Bu, zaten var olan parçaları kontrol etmek yerine, baştan itibaren kesintiye uğramış bir aktarımı yeniden başlatacak.

Bunu devre dışı bırakmak için şunu kullanın:

--no-whole-file

Bunu ya --inplaceda ile birleştirmek ya da --partialtransferin daha sonra devam etmesine izin verecektir.

rsyncKopyalamayı kullanmak için takma adım :

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

Uyarı : kullanmanın dikkatli olun --append-verifyo gibi atlamak aynı boyutta veya daha büyük olan herhangi bir hedef dosyaları.


Ağ aktarımları rsynciçin, yalnızca değişen parçaları (delta aktarma) göndermek amacıyla aktarmadan önce kaynak ve karşılık gelen hedef dosyaları karşılaştırır. Yerel-yerel kopyalama için aynı şeyi yapması --no-whole-filegerektiğini söyler rsync. Belgeler, tek dosyaların kısmi transferlerini sürdürme üzerinde herhangi bir etkisi olacağını göstermez. rsynctasarıma göre tam olarak aynı boyutta ve zaman damgası olan dosyaları atlar. Bu davranışı --append-verifyne --no-whole-filedeğiştirmeli ne de değiştirmeli, ancak --checksumIO
TomG

--append-verify"beklenmedik" olabilen farklı tarihlerdeki aynı veya daha büyük boyutlu dosyaları atlayacaktır . Zaten tüm dosya sağlama toplamı gibi , --checksum tüm dosyalara ihtiyaç yoktur rsync, ancak yalnızca aktardıklarında.
Tom Hale
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.