Informasi file yang jarang ada di Linux

11

Saya memiliki file jarang, di mana hanya beberapa blok yang dialokasikan:

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

Saya ingin tahu blok mana dari file yang dialokasikan. Apakah ada panggilan sistem atau antarmuka kernel yang dapat digunakan untuk mendapatkan daftar alokasi, atau lubang file?

Cukup memeriksa string nol yang cukup panjang (pendekatan yang digunakan oleh GNU cp, rsync, dll) tidak berfungsi dengan benar:

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

Ini mendeteksi urutan nol lainnya yang sebenarnya dialokasikan.

Juliano
sumber

Jawaban:

7

Ada pertanyaan serupa di SO . The jawaban yang diterima saat ini oleh @ephemient menyarankan menggunakan ioctldisebut fiemapyang didokumentasikan dalam linux/Documentation/filesystems/fiemap.txt. Mengutip dari file itu:

Fiemap ioctl adalah metode yang efisien untuk userspace untuk mendapatkan pemetaan tingkat file. Alih-alih pemetaan blok demi blok (seperti bmap), fiemap mengembalikan daftar luasan.

Kedengarannya seperti ini adalah jenis informasi yang Anda cari. Dukungan oleh sistem file sekali lagi opsional:

Sistem file yang ingin mendukung fiemap harus menerapkan ->fiemap panggilan balik pada inode_operationsstrukturnya.

Dukungan untuk SEEK_DATAdan SEEK_HOLEargumen untuk lseekAnda yang disebutkan dari Solaris telah ditambahkan di Linux 3.1 sesuai dengan halaman manual , jadi Anda dapat menggunakannya juga. The fiemap ioctlmuncul untuk menjadi lebih tua, jadi mungkin akan lebih portabel di versi Linux yang berbeda untuk saat ini, sedangkan lseekmungkin akan lebih portabel di sistem operasi jika Solaris memiliki yang sama.

MvG
sumber
2
Anda bisa mendapatkan informasi FIEMAP ini dengan menggunakan --fibmapsatu hdparmutilitas. Lihat manualnya.
Totor
2

Ada kumpulan program python yang disebut sparseutils yang menggunakan SEEK_HOLEdan SEEK_DATAuntuk menentukan bagian mana dari file yang direpresentasikan sebagai lubang dan mana yang merupakan data. Penggunaannya cukup mudah. mksparsedapat digunakan untuk menghasilkan file jarang sesuai dengan beberapa tata letak yang diberikan.

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

The sparsemapprogram dapat digunakan untuk mencetak layout ke stdout:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096
richard
sumber
1

Itu tergantung pada sistem file. Saya tidak percaya mereka adalah panggilan, yang mungkin mengapa banyak alat tidak menangani menyalin file jarang dengan baik. Rantai alat GNU menggunakan pencarian untuk blok besar nol karena memungkinkan mereka untuk menghapus blok yang dialokasikan tidak terpakai. Banyak alat salin akan mengkonversi file jarang menjadi file dengan semua blok dialokasikan.

Anda mungkin harus membuka inode, dan menguraikan hasilnya. Format inode tergantung pada sistem file. Beberapa sistem file mungkin memiliki bagian dari data Anda di inode itu sendiri.

BillThor
sumber
1
Harus ada cara FS-agnostik untuk mendapatkan informasi ini. Membaca langsung dari inode jelas bukan pilihan. Saya mencari sesuatu seperti SEEK_DATAdan SEEK_HOLEparameter untuk lseek(), seperti yang ada di Solaris: opensolarisforum.org/man/man2/lseek.html
Juliano
@Juliano Pandangan tentang opsi Linux lseek tidak memiliki opsi ini. Solaris mendukung sangat sedikit sistem file, sehingga akan relatif mudah untuk didukung. Linux mendukung berbagai macam sistem file, beberapa di antaranya tidak mendukung file yang jarang. Dukungan untuk SEEK_DATA / SEEK_HOLE akan memaksakan dukungan dalam kode untuk semua sistem file. Metode-metode ini mungkin tidak melakukan apa yang Anda harapkan. Lihat blogs.sun.com/bonwick/entry/seek_hole_and_seek_data untuk lebih banyak data dari sisi Sun.
BillThor
1
Filesystem tidak perlu mendukung apa pun dengan antarmuka lseek (), kernel mendaftar modul modul sistem file yang mendukung SEEK_DATA / SEEK_HOLE melalui properti modul. Ini ada di halaman manual itu sendiri dan di blog yang ditautkan: "Untuk sistem file yang tidak menyediakan informasi tentang lubang, file tersebut akan direpresentasikan sebagai satu keseluruhan wilayah data."
Juliano
@Juliano Masih membutuhkan mod kernel serta perubahan untuk lseek. Sesuai entri blog ini adalah fungsionalitas yang cukup baru di Sun. Agar dapat bekerja, kode sistem file perlu dimodifikasi juga. Tentunya akan membutuhkan perubahan pada semua sistem file yang mendukung file jarang untuk menyediakan kait kernel.
BillThor