2つの主要な構成要素はhdparm --fibmap file
であり、これはファイルがLV内の物理的にlvs -o +seg_pe_ranges,vg_extent_size
どこにあるかを示し、LVがデバイス上の物理的にどこにあるかを示します。
残りは数学です。
したがって、たとえば:
# 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
[...]
なぜこれがそんなに断片化されているのか私にはわかりません-wgetでダウンロードしました。ご覧のように、少なくとも断片化されたファイルについては、なんとかしてこれをスクリプト化しないと頭痛の種になるので、良い例かもしれません。最初のセグメント288776-298511(9736セクター)を取り上げます。512バイトセクターではないため、カウントは間違っています。
まず、このデータが実際に正しいことを確認します。
# 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。それは同じなので、適切な場所でLV-srcを読み取っています。ソースLVはどこにありますか?
# 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
[...]
今では退屈ですが、このLVは断片化されていません。ここで頭痛はありません。とにかく。
これは、srcが/ dev / dm-1にあり、PE 5920で始まり、PE 6047で終わることを示しています。PEサイズは32 MiBです。
/ dev / dm-1から同じものを直接読み取ることができるかどうかを確認してみましょう。数学的には、これまでに512バイトのブロックサイズを使用していたので、これは少し難解です。ハ!:-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 -
ブーブー。これは私たちが探しているものではありません。何が悪かったのか?ああ!LVMメタデータとがらくたを保存するために、PVの先頭にLVMが占めるオフセットを追加するのを忘れていました。通常、これはMiBアラインメントなので、別のMiBを追加するだけです。
# 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 -
そこにあります。