Bagaimana saya bisa mengetahui di mana file secara fisik berada di disk (nomor blok)?

10

Ini pertanyaan yang tidak jelas, saya tahu. Saya mencoba melakukan beberapa pengujian kinerja beberapa disk pada kotak Linux. Saya mendapatkan beberapa hasil yang tidak konsisten, menjalankan tes yang sama pada disk yang sama. Saya tahu bahwa disk memiliki kinerja yang berbeda tergantung pada bagian mana dari disk yang sedang diakses. Secara khusus, membaca dan menulis ke luar disk memiliki throughput yang jauh lebih tinggi daripada membaca dan menulis ke bagian dalam disk, karena kepadatan data yang hampir konstan dan kecepatan rotasi yang konstan.

Saya ingin melihat apakah inkonsistensi saya dapat dikaitkan dengan varians yang diinduksi geometri dalam throughput. Apakah mungkin, menggunakan alat yang ada, untuk mencari tahu di mana pada disk file telah ditempatkan?

Jika tidak, saya kira saya bisa menulis sesuatu untuk secara langsung mencari, membaca, dan menulis ke file perangkat itu sendiri, mem-bypass (dan menghancurkan) sistem file, tetapi saya berharap untuk menghindarinya. Saya saat ini menggunakan ext4 pada kernel 3.0 (Arch Linux, jika itu penting), tapi saya tertarik pada teknik untuk sistem file lain juga.

Rick Koshi
sumber
1
siapa bilang file ada di satu tempat? Jika mereka terfragmentasi (yang biasanya mereka lakukan) mereka bisa berakhir di mana-mana.
Sirex
Benar. Tapi mereka masih di suatu tempat :-) Dan dalam kasus khusus saya, menulis file ke sistem file yang baru dibuat, mereka cenderung (sebagian besar) tidak terfragmentasi.
Rick Koshi
Kamu tidak bisa melakukan ini Yang terbaik yang bisa Anda dapatkan adalah nomor blok LBA dari file, yang tidak selalu sesuai dengan lokasi fisik yang ditentukan (setidaknya tidak dengan cara yang dapat Anda tentukan, karena drive tidak mempublikasikan pemetaan ini). Ada hal-hal lain, misalnya, blok 3-5 mungkin diberi nomor secara berurutan, tetapi 4 mungkin telah dialokasikan kembali ke lokasi yang sama sekali berbeda pada drive karena sektor asli di 4 rusak secara fisik, dll. Anda tidak dapat memperoleh informasi Anda mencari kecuali pabrikan drive bersedia memberikan spesifikasi alamat yang terperinci kepada Anda.
Jason C

Jawaban:

7

Anda bisa menggunakan debugfsini:

debugfs -R "stat ~/myfile" /dev/hda1

Ubah hard / partisi drive sesuai dan pastikan drive dilepas. Anda akan mendapatkan daftar dengan semua blok yang digunakan:

BLOCKS:
(0):1643532
TOTAL: 1
Bart De Vos
sumber
1
Ini sempurna, terima kasih. Saya tidak yakin mengapa Anda mengatakan untuk memastikan drive tidak di-mount. Menurut halaman manual, debugfs terbuka dalam mode read-only secara default, jadi perintah ini harus benar-benar aman bahkan pada sistem file yang aktif. Ini mungkin memberikan hasil yang dipertanyakan jika file yang dipertanyakan sedang aktif diubah pada saat itu, tentu saja, tetapi tidak ada masalah lain yang muncul. Apakah saya melewatkan sesuatu?
Rick Koshi
Tidak, kamu benar. Ini lebih dari 'praktik terbaik' daripada keharusan. Jika Anda melakukannya pada sistem file yang aktif, file dapat berubah dll.
Bart De Vos
1
Nomor blok LBA tidak memberi tahu Anda di mana file secara fisik terletak pada disk. Hari-hari ini konversi dari LBA ke lokasi fisik umumnya tidak mungkin, karena kompleksitas geometri fisik drive modern, realokasi sektor di belakang layar, dll. Secara umum, biasanya itu adalah taruhan yang aman bahwa untuk media berbasis cakram, BBL lebih rendah menuju bagian luar drive, tapi itu hanya karena tata letak yang telah khas di masa lalu, kembali di hari-hari pengalamatan CHS. Drive modern bahkan tidak mempublikasikan geometri CHS nyata lagi, karena mereka tidak bisa.
Jason C
bagaimana dengan sistem fat fie?
dashesy
10

