Kesildikten sonra rsync devam edebilir mi?


188

Çok rsyncsayıda dosyayı kopyalardım, ancak işletim sistemim (Ubuntu) beklenmedik bir şekilde yeniden başlatılıyor.

Yeniden rsyncbaşlattıktan sonra tekrar koştum , ancak terminaldeki çıkıştan, rsyncdaha önce kopyalananları kopyaladığımı gördüm . Ancak bunun rsynckaynak ve hedef arasındaki farkları bulabildiğini ve bu nedenle sadece farkları kopyalayabildiğini duydum . Acaba benim durumumda rsyncgeçen sefer ne kaldıysa devam edebilir mi?


Evet, rsync zaten kopyalanmış dosyaları tekrar kopyalamaz. Algılanmasının başarısız olabileceği birkaç kenar durumu vardır. Zaten kopyalanan tüm dosyaları kopyaladı mı? Hangi seçenekleri kullandınız? Kaynak ve hedef dosya sistemleri neydi? Her şeyi kopyaladıktan sonra rsync'i tekrar çalıştırırsanız, tekrar kopyalar mı?
Gilles

@Gilles: Teşekkürler! (1) Sanırım rsync'in aynı dosyaları tekrar terminaldeki çıktısından kopyaladığını gördüm. (2) Seçenekler diğer postalarımdakilerle aynıdır, yani sudo rsync -azvv /home/path/folder1/ /home/path/folder2. (3) Kaynak ve hedef hem NTFS, satın alma kaynağı harici bir HDD, hem de hedef bir dahili HDD. (3) Şimdi çalışıyor ve henüz bitmedi.
Tim

Kısmen aktarılmış dosyaları devam ettirmek için --partial bayrağı da var (büyük dosyalar için kullanışlıdır)
jwbensley 16:12

3
@Tim Kafamın üstünden, en az saat eğriliği ve zaman çözünürlüğündeki farklılıklar var (zamanları 2 saniyelik artışlarla saklayan FAT dosya sistemlerinde sık karşılaşılan bir sorun, --modify-windowseçenek bununla yardımcı oluyor).
Gilles

1
eğer sahip değilseniz / veya /. dosya kaynak yolu argümanının kuyruk ucunda, kaynak diziniyle aynı adı taşıyan bir alt dizinde fazladan bir kopya oluşturulacaktır
Skaperen,

Yanıtlar:


285

Öncelikle, sorunuzun "özgeçmiş" kısmıyla ilgili olarak --partial, alıcı uca, gönderim sonu tamamen aktarılmış gibi kaybolursa kısmen aktarılan dosyaları tutmasını söyler.

Dosyaları aktarırken, geçici olarak hedef klasörlerine (örn. .TheFileYouAreSending.lRWzDC) Ya da --partial-diranahtarı ayarlarsanız özel olarak seçilmiş bir klasöre gizli dosyalar olarak kaydedilirler . Bir aktarım başarısız olduğunda ve --partialayarlanmadığında, bu gizli dosya bu şifreli adın altındaki hedef klasörde kalır, ancak --partialayarlanmışsa, dosya TheFileYouAreSendingolsa bile , asıl hedef dosya adıyla yeniden adlandırılır (bu durumda ) tamamlanmadı. Mesele, daha sonra --appendveya ile yeniden rsync çalıştırarak transferi tamamlayabilmenizdir --append-verify.

Yani, --partialgelmez kendisini başarısız veya iptal transferi devam ettirin. Devam etmek için, bir dahaki sefere yukarıda belirtilen bayraklardan birini kullanmanız gerekecek. Bu nedenle, hedefin iyi görünen ancak gerçekte eksik olan dosyaları içermediğinden emin olmanız gerekiyorsa, kullanmamalısınız --partial. Tersine, hedef dizinde gizli olan başıboş hatalı dosyaları asla geride bırakmayacağınızdan emin olmak istiyorsanız ve aktarımı daha sonra tamamlayabileceğinizi biliyorsanız, size --partialyardımcı olmak için var.

