Tar, gzip, rsync ile seyrek dosyalardaki işlemleri nasıl hızlandırabilirim?


9

Seyrek bir dosyam var. ( du -h3G raporlar ve du -h --apparent-size100G raporlar.) Şimdiye kadar, çok iyi.

Şimdi, dosyayı kullanarak sıkıştırmak tarveya kullanarak ağ üzerinden göndermek istediğimde rsync, 3G kadar zaman gerektirecektir. Görünüşe göre bu araçlar tüm sıfırları okuyor.

Deliklerin bir şekilde işaretlendiğini düşündüm ve bu araçlar bir şekilde onları atlayabilir mi?

Dosyamla ilgili bir sorun yok mu?

Bu bir kayıp özelliğidir tarve rsyncseyrek dosyalar için görünmemek? tarParametreyi kullandım --sparse, ama bu işleri hızlandırmadı. rsyncParametre de vermedi --sparse.

Seyrek dosyalar üzerinde bu araçları hızlandırmanın bir yolu var mı?

Yanıtlar:


7

bsdtar(en azından libarchive3.1.2'den itibaren ), FS_IOC_FIEMAPonu destekleyen dosya sistemlerinde ioctl kullanarak seyrek bölümleri algılayabilir (ancak diğer API'ları da desteklese de), ancak en azından testimde, garip bir şekilde, ele almak mümkün değildir tar(bir böcek olsa gibi görünüyor), kendi ürettiği dosyaları.

Ancak tarbunları çıkarmak için GNU kullanmak işe yarar, ancak daha sonra GNU katranı bsdtar'ın desteklediği bazı genişletilmiş özellikleri işleyemez.

Yani

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)

dosyalar genişletilmiş özniteliklere veya bayraklara sahip olmadığı sürece çalışır.

Hala FS_IOC_FIEMAPioctl 0 dereceyi döndürdüğü için tamamen seyrek (sadece sıfır) olan dosyalar için çalışmaz ve bu bsdtardüzgün işlemiyor gibi görünüyor (başka bir hata?).

star( Schily tar ), seyrek dosyaları algılayabilen ( -sparseseçeneği kullanın) ve bu hatalara sahip olmayan bsdtar(ancak birçok sistem tarafından paketlenmemiş ) başka bir açık kaynaklı katran uygulamasıdır .


2

Bu makaleninrsync en azından bazı yararlı önerileri vardır :

sorunlar

Kullanmak rsync --sparse works, ancak gereksiz disk yazma büyük bir montaj neden olur. 50 GB uzunluğunda (kullanılan 1 GB) 10 baytın değiştirilmesi yalnızca bir veya iki bloğun yazılmasına neden olur, bu da 1 GB'ın yazılmasına neden olur. Bu yavaştır ve disklerin uzun ömürlülüğü için iyi değildir.

Kullanmak rsync --inplaceçalışır, ancak seyrek olmayan dosyalar oluşturur.

--Sparse ve --inplace'i aynı anda kullanamazsınız :-( rsync tarafından izin verilmez. Rsync: --sparse --inplace ile kullanılamaz

Çözüm

Önceden var olan bir seyrek dosyayı güncellemek için --inplace komutunu kullanırsanız, dosya seyrek kalır ve yalnızca az sayıda blok yazılır. Sadece rsync --inplace, dosyayı seyrek yapmadığı bir dosya oluşturduğunda.

Dolayısıyla çözüm, kaynak makinedeki her dosya için hedef makinede karşılık gelen, doğru uzunlukta, boş, seyrek bir dosya oluşturmaktır - dosya henüz hedef makinede yoksa.

Daha sonra rsync --inplace, seyrek dosyaları seyrek bırakarak ve yalnızca değiştirilen blokları diske yazarak amaçlandığı gibi çalışacaktır.

Bunu doğru okursam, önce hedef üzerinde boş bir seyrek dosya oluşturmak istersiniz. Bunu ile yapabilirsiniz

truncate -s 3G filename

Daha sonra rsync --inplacedosyaları üzerine kopyalamak için kullanabilirsiniz . Bu sadece bir kez gerekli olmalıdır.


Aynı makalede kullanarak önerir Virtsync olan

büyük dosyaların (sanal makine diski görüntüleri ve veritabanları gibi) içeriklerini senkronize etmek için 49 dolarlık bir ticari Linux komut satırı aracı.

Bu tür bir durum için özel olarak yazılmış gibi göründüğü için bunun için ödeme yapmak istiyorsanız, bu en iyi çözüm olabilir.

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.