付録A デバイスマッパー
デバイスマッパーとは、ボリューム管理用のフレームワークを提供するカーネル ドライバーです。これは論理ボリュームとして使用可能なマップされたデバイスを作成する為の汎用手段を提供します。ボリュームグループやメタデータ形式を特に認識するものではありません。
デバイスマッパーは多くの高度技術の為の土台を提供します。LVM の他にも、 デバイスマッパーマルチパスと
dmraid
コマンドが デバイスマッパーを使用します。デバイスマッパーに対するアプリケーションインターフェイスは ioctl
システムコールです。ユーザーインターフェイスは dmsetup
コマンドです。
LVM logical volumes are activated using the Device Mapper. Each logical volume is translated into a mapped device. Each segment translates into a line in the mapping table that describes the device. The Device Mapper supports a variety of mapping targets, including linear mapping, striped mapping, and error mapping. So, for example, two disks may be concatenated into one logical volume with a pair of linear mappings, one for each disk. When LVM2 creates a volume, it creates an underlying device-mapper device that can be queried with the
dmsetup
command. For information about the format of devices in a mapping table, see 「デバイス表マッピング」. For information about using the dmsetup
command to query a device, see 「dmsetup コマンド」.
A.1. デバイス表マッピング
マップ済デバイスとは、サポートされているデバイス表マッピングを使用して デバイスの論理セクターの各範囲をマップする方法を指定する表によって 決定されます。マップ済デバイスの為の表は以下の形式の行の一覧で構成 されます:
start length mapping
[mapping_parameters...
]
デバイスマッパー表の最初の行では、
start
パラメータが ゼロ(0)になる必要があります。1つの行にある start
+ length
のパラメータ群は、次の行の start
と 同じでなければなりません。マッピング表の1行に指定されるマッピングパラメータの種類は、その行に 指定される mapping
タイプによって決まります。
デバイスマッパー内のサイズは常にセクター内で指定されます (512 バイト)。
1つのデバイスがデバイスマッパー内でマッピングパラメータとして指定されている時、 そのデバイスはファイルシステム内のデバイス名で参照されるか (例えば、
/dev/hda
)、 あるいは、major
:minor
の形式で メジャーとマイナー番号で参照されます。major:minor の形式はパス名ルックアップを回避するため より好まれます。
デバイスのマッピング表の例を以下に示します。この表には4つのリニアターゲットが あります:
0 35258368 linear 8:48 65920 35258368 35258368 linear 8:32 65920 70516736 17694720 linear 8:16 17694976 88211456 17694720 linear 8:16 256
各行の最初の2つのパラメータはセグメントの始点ブロックとセグメントの長さです。 次のキーワードはマッピングターゲットであり、この例内の全てのケースで
linear
となります。行のその他の部分は linear
ターゲットのパラメータで構成されます。
以下のサブセクションでは以下のマッピングの形式を説明しています:
- linear
- striped
- mirror
- snapshot and snapshot-origin
- error
- zero
- multipath
- crypt
A.1.1. リニアマッピングターゲット
リニアマッピングターゲットは連続範囲のブロックを別のブロックデバイスに マップします。リニアターゲットの形式は以下のようになります:
start length
lineardevice offset
start
- 仮想デバイス内の始点ブロック
length
- このセグメントの長さ
device
- ブロックデバイス。ファイルシステム内のデバイス名で参照、又は
major
:minor
の形式のメジャーとマイナー番号で参照されます。 offset
- デバイス上のマッピングの始点オフセット
以下の例では、仮想デバイスの始点ブロックが 0 、セグメントの長さが 1638400、メジャー/ マイナー番号ペアが 8:2、デバイス用の始点オフセットが 41146992 であるリニアターゲットを 示しています。
0 16384000 linear 8:2 41156992
以下の例では、デバイスパラメータがデバイス
/dev/hda
として指定されたリニアターゲットを示しています。
0 20971520 linear /dev/hda 384
A.1.2. ストライプ化マッピングターゲット
ストライプ化マッピングターゲットは物理デバイス全域でストライプ化をサポート します。これは、ストライプの数量、ストライプのチャンクサイズ、そしてデバイス名と セクターのペアのリストを引数として取ります。ストライプ化ターゲットの形式は 以下のようになります:
start length
striped#stripes chunk_size device1 offset1 ... deviceN offsetN
それぞれのストライプには、
device
と offset
のパラメータの1つのセットがあります。
start
- 仮想デバイス内の始点ブロック
length
- このセグメントの長さ
#stripes
- 仮想デバイスのストライプの数量
chunk_size
- 次にスイッチするまでに各ストライプに書き込まれるセクターの数量。2の乗数であり 最低でもカーネルページサイズの大きさでなければなりません。
device
- ブロックデバイス。ファイルシステム内のデバイス名で参照、又は
major
:minor
の形式でメジャーとマイナーの番号で参照されます。 offset
- デバイス上のマッピングの始点オフセット
以下の例では、3つのストライプと、チャンクサイズ 128 を持つストライプ化ターゲットを 示します:
0 73728 striped 3 128 8:9 384 8:8 384 8:7 9789824
- 0
- 仮想デバイス内の始点ブロック
- 73728
- このセグメントの長さ
- striped 3 128
- チャンクサイズ 128 ブロックを持つ3つのデバイスに渡るストライプ
- 8:9
- 最初のデバイスのメジャーとマイナー番号
- 384
- 最初のデバイス上のマッピングの始点オフセット
- 8:8
- 2つめのデバイスのメジャーとマイナー番号
- 384
- 2つめのデバイスのマッピングの始点オフセット
- 8:7
- 3つめのデバイスのメジャーとマイナー番号
- 9789824
- 3つめのデバイス上のマッピングの始点オフセット
以下の例では、2つのストライプ、256 KiB のチャンク、及びメジャーとマイナー番号の 代わりにファイルシステム内のデバイス名で指定されたデバイスパラメータを持つ ストライプ化ターゲットを示します。
0 65536 striped 2 512 /dev/hda 0 /dev/hdb 0
A.1.3. ミラーマッピングターゲット
ミラーマッピングターゲットはミラー化した論理デバイスのマッピングを サポートします。ミラー化ターゲットの形式は次のようになります:
start length
mirrorlog_type #logargs logarg1 ... logargN #devs device1 offset1 ... deviceN offsetN
start
- 仮想デバイス内の始点ブロック
length
- このセグメントの長さ
log_type
- 可能なログタイプとその引数は以下のようになります:
core
- ミラーはローカルであり、ミラーログはコアメモリーに維持されます。このログ タイプは 1 - 3 の引数を取ります:regionsize [[
no
]sync
] [block_on_error
] disk
- ミラーはローカルであり、ミラーログはディスクで維持されます。ログタイプは 2 - 4 の引数を取ります:logdevice regionsize [[
no
]sync
] [block_on_error
] clustered_core
- ミラーはクラスター化であり、ミラーログはコアメモリーで維持されます。この ログタイプは 2 - 4 の引数を取ります:regionsize UUID [[
no
]sync
] [block_on_error
] clustered_disk
- ミラーはクラスタ化であり、ミラーログはディスクで維持されます。このログ タイプは 3 - 5 の引数を取ります:logdevice regionsize UUID [[
no
]sync
] [block_on_error
]
LVM は、どの領域がミラー(ミラー群)と同期しているかを記録するのに使用する 小さなログを維持します。regionsize 引数は それらの領域のサイズを指定します。クラスタ化した環境では、UUID 引数はミラーデバイスと 関連を持つ特有の識別子であるため、ログの状態はクラスタ全域で維持できます。The optional[no]sync
argument can be used to specify the mirror as "in-sync" or "out-of-sync". Theblock_on_error
argument is used to tell the mirror to respond to errors rather than ignoring them. #log_args
- マッピング内で指定されるログ引数の数量
logargs
- ミラー用のログ引数。用意されるログ引数の数量は
#log-args
パラメータで指定されて、有効なログ引数はlog_type
パラメータで 決定されます。 #devs
- ミラー内の脚の数量。デバイスとオフセットはそれぞれの脚用に 指定されます。
device
- それぞれの脚用のブロックデバイス。ファイルシステム内のデバイス名で参照、 又は
major
:minor
の 形式でメジャーとマイナーの番号で参照。ブロックデバイスとオフセットはそれぞれの ミラー脚用に指定されます。#devs
パラメータで 示されます。 offset
- デバイス上のマッピングの始点オフセット。ブロックデバイスとオフセットは
#devs
で示されるようにそれぞれのミラー脚用に 指定されます。
以下の例では、ミラーログをディスク上に持つクラスタ化ミラー用の ミラーマッピングターゲットを示します。
0 52428800 mirror clustered_disk 4 253:2 1024 UUID block_on_error 3 253:3 0 253:4 0 253:5 0
- 0
- 仮想デバイス内の始点ブロック
- 52428800
- このセグメントの長さ
- mirror clustered_disk
- ミラーがクラスタ化であり、ミラーログがディスク上に維持されていることを 指定するログタイプを持つミラーターゲット
- 4
- 4つのミラーログ引数が続きます
- 253:2
- ログデバイスのメジャー/マイナー番号
- 1024
- 同期しているものの記録を保持するためのミラーログの領域サイズ
UUID
- クラスタ全域でログ情報を維持するためのミラーログデバイスの UUID
block_on_error
- ミラーはエラーに対応する必要があります
- 3
- ミラー内の脚の数量
- 253:3 0 253:4 0 253:5 0
- ミラーの各脚を構成しているデバイス用のメジャーとマイナー番号及びオフセット
A.1.4. スナップショットとスナップショットオリジンのマッピングターゲット
ボリュームの最初の LVM スナップショットを作成する場合に、4つのデバイス マッパーデバイスが使用されます:
linear
マッピングを持つデバイスが1つ。ソースボリュームのオリジナル マッピング表を持っています。- ソースボリュームの為に COW (copy-on-write)デバイスとして使用される
linear
マッピングを持つデバイス1つ。それぞれの書き込み用に オリジナルデータは各スナップショットの COW デバイス内に保存されてその 可視コンテンツを不変のまま維持します(COW デバイスが満杯になるまで) - #1 と #2 を組み合わせた
snapshot
マッピングを持つデバイス1つ。 可視のスナップショットボリュームです。 - The "original" volume (which uses the device number used by the original source volume), whose table is replaced by a "snapshot-origin" mapping from device #1.
これらのデバイスを作成するために固定した命名スキームが使用されます。例えば以下のような コマンドを使用して
base
と言う名前の LVM ボリュームを作成し、 snap
と言う名前のスナップショットをそのボリューム上に作成 することができます。
#lvcreate -L 1G -n base volumeGroup
#lvcreate -L 100M --snapshot -n snap volumeGroup/base
これは 4つのデバイスを生み出します。それは以下のコマンドで表示できます:
#dmsetup table|grep volumeGroup
volumeGroup-base-real: 0 2097152 linear 8:19 384 volumeGroup-snap-cow: 0 204800 linear 8:19 2097536 volumeGroup-snap: 0 2097152 snapshot 254:11 254:12 P 16 volumeGroup-base: 0 2097152 snapshot-origin 254:11 #ls -lL /dev/mapper/volumeGroup-*
brw------- 1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real brw------- 1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow brw------- 1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap brw------- 1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base
snapshot-origin
ターゲット用の形式は以下のようになります:
start length
snapshot-originorigin
start
- 仮想デバイス内の始点ブロック
length
- このセグメントの長さ
origin
- スナップショットのベースボリューム
snapshot-origin
は通常、それをベースにした1つ、又は複数の スナップショットを持っています。読み込みは直接バックアップデバイスに マップされます。それぞれの書き込みには、オリジナルデータが各スナップショットの COW デバイス内に保存されて、COW デバイスが満杯になるまでその可視コンテンツを 不変のまま維持します。
snapshot
ターゲットの形式は以下のようになります:
start length
snapshotorigin COW-device
P|Nchunksize
start
- 仮想デバイス内の始点ブロック
length
- このセグメントの長さ
origin
- スナップショットのベースボリューム
COW-device
- データの変化したチャンクが保存されるデバイス
- P|N
- P (Persistent) または N (Not persistent) ; スナップショットが再起動後に維持 されるかどうかを示します。一時的なスナップショット (N) には、多くの メタデータをディスク上に保存できません。それはカーネルによって メモリー内に保存できます。
chunksize
- COW デバイスに保存されるデータの変更したチャンクのセクターサイズ
次の例では、254:11 であるオリジンデバイスを持つ
snapshot-origin
ターゲットを示しています。
0 2097152 snapshot-origin 254:11
以下の例では、254:11 のオリジンデバイスと 254:12 の COW デバイスを持つ
snapshot
ターゲットを示しています。このスナップショット デバイスは再起動後にも永続して、COW デバイス上に保存されるデータの チャンクサイズは 16 セクターです。
0 2097152 snapshot 254:11 254:12 P 16
A.1.5. エラーマッピングターゲット
エラーマッピングターゲットでは、マップ化したセクターへの I/O オペレーションは いずれも失敗します。
エラーマッピングターゲットはテスト用に使用できます。障害時にデバイスが どのように動作するかをテストするには、1つのデバイスの中に悪いセクターを 持つデバイスマッピングを1つ作成するか、あるいは、ミラーの脚を取り出して それをエラーターゲットを持つ脚で入れ替えます。
エラーターゲットは障害のあるデバイスの場所で、タイムアウトを回避する方法として 実際のデバイス上で再試行をするために使用することができます。これは、障害時に LVM メタデータを再構成している間に中間的ターゲットとしての役目を果たします。
error
マッピングターゲットは、start と length のパラメータ以外には他のパラメータは 採りません。
以下の例では、
error
ターゲットを示しています。
0 65536 error
A.1.6. ゼロマッピングターゲット
zero
マッピングターゲットは、/dev/zero
と 同等のブロックデバイスです。このマッピングの読み込み操作はゼロのブロックを返します。 このマッピングに書き込まれたデータは破棄されますが、書き込みは成功します。zero
マッピングターゲットは start と length パラメータ以外のパラメータは受け付けません。
以下の例では、16Tb デバイス用の
zero
ターゲットを示して います。
0 65536 zero
A.1.7. マルチパスマッピングターゲット
マルチパスマッピングターゲットはマルチパス化したデバイスのマッピングをサポート します。
multipath
ターゲットの形式は以下のようになります:
start length
multipath
#features [feature1 ... featureN] #handlerargs [handlerarg1 ... handlerargN] #pathgroups pathgroup pathgroupargs1 ... pathgroupargsN
それぞれのパスグループ用に1つのセットの
pathgroupargs
パラメータ群があります。
start
- 仮想デバイス内の始点ブロック
length
- このセグメントの長さ
#features
- マルチパス機能の数量です。それらの機能がその後に付きます。このパラメータがゼロ であれば、
feature
パラメータは存在せず、次の デバイスマッピングパラメータは#handlerargs
となります。 現在、1つだけサポートされているマルチパス機能があります。queue_if_no_path
です。 これは、現在パスがない場合にこのマルチパス化したデバイスが I/O オペレーションをキューする ようにセットすると言う意味です。例えば、multipath.conf
ファイル内のno_path_retry
オプションが、指定した回数のパス使用試行の後に全てのパスが失敗とマークされる時までのみ I/O オペレーションをキューするようにセットされている場合には、そのマッピングは、全ての パスチェッカーがチェックに指定回数失敗するまで、以下のように見えます。0 71014400 multipath 1 queue_if_no_path 0 2 1 round-robin 0 2 1 66:128 \ 1000 65:64 1000 round-robin 0 2 1 8:0 1000 67:192 1000
全てのパスチェッカーがチェックに指定回数失敗した後には、マッピングは 以下のように見えるでしょう。0 71014400 multipath 0 0 2 1 round-robin 0 2 1 66:128 1000 65:64 1000 \ round-robin 0 2 1 8:0 1000 67:192 1000
#handlerargs
- ハードウェアハンドラー引数の数量です。それらの引数がその後に付きます。 ハードウェアハンドラーは、パスグループを切り替える時、又は I/O エラーを 処理する時に、ハードウェア特有のアクションを実行するために使用されるモジュールを 指定します。これがゼロにセットしてある場合は、次のパラメータは
#pathgroups
となります。 #pathgroups
- パスグループの数量です。バスグループとは、マルチパス化したデバイスがロードバランスを 行うパスのセットのことです。それぞれのパスグループに1つのセットの
pathgroupargs
パラメータがあります。 pathgroup
- 試行する次のパスグループ
pathgroupsargs
- 各パスグループは以下の引数で構成されます:
pathselector #selectorargs #paths #pathargs device1 ioreqs1 ... deviceN ioreqsN
パスグループ内の各パス用に1つのセットのパス引数群があります。pathselector
- 次の I/O オペレーションで使用するのにこのパスグループ内でのパスを決定するために 使用するアルゴリズムを指定します。
#selectorargs
- マルチパスマッピング内のこの引数に従うパスセレクタ引数の数量。現在、この 引数の値は常に 0 (ゼロ)です。
#paths
- このパスグループ内のパスの数量
#pathargs
- このグループ内の各パス用に指定されたパス引数の数量。現在、この数は 常に 1 で
ioreqs
引数です。 device
- パスのブロックデバイス数。
major
:minor
の形式で、メジャーとマイナー番号によって参照されます。 ioreqs
- 現在のグループ内の次のパスへ切り替えるまでのこのパスへ巡回する I/O 要求の数。
図A.1「マルチパスマッピングターゲット」 shows the format of a multipath target with two path groups.
図A.1 マルチパスマッピングターゲット
以下の例では、同じマルチパスデバイスのための純粋なフェイルオーバー ターゲットの定義を示しています。このターゲットでは、4つのパスグループが あります。マルチパス化したデバイスが一度に1つのパスのみを使用するように パスグループ毎に1つのパスのみが開いています。
0 71014400 multipath 0 0 4 1 round-robin 0 1 1 66:112 1000 \ round-robin 0 1 1 67:176 1000 round-robin 0 1 1 68:240 1000 \ round-robin 0 1 1 65:48 1000
次の例では、同じマルチパス化したデバイスのための完全に拡散した (multibus) ターゲットを示しています。このターゲットでは、すべてのパスを含む1つのパス グループのみが存在しています。このセットアップでは、マルチパスはパスの 全てに渡って均等に負荷を拡散します。
0 71014400 multipath 0 0 1 1 round-robin 0 4 1 66:112 1000 \ 67:176 1000 68:240 1000 65:48 1000
マルチパッシングに関する詳細情報には、『デバイスマッパーマルチパスの 使用法(Using Device Mapper Multipath)』 をご覧下さい
A.1.8. crypt マッピングターゲット
crypt
ターゲットは、指定したデバイスを経由して データパッシングを暗号化します。これは、kernel Crypto API を使用します。
crypt
ターゲットの形式は以下のようになります:
start length
cryptcipher key IV-offset device offset
start
- 仮想デバイス内の始点ブロック
length
- このセグメントの長さ
cipher
- Cipher は、
cipher[-chainmode]-ivmode[:iv options]
で構成されます。cipher
- 利用できる Cipher は
/proc/crypto
(例えば、aes
)内に一覧表示してあります。 chainmode
- 常に
cbc
を使用します。ebc
は 使用しません。これは初期ベクター(IV) を使いません。 ivmode[:iv options]
- IV は暗号化を変化させるために使用されるイニシャルベクターです。IV モードは
plain
かessiv:hash
です。plain
のivmode
は、セクター番号(及び IV オフセット)を IV として 使います。-essiv
のivmode
は ウォーターマークの弱点を避けるようにした強化です。
key
- 暗号化キー、16進法で供給
IV-offset
- 初期ベクター(IV) オフセット
device
- ブロックデバイス。ファイルシステム内のデバイス名で参照、又は
major
:minor
の形式のメジャーとマイナー番号で参照されます。 offset
- デバイス上のマッピングの始点オフセット
以下に
crypt
ターゲットの例を示します。
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0