2010年8月12日木曜日

RHEL Device Mapper と LVM


このエントリーをはてなブックマークに追加


RHELのFC/iSCSIのマルチパスで使用するDevice Mapper Multipath の Device Mapper って実は結構、深い機能を提供している。

 参考>> RedHat における iSCSI 設定とマルチパス
 参考>> マルチパスI/Oの設定(RedHat)

LinuxのLVMも、Device Mapperのラッパーとして実装されている。そんなDevice Mapperについての話。


Device Mapperってのは何をしているのかと言うと、「あるデバイス(単体でも複数でも)のブロックを、別のデバイスとして見せる」という、マッピング機能を提供している(そのまんま

ディスクを例にあげると、ブロックデバイスである/dev/sda の 何ブロック目から、指定のサイズを切り出して、仮想の別ブロックデバイスとして作成することになる。

設定自体は非常にシンプルで、指定する項目は 

例)0 600000 linear 8 4 /dev/sda1 0
 0:開始ブロック
 60000:サイズ
 linear:見せ方
 8 4 /dev/sda1:切り出し元のブロックデバイス
 0: その他オプション

このくらいしかない。LVMは裏でこのデバイスのマッピングを駆使して実現されている。LVMがセットアップされた環境で以下のコマンドを打つと、Device Mapperでどう実現されているのかが確認できる。

# dmsetup table
# dmsetup ls
# dmsetup ls --tree

詳しいオプションはmanページ参照

「見せ方」の部分でDevice Mapperの挙動が変化する。代表的なのは以下。

 linear: 切り出した領域を連結する
 stripe: I/Oを二つに分ける
 mirror: I/Oを複製
 snapshot: 変更前の内容を別ブロックへコピー
 multipath: 複数のデバイスを重ね合わせる
 zero: アクセスされるとゼロを返すデバイス(/dev/zeroのブロックデバイス版)を作成する
 error: アクセスされるとエラーを返すデバイス


中でも面白いのが、zeroデバイスで、これを使うとテスト的に巨大な仮想領域を作ることができる。

 (1)巨大なzeroデバイスを作成する(仮に1000TB
 (2)その領域に対するスナップショットを設定する(1GBのCoW領域

この操作をすると見た目は1000TBの容量を持った、デバイスを作成できる(実際に書き込める容量は1GB)

ちょっと前まではこの操作は手動でdmsetupを実行する必要があったが、今は

 lvcreate --virtualsize xxx で指定できる。


UDEVなんかと組み合わせて使うと、いろいろ応用範囲が広がりそうで面白そう。

参考
>> device-mapper 解説 (PDF)