Tekilleştirme olarak btrfs CoW kullanan herhangi bir tekilleştirme komut dosyaları var mı?


9

Linux'ta veri tekilleştirme araçlarını aramak çok şey var, örneğin bu wiki sayfasına bakın .

Neredeyse tüm komut dosyaları, yalnızca yinelenen dosya adlarını algılar, yazdırır veya yinelenen dosyaları tek bir kopyaya sabit bağlayarak kaldırır.

Btrfs'nin yükselişiyle birlikte başka bir seçenek daha olurdu: bir dosyanın CoW (üzerine yazma kopyası) kopyası (gibi cp reflink=always) oluşturma. Bunu yapan bir araç bulamadım, kimse bunu yapan aracın farkında mı?


Güncelleme: rmlint geliştirme dalı ve ben de usta inanıyorum, ekledi: 1) Artımlı dosya karma. Son çalıştırmadan bu yana değişmedikçe bir dosyayı yeniden karmayacaktır [çok büyük]. 2) Artımlı veri tekilleştirme . Yalnızca henüz değiştirilmemiş veya değiştirilmiş dosyaları tekilleştirir. [Bu daha da huger.] Diğer hızlı karşılaştırma yöntemleri başarısız olduktan sonra sadece karma dosyaları ile birleştirildiğinde, rakipsiz hale getirir. Bedup terk edilmiş ve görünüşte derlenmeyecek. Ayrıntılı bir karşılaştırma yaptım: docs.google.com/spreadsheets/d/…
Jim

Yanıtlar:


17

Bu amaçla bedup yazdım . Artımlı btree taramasını CoW-tekilleştirme ile birleştirir. En iyi çalışabileceğiniz Linux 3.6 ile:

sudo bedup dedup

Merhaba @ Gabriel, aşağıdaki cevabımın bir yorumunda, "... bedup ... şeyleri boyut bölümlerine koydu ve gerekiyorsa sağlama toplamı oluşturmak için yalnızca tüm dosyayı oku." Bu doğru mu? Öyleyse, aşağıda cevabımı güncellemek istiyorum. (Ve kendimi bedup kullan!) Ne yazık ki bunu hiçbir yerde doğrulayamadım. Google'ı denedim, github sayfanızda arama yapın ve kodda bir arama yaptım. Teşekkürler.
Jim

4

Bedup denedim. İyi (ve birçokları için en iyi seçim haline getirebilecek bazı kullanışlı farklı özelliklere sahip olsa da), tüm hedef dosyaların tamamını sağlama toplamı için taramış gibi görünüyor.

Bu acı verici yavaştır.

Öte yandan rdfind ve rmlint gibi diğer programlar farklı tarama yapar.

rdfind, btrfs reflink kullanımı için bir "deneysel" özelliğe sahiptir. (Sert bağlantılar, semboller vb. İçin "katı" seçenekler)

rmlint, btrfs klonu, reflink, normal hardlinkler, semboller, silme ve kendi özel komutlarınız için "katı" seçeneklere sahiptir.

Ancak daha da önemlisi, rdfind ve rmlint önemli ölçüde daha hızlıdır. Olduğu gibi, büyüklük emirleri. Tüm hedef dosyaları sağlama toplamları için taramak yerine, bunu yaklaşık olarak yapar:

  • Sadece yolları ve dosya boyutlarını toplayarak hedef dosya sisteminin tamamını tarayın.
  • Dikkate alın, benzersiz dosya boyutlarına sahip dosyalar. Bu tek başına, zaman ve disk etkinliğini biriktirir. ("Scads", ters bir üstel fonksiyon veya başka bir şeydir.)
  • Kalan adaylardan ilk N baytını tarayın. Aynı dosya boyutlarına sahip ancak farklı ilk N baytları olanları dikkate alın.
  • Son N bayt için de aynısını yapın.
  • Sadece bunun (genellikle çok küçük bir kısmı) kalan kontrol toplamlarını tarayın.

Farkında olduğum rmlint'in diğer avantajları:

  • Sağlama toplamını belirleyebilirsiniz. md5 çok mu korkutucu? Sha256'yı deneyin. Veya 512. Veya bit için bit karşılaştırması. Ya da kendi karma fonksiyonunuz.
  • Size sadece reflink yerine Btrfs "clone" ve "reflink" seçeneklerini sunar. "cp --reflink = always" biraz risklidir, çünkü atomik değildir, çekirdekteki bu dosya için başka neler olup bittiğinin farkında değildir ve her zaman meta verileri korumaz. "Klon", OTOH (kısaca bir terimdir ... Resmi API ile ilgili isim üzerinde boşluk bırakıyorum), atomik ve meta verileri koruyan çekirdek düzeyinde bir çağrı. Neredeyse her zaman aynı şeyle sonuçlanır, ancak biraz daha sağlam ve güvenlidir. (Çoğu program, yinelenen dosyayı silmeyecek kadar akıllı olsa da, önce diğerine başarılı bir şekilde yansıma yapamazsa.)
  • Birçok kullanım durumu için bir ton seçeneğe sahiptir (bu da bir dezavantajdır).