--appendYukarıda belirtilen anahtar ile ilgili olarak , bu gerçek "devam" anahtarıdır ve siz de kullanmasanız da kullanmasanız da kullanabilirsiniz --partial. Aslında, kullanırken --append, hiçbir geçici dosya oluşturulmaz. Dosyalar doğrudan hedeflerine yazılır. Bu bakımdan, başarısız bir transferle --appendaynı sonucu verir --partial, ancak bu gizli geçici dosyaları oluşturmadan.

Bu nedenle, özetlemek gerekirse, büyük dosyaları taşıyorsanız ve iptal edilen veya başarısız olan bir rsync işlemini rsyncdurdurulan noktadan devam ettirmek istiyorsanız, bir sonraki denemeyi kullanmanız --appendveya açmanız gerekir --append-verify.

@Alex'in altını işaret ettiği gibi, 3.0.0 sürümü rsyncşimdi, bu anahtarın varlığından önce olduğu --append-verifygibi davranan yeni bir seçeneğe sahip --append. Muhtemelen her zaman davranışını istiyorsun --append-verify, bu yüzden sürümünüzü kontrol edin rsync --version. Eğer Mac kullanıyorsanız ve kullanılmıyorsa rsyncdan homebrew, (en az El Capitan kadar ve dahil) eski bir sürümünü ve kullanmanız gerekir --appendziyade --append-verify. Davranışı neden sürdürmediler --appendve bunun yerine yeni gelenler --append-no-verifybiraz kafa karıştırıcı. Her iki şekilde de, --appendüzerinde rsyncsürüm 3 ile aynıdır önce --append-verifyyeni sürümlerinde.

--append-verifytehlikeli değil: Her iki uçtaki verileri her zaman okuyacak ve karşılaştıracak, sadece eşit olduklarını varsaymayacak. Bunu sağlama toplamı kullanarak yapar, bu nedenle ağda kolaydır, ancak aslında hedefe ekleyerek aktarımı sürdürmeye başlamadan önce kablonun her iki ucundaki paylaşılan veri miktarının okunmasını gerektirir.

İkincisi, "rsync'in kaynak ve hedef arasındaki farkları bulabildiğini ve bu nedenle sadece farkları kopyalayabildiğini" söylediniz.

Bu doğru ve buna delta transferi deniyor, ancak farklı bir şey. Bunu etkinleştirmek için -c, veya ekleyin --checksum. Bu anahtar kullanıldığında, rsync telin her iki ucunda bulunan dosyaları inceler. Bunu parçalarda yapar, her iki uçtaki sağlama toplamlarını karşılaştırır ve eğer farklılarsa, dosyanın sadece farklı kısımlarını aktarır. Ancak, @Jonathan'ın işaret ettiği gibi, karşılaştırma yalnızca dosyalar her iki uçta da aynı boyutta olduğunda yapılır - farklı boyutlar rsync'in tüm dosyayı yüklemesine ve hedefin aynı adın üzerine yazmasına neden olur.

Bu, başlangıçta her iki uçta da bir miktar hesaplama gerektirir, ancak örneğin sık sık küçük değişiklikler içeren çok büyük dosyaları sabit boyutlu dosyaları yedekliyorsanız, ağ yükünü azaltmada son derece verimli olabilir. Akla gelen örnekler, sanal makinelerde veya iSCSI hedeflerinde kullanılan sanal sabit disk görüntü dosyalarıdır.

--checksumHedef sistem için tamamen yeni olan bir toplu iş dosyası aktarmayı kullanırsanız , rsync'nin aktarma işleminden önce kaynak sistemdeki sağlama toplamlarını hesaplaması yine de dikkate değerdir . Neden bilmiyorum :)

Yani, kısacası:

Sık sık sadece bu işlemi iptal edip daha sonra bunu devam ettirmek için seçenek ve istiyoruz "A noktasından B noktasına malzeme taşımak" rsync kullanıyorsanız yok kullanmak --checksum, ama yok kullanın --append-verify.

Sık sık yedeklemek için rsync kullanıyorsanız --append-verify, sürekli boyutta büyüyen ancak nadiren değiştirilen büyük dosyaları gönderme alışkanlığınız olmadığı sürece, muhtemelen sizin için fazla bir şey yapmazsınız. Bonus ipucu olarak, btrfsya da gibi anlık görüntüyü destekleyen depolamaya yedekleme yapıyorsanız zfs, --inplaceanahtarın eklenmesi, değiştirilen dosyalar yeniden oluşturulamadığından ancak değiştirilen blokların doğrudan eskilerin üzerine yazılmasından dolayı anlık görüntü boyutlarını azaltmanıza yardımcı olacaktır. Bu anahtar, yalnızca küçük değişiklikler olduğunda hedefte dosyaların kopyalarını oluşturmaktan kaçınmak istiyorsanız da yararlıdır.