Anda dapat menggunakan FIBMAP ioctl , seperti dicontohkan di sini , atau menggunakan hdparm :

/ $ sudo /sbin/hdparm --fibmap /etc/X11/xorg.conf

/etc/X11/xorg.conf:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0    1579088    1579095          8
Francois G
sumber
Sayangnya, tidak ada yang dihasilkan oleh stat adalah informasi yang saya butuhkan. Ukuran dalam byte dan blok, nomor inode, izin ... Tidak ada yang mencerminkan blok mana yang berisi data file. Sebagai contoh, file pengujian saya (yang semuanya berukuran sama) semuanya menunjukkan data yang persis sama, kecuali untuk nomor inode dan waktu akses / modifikasi.
Rick Koshi
Ya, Anda benar, saya minta maaf, saya tidak membaca dengan benar. Saya mengubah jawaban saya menjadi lebih sesuai.
Francois G
hdparm memang memberi saya apa yang saya butuhkan, dan dalam format yang agak lebih mudah dibaca daripada debugfs. Saya harus mencarinya, karena tidak diinstal (di Arch Linux) secara default. debugfs adalah bagian dari e2fsprogs (paket yang sama yang memberi kita mkfs dan fsck), jadi diinstal secara default.
Rick Koshi
LBA tidak memberi tahu Anda di mana file tersebut berada secara fisik di drive. Tidak mungkin untuk mendapatkan informasi tentang pemetaan fisik aktual dari BBL.
Jason C
Saya mendapatkan ini lemak:HDIO_GETGEO failed: Inappropriate ioctl for device
dashesy
5

Utas ini dapat memberi Anda wawasan tentang algoritma penempatan file ext4.

debugfsmemiliki bmapfungsi, yang sepertinya memberikan data yang Anda inginkan. Anda harus dapat memberikannya blok file secara berurutan dan mendapatkan nomor blok fisik.

Paweł Brodacki
sumber
1
Terima kasih atas penunjuk ke utas tentang penempatan file ext4. Itu mencerahkan. :-)
Rick Koshi
LBA tidak memberi tahu Anda di mana file tersebut berada secara fisik di drive. Tidak mungkin untuk mendapatkan informasi tentang pemetaan fisik aktual dari BBL.
Jason C
2

Pertanyaannya agak lama, tetapi ada jawaban lain yang bisa berguna bagi mereka yang menemukan ini di Google: filefrag(dalam bahasa Debian itu ada di dalam paket e2fsprogs).

# filefrag -eX /usr/bin/aptitude
Filesystem type is: ef53
File size of /usr/bin/aptitude is 4261400 (1041 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..     1fa:    15bd805..   15bd9ff:    1fb:            
   1:      1fb..     3f2:    15c6608..   15c67ff:    1f8:    15bda00:
   2:      3f3..     410:    15c8680..   15c869d:     1e:    15c6800: last,eof
/usr/bin/aptitude: 3 extents found

Ini memiliki keuntungan karena berfungsi juga untuk sistem file lain (saya menggunakannya untuk UDF), yang tampaknya tidak didukung oleh alat lain yang dijelaskan di sini.

Offset yang disajikan dalam output dimaksudkan dalam kelipatan dari ukuran blok yang ditulis pada baris kedua (4096 di sini). Berhati-hatilah bahwa offset logis mungkin tidak bersebelahan, karena file dapat memiliki lubang di dalamnya (bila didukung oleh sistem file).

Giovanni Mascellani
sumber