Dua bahan utama adalah hdparm --fibmap file
, yang memberi tahu Anda di mana file secara fisik berada di dalam LV, dan lvs -o +seg_pe_ranges,vg_extent_size
yang memberi tahu Anda di mana LV secara fisik berada di perangkat Anda.
Sisanya adalah matematika.
Jadi, misalnya:
# hdparm --fibmap linux-3.8.tar.bz2
linux-3.8.tar.bz2:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 288776 298511 9736
4984832 298520 298623 104
5038080 298640 298695 56
5066752 298736 298799 64
5099520 298824 298895 72
[...]
Saya tidak tahu mengapa ini sangat terfragmentasi - diunduh dengan wget. Mungkin menjadi contoh yang baik karena seperti yang Anda lihat, Anda mendapatkan sakit kepala tanpa membuat skrip ini, setidaknya untuk file yang terfragmentasi. Saya hanya akan mengambil segmen pertama 288776-298511 (9736 sektor). Hitungannya salah karena bukan sektor 512 byte, tetapi bagaimanapun juga.
Pertama-tama periksa apakah data ini benar:
# dd if=linux-3.8.tar.bz2 bs=512 skip=0 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0506548 s, 98.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
# dd if=/dev/lvm/src bs=512 skip=288776 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.123292 s, 40.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
Wheeee. Itu identik jadi kami membaca LV-src di tempat yang tepat. Sekarang di mana sumber-LV berada?
# lvs -o +seg_pe_ranges,vg_extent_size
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert PE Ranges Ext
[...]
src lvm -wi-ao--- 4.00g /dev/dm-1:5920-6047 32.00m
[...]
Nah, itu membosankan, LV ini tidak terfragmentasi. Tidak sakit kepala di sini. Bagaimanapun.
Dikatakan src ada di / dev / dm-1 dan dimulai pada PE 5920 dan berakhir pada PE 6047. Dan ukuran PE adalah 32 MiB.
Jadi mari kita lihat apakah kita dapat membaca hal yang sama dari / dev / dm-1 secara langsung. Secara matematis, ini sedikit lebih buruk karena kami menggunakan blocksize 512 byte sebelumnya ...: - / tapi saya malas jadi saya hanya akan menghitung MiB dan kemudian membaginya dengan 512! Ha! :-D
# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0884709 s, 56.3 MB/s
3858a4cd75b1cf6f52ae2d403b94a685 -
Boo-boo. Ini bukan yang kita cari. Apa yang salah? Ah! Kami lupa menambahkan offset yang ditempati oleh LVM di awal PV untuk menyimpan metadata dan omong kosong LVM. Biasanya ini adalah MiB-sejajar, jadi tambahkan saja MiB lain:
# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776 + 1024*1024/512)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0107592 s, 463 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
Itu dia.