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)