Bir dosyanın yalnızca bir kopyasını tutan bir dosya sistemi var mı ve diğer kopyalar sadece referans mı?


18

Soru kesin olmayabilir, bu yüzden daha ayrıntılı olarak açıklamaya çalışacağım.

Birçok nedenden dolayı , Linux dosya sistemimde aynı dosyanın birçok kopyası var . Birçoğu oldukça büyük.

Diyelim ki /path/to/some.filebu dosyanın /other/path/file.nameve kopyalarım var /yet/another/path/third.copy. Bu dosyalardan ikisinin orijinaline referans olarak hareket etmesini sağlayacak bir dosya sistemi olup olmadığını merak ediyorum. Doğal olarak, kullanıcı bunlardan birini değiştirirse, ancak o zaman bağımsız dosyalar haline gelir.

PS. Bunun (kısmen) bağlantılar kullanılarak gerçekleştirilebileceğini biliyorum. Ancak yukarıda açıklamaya çalıştığım bu özelliğin dosya sistemi tarafından şeffaf bir şekilde ele alınmasını istiyorum.


Henüz mükemmel bir cevap yok gibi göründüğünden, neden dosyaları sabit bağlantılarla değiştiren bir komut dosyası (belki de cron'dan çalıştırılıyor) yazmıyorsunuz (veya bazıları için güvenliyse, semboller)? Her durumda, tüm kopyaların nerede olduğunu bilmiyorsanız, fdupes code.google.com/p/fdupes adresine bakın .
Joe

1
Bunu yapamam çünkü bazı kullanıcı kopyalardan birinde veri değiştirdiğinde, içerik değişiklikten sonra farklı olduğu için bağımsız dosyalar haline gelmelidir ... Sembolik bağlantılar yaparsam, değişiklik aslında orijinali değiştirir. Orijinal dosyayı işlevsel bir programlama dilinde bir değer olarak düşünün - değiştirdiğinizde, kelimenin tam anlamıyla yeni bir nesne alırsınız ve ona başvurursunuz.
DejanLekic

TAMAM. Sadece bazı fikirler: Kullanıcılarınız ve bu dosyalar arasında bir yol var mı? Yapabiliyorsanız, bir bağlantıyla (sym veya hard) başlayabilir ve daha sonra dosyaya bir şey yazarlarsa bağlantıyı kesebilirsiniz. Ayrıca, sürüm kontrol sistemindeki gibi çok yer kazanmak için farklılıkları depolamak için diff gibi bir şey kullanabilirsiniz. Dosyaları bunlardan birine koyarsanız, sizin için farklılıkları yönetebilir. Vcs sistemlerini fazla kullanmadım, bu yüzden detayları bilmiyorum.
Joe

Yanıtlar:


17

Bu özelliğe veri tekilleştirme denir . Popüler Linux dosya sistemlerinden hiçbiri (ext *) desteklemez, ancak görünüşe göre ZFS bunu kısmen destekliyor . Ayrıca, diğerlerinin yanı sıra veri tekilleştirme listeleyen bir dosya sistemleri tablosu da vardır , ancak herhangi bir popüler seçenek görünmemektedir - yine de Btrfs için planlanmış bir özelliktir.

Dosya sisteminizi periyodik olarak kontrol etmenin ve uygun sabit bağlantılar oluşturmanın, şu anda yapabileceğiniz en iyisi olduğunu tahmin ediyorum, ancak bu, yazma üzerine kopyalama anlamına gelmiyor.


BTRFS'nin bunu aldatmasını umuyordum. Bu özelliğe sahip olmayı planladıklarını bilmiyordum - iyi haber! Teşekkürler!
DejanLekic

10

Aramak istediğiniz birincil anahtar kelime "yazarken kopyala" dır. BTRFS, cp --reflinksisteminizde yeterince modern bir çekirdek ve coreutils 7.5 olması koşuluyla , tam olarak ne istediğinizi yapan ve aradığınızı yapacak bir klonlama işlemine sahiptir. Wiki Source Ayrıca, bedup tüm bir birimdeki kopyaları birleştirecek bir araçtır. CoW aynı zamanda btrfs'nin anlık görüntü teknolojisi IIRC'nin altında da sürüş özelliğidir.


Biliyorum cp --reflinkama aslında FS'nin klonları tespit etmesini ve bunun yerine şeffaf bir şekilde referanslar kullanmasını istediğimi unutmayın. Ben de araçtan uzaktayım bedup.
DejanLekic

Kullanıcı düzeyinde bir işlem bir dosyadan okuduğunda ve diğerine yazdığında, FS katmanı bunun değiştirilmiş bir kopya değil, tam bir kopya olduğunu nasıl bilecek? Bu yüzden klonlama için sadece okuma ve yazma için ayrı bir ioctl var. Dosyaları klonlamak ve CoW kullanmak isteyen uygulamalar, kullanılabilir olduğunda bu tür şeyleri kullanmalı ve tersine dönmelidir. FS katmanının bir kopya olduğunu tespit edip bunun yerine CoW yapabileceği güvenilir bir sihirli yöntem yoktur. Bir uygulama, iş için uygun çağrıyı ( cp --reflink/ klon) veya işi daha sonra bitirmek için ayrı bir aracı kullanmalıdır (artırma).
afrazier

Karma (daha güvenli) veya crc + zaman damgası değerlerini karşılaştırarak. Yazma kesinlikle FS'nin bir dosyanın bağımsız bir kopyasını oluşturmasına neden olur. Ayrıca, bu sistem sayfa düzeyinde uygulanacaktır ...
DejanLekic

Ve çekirdeğin tam olarak nerede yapıldığı? Bahsettiğiniz şey basit bir sorun değil. Sayfa düzeyinde yapmak da mümkündür, ancak satır içi yapmak için büyük miktarda RAM gerektirir - ZFS, TB veri başına 20 GB'tan fazla RAM olabilir [Kaynak ] ve OpenDedup , TB veri başına 8 GB RAM ister. / 4k sayfa [Kaynak ]. Performans maliyetiyle L2ARC ile ZFS gereksinimleri azaltılabilir.
afrazier

1
Yedekleme deposundan bahsetmediğiniz sürece WHS tekilleştirme işlemi yapmaz. Yedekleme yazılımı söz konusu olduğunda, istemci yazıya herhangi bir veri göndermeden önce işin çoğunu yapabilir ve karmayı sunucu ile kontrol edebilir. Bir yedekleme hizmeti, dosya sisteminden çok farklı bir canavardır. Birinde işe yarayan stratejiler diğeri için geçerli olmayabilir.
afrazier

4

Büyük veri tekilleştirme kapasitesine sahip yedeklemeler için tasarlanmış bir çevrimiçi dosya sistemi S3QL vardır .


Yerel bir dosya sistemi için buna ihtiyacım olduğunu söylemeliydim ... +1 yararlı bilgiler için.
DejanLekic

@DejanLekic, local: // ... gibi URL'lere izin verilir.
Daniel Fanjul

0

Zfs, btrfs, ext3cow, bcachefs (afaik, ancak henüz uygulanma şansı var). Microsoft'un geliştirme aşamasında bir tane vardı, ancak bilinmeyen nedenlerle durdular.

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.