Rsync --inplace tüm dosyaya mı yoksa sadece güncellenmesi gereken parçalara mı yazıyor? (btrfs + rsync yedeklemeleri için)


21

Geçmişle verimli bir yedekleme çözümü yapmak için btrfs anlık görüntülerini rsync ile birleştirmek için birkaç kılavuz okuyordum. Ancak bunların hepsi, rsync --inplaceyalnızca gerçekte değişen dosyaların bölümlerini değiştirip değiştirmemesine veya tüm dosyanın üzerine yazılmasına bağlıdır. Tüm dosyayı yazarsa, btrfs her zaman dosyanın yeni bir kopyasını oluşturacak ve bu da fikri daha az verimli hale getirecektir.


Hatta tüm dosyaya yazmayı engelleyip engellemeyeceğini nasıl bilebilirdi ? Neyin değiştiğini anlamak için önce tüm dosyayı okuması gerekmez mi?
Mehrdad

2
@Mehrdad evet, öyle, ama bütünü okumak sorun değil. Eğer rsynctüm dosyayı okur ve ardından istiyor ve yalnızca gerekli parçaları günceller, btrfs sadece bu güncellenmiş blokları kopyalar. Ancak tüm dosyayı rsyncokur ve yazarsa, bu bir sorun olacaktır.
Petr Pudlák

1
@Mehrdad rsyncsadece dosyanın tamamını yazmaya önlemek olabileceğini bilmiyor, bunu yapmak için yönetir olmadan net üzerinden tamamen kopyalayarak. Zeki küçük bir program.
Gunther Piez

Yanıtlar:


31

Rsync'i iki yerel yoldan geçirirseniz, varsayılan olarak delta aktarımı değil "--whole-file" kullanılır. Yani, aradığınız şey "--no-whole-file". '-C' isteğinde bulunursanız delta aktarımı da alırsınız.

Bunu nasıl doğrulayabileceğiniz aşağıda açıklanmıştır:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

Ardından bir dosyaya dokunun ve yeniden senkronize edin

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

"Ls -li" ile inode yeniden kullanıldığını doğrulayabilir, ancak 64K baytın tamamını gönderdiğini fark edebilirsiniz. --No-whole-file ile tekrar deneyin

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

Şimdi sadece 494 bayt gönderdiniz. Herhangi bir dosyanın yazılıp yazılmadığını daha da doğrulamak için strace kullanabilirsiniz, ancak bu en azından delta-transfer'in kullanıldığını gösterir.

Yerel dosya sistemleri --whole-fileiçin varsayıldığını unutmayın (rsync için man sayfasına bakın). Öte yandan, bir ağ boyunca --no-whole-filevarsayılır, böylece --inplacekendi başına davranır --inplace --no-whole-file.


Neden --inplaceima edilmiyor --no-whole-file?
Geremia

--no-whole-fileZaten varsayılan değil mi?
Geremia

2
@ Her iki yol lokal ise serum değil. Ve örneğim, bunun 2013'te kullandığım rsync sürümü için --inplacegeçerli olmadığını gösteriyor --no-whole-file, ancak bu denemeyi kendi rsync sürümünüzle tekrarlayabilirsiniz.
dataless

