Saat menjawab pertanyaan U&L ini berjudul: Perintah apa yang saya gunakan untuk melihat blok awal dan akhir file dalam sistem file? , Saya mencoba mencari tahu apakah mungkin untuk menentukan LBA file menggunakan inode itu.
Jawaban saya menentukan bahwa saya dapat menggunakan hdparm
sebagai satu metode untuk menemukan BBA:
$ sudo hdparm --fibmap afile
afile:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 282439184 282439191 8
Tapi saya ingin tahu apakah ada beberapa metode menggunakan inode file untuk mendapatkan LBA; tanpa menggunakan hdparm
.
Saya pikir mungkin ada metode alternatif bersembunyi di alat filefrag
, stat
, debugfs
, dan tune2fs
tapi menggoda itu adalah sehingga dapat menghindari saya.
Adakah yang bisa memikirkan alternatif?
Inilah beberapa penelitian saya sejauh ini yang mungkin berguna bagi mereka yang cukup berani untuk mencoba menjawab ini.
filefrag
Saya curiga Anda dapat menggunakan alat filefrag
untuk melakukannya, khususnya menggunakan hasil dari -e
peralihannya, mungkin dengan melakukan beberapa perhitungan untuk sampai ke sana yang saya tidak terlalu kenal.
output sampel
$ filefrag -e afile
Filesystem type is: ef53
File size of afile is 20 (1 block of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 0: 35304898.. 35304898: 1: eof
afile: 1 extent found
inode
Metode potensial lain yang saya duga mungkin memiliki potensi adalah dengan menggunakan informasi inode file, baik secara langsung atau melalui beberapa matematika kompleks yang kurang terdokumentasi pada interweb.
Contoh
Pertama kita cari inode file. Kita dapat melakukan ini dengan menggunakan stat
perintah atau ls -i
.
stat
$ stat afile
File: ‘afile’
Size: 20 Blocks: 8 IO Block: 4096 regular file
Device: fd02h/64770d Inode: 6560281 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ saml) Gid: ( 1000/ saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2013-12-27 18:40:12.788333778 -0500
Modify: 2013-12-27 18:40:23.103333073 -0500
Change: 2013-12-27 18:44:03.697317989 -0500
Birth: -
ls -i
$ ls -i
6560281 afile
Dengan informasi inode di tangan, kita sekarang dapat membuka sistem file yang berada di file ini menggunakan alat debugfs
,.
CATATAN: Untuk menentukan sistem file tempat file berada, Anda dapat menggunakan perintah df <filename>
.
Sekarang jika kita menjalankan debugfs
dan menjalankan perintah stat <inode #>
kita bisa mendapatkan daftar luasan yang berisi data file ini.
$ sudo debugfs -R "stat <6560281>" /dev/mapper/fedora_greeneggs-home
debugfs 1.42.7 (21-Jan-2013)
Inode: 6560281 Type: regular Mode: 0664 Flags: 0x80000
Generation: 1999478298 Version: 0x00000000:00000001
User: 1000 Group: 1000 Size: 20
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x52be10c3:a640e994 -- Fri Dec 27 18:44:03 2013
atime: 0x52be0fdc:bbf41348 -- Fri Dec 27 18:40:12 2013
mtime: 0x52be0fe7:18a2f344 -- Fri Dec 27 18:40:23 2013
crtime: 0x52be0dd8:64394b00 -- Fri Dec 27 18:31:36 2013
Size of extra inode fields: 28
Extended attributes stored in inode body:
selinux = "unconfined_u:object_r:user_home_t:s0\000" (37)
EXTENTS:
(0):35304898
Sekarang kami memiliki informasi luas di atas, dan di sinilah saya tersesat dan tidak tahu bagaimana melanjutkan.
Referensi
sumber
filefrag -b512 -v ..
mengatakan "physical_offset: 211787168 .. 211795719" ini akan sama dengan LBA? Ini sepertinya hidup dengan file yang sama denganhdparm --fibmap
, 211787168..211795719. Jika saya menjatuhkan-b512 -v
dan menggunakan def. 1024, dan mencoba mult. oleh 8, 26473396⋅8..26474464⋅8, saya mendapatkan 211787168..211795712, yang dekat tapi sedikit mati. Saya pikir nilai 2 seharusnya (26474465⋅8) -1 = 211795719, tidak yakin mengapa.Ternyata untuk mengkonversi dari luasan ke LBA sebenarnya cukup mudah setelah Anda memahami dari mana angka-angka itu berasal. Jawaban @StephaneChazelas sangat penting untuk mendapatkan pemahaman ini.
Output debugf asli
Menggunakan contoh berikut yang disebutkan dalam pertanyaan.
Dengan informasi luasan kita dapat melakukan perhitungan berikut. Tetapi kami membutuhkan satu informasi tambahan. Ukuran blok sistem file yang mendasarinya. Anda dapat menggunakan perintah ini untuk mendapatkannya.
Ukuran blok
Konversi dari Extents ke LBA
Jadi transformasi utama yang harus dikenali di sini adalah bahwa LBA berada dalam unit 512 byte dan
debugfs
perintah di atas yang melaporkan jumlah luasan, melaporkannya dalam blok 4096 byte.Jadi, 4096/512 = 8. Jadi kita perlu mengalikan luasan dengan 8 untuk mengubahnya menjadi nilai LBA.
Jadi matematika berikut akan memberi kita LBA awal kita:
Jadi apa LBA akhir kita? Untuk mendapatkan itu kita perlu mengenali bahwa inode kita pas di dalam satu blok sehingga tingkat akhirnya sama dengan tingkat awalnya. Untuk menghitung LBA akhir kita bisa menggunakan persamaan ini.
Jadi melakukan perhitungan ini:
Mengonfirmasi hasil
Melihat hasil asli
hdparm
:Kami melihat bahwa semuanya cocok.
Contoh lain
Hanya untuk memastikan kami ada di sini, file yang lebih besar sebagai contoh ke-2.
Inilah luasan inode.
Sekarang kami melakukan konversi dari luasan ke LBA.
Dan kami mengkonfirmasi.
Dan kami cocok lagi.
sumber