Linux'ta ayrıntılı seyrek dosya bilgileri


11

Ben sadece bazı bloklar ayrılır seyrek bir dosya var:

~% du -h --apparent-size example
100K    example
~% du -h example
52K     example

Dosyanın hangi bloklarının gerçekten tahsis edildiğini bilmek istiyorum. Tahsislerin veya dosyanın deliklerinin bir listesini almak için kullanılabilecek bir sistem çağrısı veya çekirdek arabirimi var mı?

Sadece yeterince uzun bir sıfır dizisi (GNU cp, rsync, vb. Tarafından kullanılan yaklaşım) doğru şekilde çalışmaz:

~% cp example example1  
~% du -h example1 
32K     example1

Gerçekte tahsis edilen diğer sıfır dizilerini tespit etti.

Yanıtlar:


7

Orada SO benzer bir soru . Şu anda kabul cevap tarafından @ephemient bir kullanarak önerir ioctldenilen fiemapbelgelenmiştir hangi linux/Documentation/filesystems/fiemap.txt. Bu dosyadan alıntı yapılıyor:

Fiemap ioctl, kullanıcı alanı için dosya kapsamı eşlemeleri almak için etkili bir yöntemdir. Blok-blok eşleme (bmap gibi) yerine, fiemap bir uzantı listesi döndürür.

Bu, aradığınız bilgi türüdür. Dosya sistemleri desteği yine isteğe bağlıdır:

Fiemap'i desteklemek isteyen dosya sistemleri ->fiemap , inode_operationsyapıları için bir geri arama uygulamalıdır .

Destek SEEK_DATAve SEEK_HOLEkarşı argümanlar lseekEğer Solaris dan söz uyarınca Linux 3.1 eklendi kılavuz sayfasında siz de o kullanabilir, böylece. Daha fiemap ioctleski gibi görünüyor, bu yüzden şimdilik farklı Linux sürümlerinde lseekdaha taşınabilir olabilir , oysa Solaris aynıysa işletim sistemlerinde daha taşınabilir olabilir.


2
Sen kullanarak bu FIEMAP bilgi alabilirsiniz --fibmapait hdparmfayda. El kitabına bakın.
13'te Totor

2

Denilen piton programlar bütünü vardır sparseutils kullanmak SEEK_HOLEve SEEK_DATAdosyanın bölümleri delikleri olarak temsil ve verilerdir hangilerinin belirlemek için. Kullanımı oldukça basittir. mksparseverilen düzene göre seyrek bir dosya oluşturmak için kullanılabilir.

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

sparsemapProgram Stdout'a düzenini yazdırmak için kullanılabilir:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096

1

Dosya sistemine bağlıdır. Onların bir çağrı olduğuna inanmıyorum, bu yüzden birçok araç seyrek dosyaları kopyalamayı iyi idare etmiyor olabilir. GNU takım zinciri, kullanılmayan tahsis edilmiş blokları silmelerine izin veren büyük sıfır blokları aramayı kullanır. Birçok kopyalama aracı, seyrek bir dosyayı tüm blokları ayrılmış bir dosyaya dönüştürür.

Büyük olasılıkla inode'u açmanız ve sonucu ayrıştırmanız gerekecektir. Inode formatı dosya sistemine bağlıdır. Bazı dosya sistemleri verilerinizin bir kısmını inode'un kendisinde içerebilir.


1
Bu bilgiye sahip olmanın FS-agnostik bir yolu olmalı. Doğrudan inode'dan okumak kesinlikle bir seçenek değildir. Solaris'te olduğu gibi bir şey SEEK_DATAve SEEK_HOLEparametreler arıyordum lseek(): opensolarisforum.org/man/man2/lseek.html
Juliano

@Juliano Linux lseek seçeneğine bir bakış bu seçeneklere sahip değildir. Solaris çok az dosya sistemini destekler, bu nedenle desteklenmesi nispeten kolay olacaktır. Linux, bazıları seyrek dosyaları desteklemeyen çok çeşitli dosya sistemlerini destekler. SEEK_DATA / SEEK_HOLE desteği, tüm dosya sistemleri için kod desteği sağlayacaktır. Bu yöntemler beklediğiniz şeyi yapmayabilir. Güneş tarafından daha fazla veri için blogs.sun.com/bonwick/entry/seek_hole_and_seek_data adresine bakın .
BillThor

1
Dosya sistemlerinin lseek () arayüzü ile herhangi bir şeyi desteklemesi gerekmez, çekirdek bir module özelliği aracılığıyla SEEK_DATA / SEEK_HOLE özelliğini destekleyen dosya sistemi modüllerini listeler. Bu, sayfanın kendisinde ve bağlı blogdadır: "Delikler hakkında bilgi sağlamayan dosya sistemleri için, dosya bir veri bölgesinin tamamı olarak temsil edilir."
Juliano

@Juliano Still, çekirdek modlarının yanı sıra lseek'te de değişiklik yapılmasını gerektirir. Blog girişine göre bu Sun'ın oldukça yeni bir işlevselliğidir. Çalışması için dosya sistemi kodunun da değiştirilmesi gerekiyor. Kesinlikle çekirdek kancalarını sağlamak için seyrek dosyaları destekleyen tüm dosya sistemlerinde değişiklik yapılmasını gerektirir.
BillThor
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.