Kullanırken --append-verify, rsync her zaman aynı boyuttaki tüm dosyalarda olduğu gibi davranır. Değişiklik veya diğer zaman damgalarında farklılık gösterirlerse, bu dosyaları daha fazla incelemeden hedefin kaynakla üzerine yazacaktır. --checksumAynı isim ve ebattaki her dosya çiftinin içeriğini (sağlama toplamı) karşılaştıracaktır.

GÜNCELLEME 2015-09-01 @Alex tarafından yapılan puanları yansıtacak şekilde değiştirildi (teşekkürler!)

GÜNCELLEME 2017-07-14 @Jonathan tarafından yapılan puanları yansıtacak şekilde değiştirildi (teşekkürler!)


4
Bu--partial yeterli diyor .
Cees Timmerman


2
@ CMCDragonkai Aslında, Alexander'ın aşağıdaki yanıtını inceleyin --partial-dir- bunun için mükemmel bir kurşun gibi görünüyor. Tamamen bir şey özledim olabilir;)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus Yavaş bir bağlantıda kendim denedim ve bu yalnızca şunu gördüğüm şey --partial: rsync dosyayı geçici isme kopyalar, bağlantı kesilir, uzak rsync bu dosyayı normal isme taşır ve sonra sona erer. Yeni geçici dosya ile --partialveya onsuz yeniden çalıştırıldığında --append, kısmen aktarılan uzak dosyanın bir kopyasıyla başlatılır, ardından kopya bağlantının öldüğü yerden devam eder. (Ubuntu
14.04

4
Tanımlanan davranışta güven düzeyiniz nedir --checksum? Buna göre, manhangi dosyaların transfer için işaretleneceğine karar vermenin delta-transfer'e (muhtemelen rsyncvarsayılan davranışıdır) göre olduğuna karar vermesi daha fazla .
Jonathan Y.,

56

TL; DR:

Rsync man sayfalarının önerdiği gibi sadece kısmi bir dizin belirtin:

--partial-dir=.rsync-partial

Daha uzun açıklama:

Aslında ve / --partial-dirseçeneğine göre birçok avantajı olan seçeneği kullanarak bunu yapmak için yerleşik bir özellik vardır .--partial--append-verify--append

Rsync man sayfalarından alıntı:

--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.

Varsayılan olarak, rsync, bir transfer başarısız olduğunda silinen rastgele bir geçici dosya adı kullanır. Daha önce de belirtildiği gibi, --partialrsync komutunu eksik dosyayı başarıyla transfer edilmiş gibi tutmasını sağlayabilirsiniz , böylece --append-verify/ --appendseçeneklerini kullanarak daha sonra eklemek mümkün olur . Ancak bunun optimal altı olmasının birkaç nedeni var.

  1. Yedek dosyalarınız tam olmayabilir ve hala değişmesi gereken uzaktaki dosyayı kontrol etmeden, bilmenin yolu yoktur.

  2. Kullanmaya çalışıyorsanız --backupve --backup-dirdaha önce sürüm geçmişinize hiç çıkmamış olan bu dosyanın yeni bir sürümünü eklediniz.

Ancak, kullanırsak --partial-dir, rsync geçici kısmi dosyayı koruyacak ve bir sonraki çalıştırışınızda bu kısmi dosyayı kullanmaya devam edecek ve yukarıdaki sorunlardan muzdarip olamayız.


38

-PSeçeneği komutunuza eklemek isteyebilirsiniz .

Sayfadan 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.

Yani yerine:

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

Yap:

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

Elbette, ilerleme güncellemelerini istemiyorsanız, sadece kullanabilirsiniz --partial:

sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2

@ Flimm oldukça doğru değil. Bir kesinti olursa (ağ veya alıcı taraf) o zaman --partial kullanılırken kısmi dosya tutulur VE rsync yeniden başlatıldığında kullanılır. Manpage sayfasından: "--partial seçeneğinin kullanılması, rsync'e <b> dosyanın geri kalanının daha hızlı aktarılmasını çok daha hızlı yapması gereken </b> kısmi dosyayı korumasını söyler."
15’te

