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.
sumber
--fibmap
satuhdparm
utilitas. Lihat manualnya.Ada kumpulan program python yang disebut sparseutils yang menggunakan
SEEK_HOLE
danSEEK_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 jarang sesuai dengan beberapa tata letak yang diberikan.The
sparsemap
program dapat digunakan untuk mencetak layout ke stdout:sumber
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.
sumber
SEEK_DATA
danSEEK_HOLE
parameter untuklseek()
, seperti yang ada di Solaris: opensolarisforum.org/man/man2/lseek.html