Ada pertanyaan serupa di SO. Jawaban yang saat ini diterima oleh @ephemient menyarankan menggunakan ioctl
disebut fiemap
yang didokumentasikan dalam linux/Documentation/filesystems/fiemap.txt
. Mengutip dari file itu:
Fiemap ioctl adalah metode yang efisien untuk userspace untuk mendapatkan pemetaan fileextent. Alih-alih pemetaan blok demi blok (seperti bmap),fiemap menampilkan daftar luasan.
Kedengarannya seperti ini adalah jenis informasi yang Anda cari. Dukungan oleh sistem file juga opsional:
Sistem file yang ingin mendukung fiemap harus menerapkan
->fiemap
callback padainode_operations
mereka struktur.
Dukungan untuk SEEK_DATA
dan SEEK_HOLE
argumen ke lseek
Anda sebutkan dari Solaris telah ditambahkan di Linux 3.1 menurut halaman manual, jadi Anda dapat menggunakannya juga. fiemap ioctl
tampaknya lebih tua, jadi mungkin lebih portabel di berbagai versi Linux untuk saat ini, sedangkan lseek
mungkin lebih portabel di seluruh sistem operasi jika Solaris memiliki hal yang sama.
Ada kumpulan program python bernama sparseutils yang menggunakan SEEK_HOLE
dan SEEK_DATA
untuk menentukan bagian mana dari file yang direpresentasikan sebagai lubang dan mana yang merupakan data. Penggunaannya cukup mudah. mksparse
dapat digunakan untuk menghasilkan file renggang 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
sparsemap
program dapat digunakan untuk mencetak tata letak ke stdout:
$ sparsemap example
HOLE 4096
DATA 4096
HOLE 4096