2
@ Flimm ve @gaoithe, cevabım oldukça doğru değildi ve kesinlikle güncel değildi. Ben 3 + sürümünü yansıtacak şekilde güncelledim rsync. O, olsa da, stres önemlidir --partialgelmez değil kendisi başarısız transferi devam ettirin. Detaylar için cevabımı gör :)
DanielSmedegaardBuus

2
@DanielSmedegaardBuus Denedim ve bu -Pbenim durumumda yeterli. Sürümler: müşteri 3.1.0'a ve sunucunun 3.1.1'i vardır. Tek bir büyük dosyanın transferini ctrl-c ile durdurdum. Sanırım bir şeyleri özlüyorum.
guettli,

Neden vv? yani v2 kez kullanılır?
mrgloom

Rsync, dosyanın bir bölümünü nerede kaydeder -azvvP?
mrgloom

1

Bence zorla çağırıyorsunuz rsyncve bu nedenle tekrar çağırdığınızda tüm veriler indiriliyor. kullanmak --progresskopyalanıp değil sadece bu dosyaları kopyalamak için bu seçeneği --deletezaten kopyalanan varsa dosyaları silmek için seçenek ve şimdi kaynak klasöründe mevcut değil ...

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

Diğer sisteme giriş yapmak ve dosyaları kopyalamak için ssh kullanıyorsanız,

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

Bu kavramı anlamada bir yanlışlık olursa bana bildirin ...


1
Lütfen cevabınızı düzenleyip özel ssh aramanızın ne yaptığını ve neden yapılmasını tavsiye edebileceğinizi açıklayabilir misiniz?
Fabien

2
@Fabien rsync'e iki ssh seçeneği ayarlamasını söyler (rsync bağlanmak için ssh kullanır). İkincisi, ssh'ye, bağlandığı ana bilgisayar önceden bilinmediğinde ("bilinen ana bilgisayar" dosyasında mevcutsa) onay sormamasını söyler. Birincisi, ssh'a bilinen varsayılan ana bilgisayar dosyasını kullanmamasını söyler (ki bu ~ / .ssh / known_hosts olacaktır). Bunun yerine / dev / null komutunu kullanır, tabii ki her zaman boş olan ve ssh oradaki ana bilgisayarı bulamayacağından normal olarak onay ister, bu nedenle seçenek iki olur. Bağlantı
kurulduktan

1
... ama muhtemelen rsync operasyonu üzerinde ne gibi bir etkisi olduğunu merak ediyordunuz. Cevap hiçbiri değil. Yalnızca bağladığınız ana makinenin SSH bilinen ana makinenize eklenmesini istemez. Belki de sık sık çok sayıda yeni sunucuya, geçici sisteme ya da başka şeylere bağlanan bir sysadmin. Bilmiyorum :)
DanielSmedegaardBuus

4
"yalnızca kopyalanmayan dosyaları kopyalamak için --progress seçeneğini kullanın" Ne?
moi

1
Burada birkaç hata var; biri çok ciddi: kaynakta bulunmayan hedefteki--delete dosyaları siler . Daha az ciddi olan şey, işlerin nasıl kopyalanacağını değiştirmiyor; sadece size kopyalandıkça her dosya için bir ilerleme raporu verir. (Ben ciddi hatayı düzelttim; onunla değiştirdim .)--progress--remove-source-files
Paul d'Aoust 17:16

1

Bu basit betiği kullanıyorum. Bazı bayrakları ayarlamaktan çekinmeyin ve / veya karakterize edin.

#!/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

Buna geç kaldım, ama aynı sorum vardı ve farklı bir cevap buldum.

--partialBayrak ( "kısmen aktarılmış dosyaları tutmak" de rsync -h) olduğu gibi, büyük dosyalar için yararlıdır --append( "kısa dosya üzerine veri eklemesi"), ama soru hakkında olduğunu sayıda dosyalarının.

Önceden kopyalanmış dosyaları önlemek için kullanın -u(veya --update: "alıcıda daha yeni olan dosyaları atla").

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.