指定されたファイルのLVM範囲番号の決定

指定されたファイルのLVM範囲番号の決定

私は現在、仕事に関連していない宿題をしています。私の論理ボリュームにext4ファイルシステムがあります。さまざまなパフォーマンス調整戦略をテストしていましたが、このアイデアが浮上しました。 pvmoveは個々の拡張領域と拡張領域の両方を移動できるため、特定のファイル(理論的にはデータベースのバックアップファイルまたは頻繁にアクセスする大規模ファイル共有)を保持する物理拡張領域を特定し、特定の場所リポジトリに移動できます。方法はありますか?デバイス(たとえば、同じLVMボリュームグループに通常のHDDとSSDドライブがあります)?

私は "filefrag"を使用しようとしましたが、範囲番号を順番に使用する必要があるかどうか100%確信できないと思いました。したがって、ファイルが表示されるext4のセクタ数を知ることが必ずしも計算できるわけではありません。 it out ファイルが実際に位置する範囲番号/ボリュームです。

どんなアイデアがありますか?

答え1

2つの主なコンポーネントは、LV上のファイルの物理的な場所と、デバイス上のLVの物理的な場所をhdparm --fibmap file教えてくれることです。lvs -o +seg_pe_ranges,vg_extent_size

残りは数学です。

たとえば、次のようになります。

# 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  -

ホイ。同じで、正しい位置で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サイズは32MiBです。

それでは、/dev/dm-1で直接同じ内容を読むことができるかどうかを見てみましょう。数学的には、これは以前に512バイトのブロックサイズを使用していたので少しあいまいです... :-/しかし、私は怠惰でMiBを計算して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  -

そこにあります。

関連情報