普通,LinuxでLVMと言うとvgcreate, vgchange, lvcreate... を思い浮かべます。
このような高レベルのLVMも十分高機能ですが,dm(device mapper)という低レベルのLVMもまた,とても強力です。
最近,弊社の仕事で使用する機会があり,おもしろいと思いましたのでご紹介いたします。
仮想マシンを起動後元にもどしたい,という要件があった場合,普通はddで上書きすると思います。
でも,同じような仮想マシン(それぞれ20GBくらい)が10個あって,全部を5分で戻したい!とか言われると結構悩みます。
lvcreateでスナップショットを作れば良さそうですが,戻せる向きが違う(スナップショットは,消すと最新のものだけが残る)のでそれも無理です。
このようなときに,dmsetupなら簡単に実装可能です。
注意:dmsetupの使い方やデバイスを間違えると,システム全体を破壊する可能性があります。
[やりかた]
dmsetup create, dmsetup reload に echo で送っている文字列は,以下の形式です:
「ターゲット」は,アクセスされたときにどのような処理を行なうかを記述します。
snapshot の場合,copy on writeを行なうことができ,テンプレートになるデバイスと変更を書き込むデバイスを指定します。
他にも,crypt とか error といったターゲットがあり,名前のとおり暗号化したり,アクセスするとエラーにしたりすることができます。
組み合わせて,
など,変わったボリュームが作れます。
errorターゲットを活用すると,ファイルシステムやRAIDを復旧する練習に使えそうですね。
ボリューム管理のための,簡潔で強力な仕組みを提供する device mapper の紹介でした(TA)。
このような高レベルのLVMも十分高機能ですが,dm(device mapper)という低レベルのLVMもまた,とても強力です。
最近,弊社の仕事で使用する機会があり,おもしろいと思いましたのでご紹介いたします。
一瞬で元に戻るディスク
仮想マシンを起動後元にもどしたい,という要件があった場合,普通はddで上書きすると思います。
でも,同じような仮想マシン(それぞれ20GBくらい)が10個あって,全部を5分で戻したい!とか言われると結構悩みます。
lvcreateでスナップショットを作れば良さそうですが,戻せる向きが違う(スナップショットは,消すと最新のものだけが残る)のでそれも無理です。
このようなときに,dmsetupなら簡単に実装可能です。
注意:dmsetupの使い方やデバイスを間違えると,システム全体を破壊する可能性があります。
[やりかた]
- 元ネタのディスクを/dev/mapper/testvg-testlvとします。
- 次に,十分大きな(変更を保持できる)大きさのファイルを作ります。この時,dd の seek引数でオフセットを指定すれば,スパースファイルが作成されるので高速です。ここでは,testlv.img とします。
- losetup で, testlv.img をループバックデバイスと結びつけます。/dev/loop0 を使うとします。
- ここで,新しいブロックデバイス(/dev/mapper/testvg-disk)を作成するために dmsetupを使います。 /dev/mapper/testvg-disk に対するすべての書き込みを,testlv.img に行なうようにします。読み出しは,変更されていないセクタは直接/dev/mapper/testvg-lvtestから読み出されます。
echo 0 $(blockdev --getsize /dev/mapper/testvg-testlv) snapshot /dev/mapper/testvg-testlv /dev/loop0 n 64 | dmestup create testvg-disk - 3を繰り替えして,別のファイル(testlv2.img)を/dev/loop1 と結びつけます。
- ディスクを戻すタイミングで,次のコマンドを投入します。このコマンドを投入した時点で,書き込みはtestlv2.imgに行なわれるようになります。
echo 0 $(blockdev --getsize /dev/mapper/testvg-testlv) snapshot /dev/mapper/testvg-testlv /dev/loop1 n 64 | dmestup reload testvg-disk
dmsetup suspend testvg-disk
dmsetup resume testvg-disk - /dev/loop0 と testlv.img が未使用になるので,それぞれ削除・再作成して次の切り替えに備えます。XFSなど,巨大ファイルの扱いが速いファイルシステムを使うと良いです。
dmsetup create, dmsetup reload に echo で送っている文字列は,以下の形式です:
開始セクタ 終了セクタ ターゲット ...
「ターゲット」は,アクセスされたときにどのような処理を行なうかを記述します。
snapshot の場合,copy on writeを行なうことができ,テンプレートになるデバイスと変更を書き込むデバイスを指定します。
他にも,crypt とか error といったターゲットがあり,名前のとおり暗号化したり,アクセスするとエラーにしたりすることができます。
組み合わせて,
- 一部だけがエラーになるディスク
- 前半と後半で暗号化キーの異なるディスク
など,変わったボリュームが作れます。
errorターゲットを活用すると,ファイルシステムやRAIDを復旧する練習に使えそうですね。
ボリューム管理のための,簡潔で強力な仕組みを提供する device mapper の紹介でした(TA)。