Eh, inplacedeğil yaklaşık, ondan, sadece hemen varolan dosyanın üzerine hakkında, aynı / farklı bloklar için var tarıyor geçici bir kopyası inşa ve ancak o zaman hedef dosyayı silip tempopary kopya yeniden adlandırıldı otherweise (0'a ofset Süreç kesintiye uğrarsa, eski dosyayı olabildiğince uzun tutmak muhtemelen “daha ​​güvenli” kabul edilir.Tabii ki bu performans, en yüksek depolama tüketimi (büyük dosyaları düşünün), muhtemelen parçalanma ...) için daha kötü ...
Frank Nocke

1
Bunun başka bir yol olduğunu, --no-whole-fileher zaman ima ettiğini --inplace, aksi takdirde performans kazancının çoğunun gideceğini varsayacağım . Yine de bu belgelenmiş bulunamadı ...
Frank Nocke

15

İşte sanırım doğru cevap, el kitabının doğru kısmını göstererek:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.

4

--inplaceyalnızca değişen bölgelerin üzerine yazar. Btrfs'ye yazarken daima kullanın.


Ve dosyaların diğer bölümlerinin üzerine yazmadığını gösteren bir kanıtınız var mı?
Petr Pudlák

Aynı şey ZFS için de geçerli mi?
ewwhite

@ewwhite: ZFS, BTRFS gibi COW (yazma üzerine kopyalama) olduğu için evet.
Geremia

@ PetrPudlák -vvveşleşen blokları atladığını gösteriyor
Tom Hale

3

rsync'in delta aktarım algoritması, tüm dosyanın aktarılıp aktarılmadığı veya sadece farklı olan kısımlarla ilgilidir. Bant genişliğinden tasarruf etmek için iki makine arasında bir dosyayı yeniden senkronize ederken varsayılan davranıştır. Bu , tüm dosyayı iletmeye zorlamak için --whole-file(veya -W) ile geçersiz kılınabilir rsync.

--inplacersyncaktarım sırasında geçici bir dosya oluşturup oluşturmayacağı ile ilgilenir . Varsayılan davranış, geçici bir dosya oluşturmaktır. Bu, aktarım kesintiye uğrarsa hedef makinedeki mevcut dosyanın bozulmadan / dokunulmadan kalması açısından bir güvenlik önlemi verir. --inplacebu davranışı geçersiz kılar ve rsyncmevcut dosyayı doğrudan güncellemeyi söyler . Bununla, aktarım yarıda kesilirse hedef makinede tutarsız bir dosyaya sahip olma riskini yaşarsınız.


2

Man sayfasından:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

Bu beni bütünüyle dosyanın üzerine yazdığına inanmamı sağlıyor - rsync'in başka bir şekilde çalışmasının neredeyse imkansız olacağını düşünüyorum.


2
Hangi parçaların güncellenmesi gerektiğini belirledikten sonra , dosyanın tamamını yazmak yerine bu parçaları arayabilir ve güncelleyebilir.
Petr Pudlák

0

Yerinde rsync üzerine teorik çalışma bu makalede açıklanmıştır .

Bildiri referansı: D. Rasch ve R. Burns. Yerinde Rsync: Mobil ve Kablosuz Aygıtlar için Dosya Senkronizasyonu. USENIX Yıllık Teknik Konferansı, FREENIX pisti, 91-100, USENIX, 2003.

Bağlantıdan:

... Mevcut rsync uygulamasını yerinde yeniden yapılandırmayı destekleyecek şekilde değiştirdik.

Özet: [...] rsync'i alan kısıtlı cihazlarda çalışacak şekilde değiştirdik. Hedef ana bilgisayardaki dosyalar, dosyanın geçerli sürümündeki depolama alanında güncellenir. Alan kısıtlı cihazlar, geleneksel rsync'i kullanamaz çünkü dosyanın hem eski hem de yeni sürümü için bellek veya depolama alanı gerektirir. Örnekler arasında, küçük bellekleri olan cep telefonları ve el bilgisayarlarındaki dosyaları senkronize etme sayılabilir. Yerinde rsync algoritması, bir dosyanın bir grafikteki sıkıştırılmış temsilini kodlar ve bu da yerinde özelliğe ulaşmak için topolojik olarak sıralanır. [...]

Bu rsync - inplace'in ne yaptığının teknik detayları gibi görünüyor. Makalenin başlangıcına göre:

Rsync'i, yerinde yeniden yapılandırma ile dosya eşitleme görevleri gerçekleştirecek şekilde değiştirdik. [...] Geçici alan kullanmak yerine, hedef dosyada yapılan değişiklikler geçerli sürümün işgal ettiği alanda gerçekleşir. Bu araç, alanın sınırlı olduğu cihazları senkronize etmek için kullanılabilir.

İle netlik kazanabilir Dataless cevabı @ , bu ima --inplaceaynı depolama alanını kullanarak, ama yine de o uzaya tüm dosyayı kopyalamak olabilir. Özellikle, yerel dosya sistemlerinden / dosyalarına kopyalar yapıldığında, rsync --whole-fileseçeneği kabul eder . Ancak öte yandan, ağa bağlı sistemler arasında olduğunda, --no-whole-fileseçeneği kabul eder .


1
Ee, cevap ne?
Xen2050

Özür dilerim. Yeterince dikkat etmiyordum. @ Dataless'in cevabı ile, bu durumun netleşmesi gerekir.
Diagon
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.