Rmlint'i deduperemove ile karşılaştırdım - bu da her hedef dosyasını körü körüne checksum için tarar. Duperemove , tam eğimde tamamlanması için birkaç gün sürdü (4 sanırım). fmlint, yinelenenleri tanımlamak için birkaç saat sürdü , sonra bunları Btrfs klonu ile çıkarmak için bir günden az zaman aldı .

(Bu, kaliteyi, sağlam yazılımı yazmak ve desteklemek ve ücretsiz olarak vermek için çaba sarf eden herkes, büyük kudosları hak ediyor!)

Btw: Her ne pahasına olursa olsun, düzenli sabit bağlantıları "genel" veri tekilleştirme çözümü olarak kullanarak veri tekilleştirmekten kaçınmalısınız.

Sabit bağlantılar belirli hedefli kullanım durumlarında (örneğin, tek tek dosyalar veya minimum boyutu aşan belirli dosya türlerini tarayabilen bir araçla - veya birçok ücretsiz ve ticari yedekleme / anlık görüntü çözümünün bir parçası olarak) son derece kullanışlı olsa da, felaket olabilir. büyük bir genel kullanım dosya sisteminde "tekilleştirme" için. Bunun nedeni, çoğu kullanıcının dosya sistemlerinde ikili özdeş ancak işlevsel olarak tamamen farklı binlerce dosyaya sahip olmalarıdır.

Örneğin, birçok program başlangıçta özdeş olan şablon ve / veya gizli ayar dosyaları (bazen görebildiği her bir klasörde) oluşturur ve çoğu kullanıcı siz kalmamaları gerekene kadar kalır.

Belirli bir örnek olarak: Sayısız programın fotoğrafları içeren klasörde oluşturduğu (ve iyi bir nedenden dolayı - taşınabilirlik) fotoğraf küçük resim önbellek dosyalarının oluşturulması saatler veya günler sürebilir, ancak bir fotoğraf uygulamasını bir esinti haline getirebilir. Bu ilk önbellek dosyalarının tümü birbirine bağlıysa, uygulamayı daha sonra bir dizinde açarsınız ve büyük bir önbellek oluşturur ... sonra tahmin edin: Önceden sabit bağlantılı bir önbelleğe sahip HER klasör artık yanlış önbelleğe sahip. Potansiyel olarak, kazayla veri imhasına yol açabilecek feci sonuçlarla. Ayrıca potansiyel olarak hardlink farkında olmayan bir yedekleme çözümünden faydalanabilecek bir şekilde.

Ayrıca, tüm anlık görüntüleri bozabilir. Anlık görüntülerin tamamı, "canlı" sürümün, önceki bir duruma geri dönme özelliğiyle değişmeye devam edebilmesidir. Eğer her şey birbirine bağlıysa ... aynı şeye "geri dönersiniz".

İyi haber ise, Btrfs klonu / reflink ile tekilleştirmenin bu hasarı geri alabilmesidir (bence - tarama sırasında sabit bağlantılı dosyaları özdeş olarak görmelidir ... hardlinks'i dikkate almama mantığı olmadığı sürece. tekilleştirmeyi yapan belirli yardımcı program.)


Bu doğru değil; bedup aynısını yapar, boyut kovalarına bir şeyler koyun ve gerekirse sağlama toplamı oluşturmak için yalnızca tüm dosyayı okuyun. Ayrıca, bedup bunun sonucunu saklar, böylece sonraki çalışmalar daha da hızlı olur.
Peter Smit

@PeterSmit, yorumunuzun ilk bölümünü doğrulayabilirsem, cevabımı güncellemek istiyorum (ve kendimi tekrar yatağa geri çevirmeyi düşünüyorum). Bedup'ın github benioku bundan bahsetmez ve "dosya boyutu" veya "dosya boyutu" araması belirgin bir yanıt vermez. Nasıl doğrulayabilirim?
Jim

Ayrıca, yatağın son 3 yıldır terk edildiği görülüyor. Kullanmak istediğim gerçekten harika bir fikir gibi göründüğü için bir utanç! Umarım geri alırsın.
Jim
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.