付録A デバイスマッパー

デバイスマッパーとは、ボリューム管理用のフレームワークを提供するカーネルドライバーです。これは論理ボリュームとして使用可能な、マップされたデバイスを作成する一般的な方法を提供します。デバイスマッパーは、ボリュームグループやメタデータ形式をとくに認識する訳ではありません。
デバイスマッパーは多くの高度な技術のための土台を提供します。LVM のほかにも、デバイスマッパーマルチパスと dmraid コマンドがデバイスマッパーを使用します。デバイスマッパーに対するアプリケーションインターフェースは ioctl システムコールになり、ユーザーインターフェースは dmsetup コマンドになります。
LVM 論理ボリュームは、デバイスマッパーを使用してアクティブにされます。それぞれの論理ボリュームは、マッピングされたデバイスに変換され、それぞれのセグメントが、そのデバイスを記述するマッピングテーブルの行に変換されます。デバイスマッパーは、リニアマッピング、ストライプ化マッピング、エラーマッピングを含む各種のマッピングターゲットをサポートします。たとえば、2 つのディスクを 1 つの論理ボリュームとして連結することができます。これは、各ディスクに対してそれぞれ一対のリニアマッピングを 1 つ維持することで行います。LVM がボリュームを作成する場合は、dmsetup コマンドでクエリー可能な、配下のデバイスマッパーデバイスを作成します。マッピングテーブルのデバイスの形式に関する情報は、「デバイステーブルのマッピング」 を参照してください。デバイスをクエリーする dmsetup コマンドの使用方法については、「dmsetup コマンド」 を参照してください。

A.1. デバイステーブルのマッピング

マップされたデバイスは、サポートされているデバイステーブルのマッピングを使用してデバイスの論理セクターの各範囲をマップする方法を指定するテーブルによって定義されます。マップされたデバイスのテーブルは以下の形式の行の一覧から作成されます。
start length mapping [mapping_parameters...]
デバイスマッパーテーブルの最初の行では、start パラメーターはゼロ (0) でなければなりません。1 行にある start + length のパラメーター群は、次の行の start と同じでなければなりません。マッピングテーブルの行に指定されるマッピングパラメーターの種類は、その行に指定される 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 linear device 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
それぞれのストライプについて deviceoffset のパラメーターの 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 mirror log_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 引数はミラーログデバイスに関連付けられた一意の識別子であるため、ログの状態はクラスター全体で維持することができます。
オプションの [no]sync 引数を使用して、ミラーを "in-sync" か "out-of-sync" として指定することができます。block_on_error 引数はミラーに対して、エラーを無視するのではなくエラーに対応するように指示するために使用されます。
#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 つのデバイスマッパーデバイスが使用されます。
  1. linear マッピングを持つデバイス。ソースボリュームの元のマッピングテーブルが含まれます。
  2. ソースボリューム用の COW (copy-on-write) デバイスとして使用される linear マッピングを持つデバイス。書き込みを行うたびに、元のデータは各スナップショットの COW デバイス内に保存され、その可視コンテンツはそのまま維持されます (COW デバイスが満杯になるまで)。
  3. 上記の 1 と 2 を組み合わせた snapshot マッピングを持つデバイス。これは可視スナップショットボリュームです。
  4. 「元」のボリューム (これは、元のソースボリュームで使用されるデバイス番号を使用します)。このテーブルはデバイス #1 からの「snapshot-origin」マッピングに置き換えられます。
これらのデバイスを作成するには固定された命名スキームが使用されます。たとえば、以下のようなコマンドを使用して 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-origin origin
start
仮想デバイス内の始点ブロック
length
このセグメントの長さ
origin
スナップショットのベースボリューム
snapshot-origin には通常、それをベースにした1つまたは複数のスナップショットがあります。読み取りは直接バッキングデバイスにマップされます。それぞれの書き込みには、元のデータが各スナップショットの COW デバイス内に保存されて、COW デバイスが満杯になるまでその可視コンテンツをそのまま維持します。
snapshot ターゲットの形式は以下のようになります。
start length snapshot origin COW-device P|N chunksize
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 で、COW デバイスが 254:12 の snapshot ターゲットを示しています。このスナップショットデバイスは再起動後にも永続し、COW デバイス上に保存されるデータのチャンクサイズは 16 セクターです。
0 2097152 snapshot 254:11 254:12 P 16

A.1.5. エラーマッピングターゲット

エラーマッピングターゲットを使用すると、マッピングされたセクターへの I/O オペレーションはいずれも失敗します。
エラーマッピングターゲットはテスト用に使用できます。障害時にデバイスがどのように動作するかをテストするには、1 つのデバイスの中に不良セクターがあるデバイスマッピングを 1 つ作成するか、またはミラーレッグをスワップアウトして、そのレッグをエラーターゲットに置き換えます。
エラーターゲットは、実際のデバイス上でのタイムアウトおよび再試行を回避する方法として、障害のあるデバイスの代わりに使用することができます。エラーターゲットは、障害時に LVM メタデータを再配置している間に中間ターゲットとして機能します。
error マッピングターゲットは、startlength のパラメーター以外には追加のパラメーターを取りません。
以下の例は、error ターゲットを示しています。
0 65536 error

A.1.6. ゼロマッピングターゲット

zero マッピングターゲットは、/dev/zero と同等のブロックデバイスです。このマッピングの読み取り操作はゼロのブロックを返します。このマッピングに書き込まれたデータは破棄されますが、書き込みは正常に実行されます。zero マッピングターゲットは startlength パラメーター以外には追加のパラメーターは取りません。
以下の例は、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 となります。現在、multipath.conf ファイルの features 属性で設定できる queue_if_no_path というサポートされている機能が 1 つあります。これは、利用可能なパスがない場合には、マルチパス化したデバイスが I/O 操作をキューに登録するよう現在設定されていることを示します。
以下の例では、multipath.conf ファイルの no_path_retry 属性が設定されています。これは、パスを使用する試行が所定回数行われた後にすべてのパスが失敗 (failed) とマークされるまで 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「マルチパスマッピングターゲット」 は、2つのパスグループを持つマルチパスターゲットの形式を示しています。
マルチパスマッピングターゲット

図A.1 マルチパスマッピングターゲット

以下の例は、同じマルチパスデバイスのための純粋なフェイルオーバーターゲットの定義を示しています。このターゲットには、4 つのパスグループがあります。マルチパス化したデバイスが 1 度に 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
マルチパス化の詳細は、『DM マルチパス』 を参照してください。

A.1.8. 暗号マッピングターゲット

crypt ターゲットは、指定したデバイスを経由してデータパッシングを暗号化します。これは、kernel Crypto API を使用します。
crypt ターゲットの形式は以下のようになります。
start length crypt cipher 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 です。-plainivmode は、セクター番号 (および IV オフセット) を IV として使用します。-essivivmode はウォーターマークの弱点を回避するための機能強化です。
key
暗号化キー (16 進数で指定)
IV-offset
初期ベクトル (IV) オフセット
device
ブロックデバイス。ファイルシステム内のデバイス名で参照、または major:minor の形式のメジャー番号とマイナー番号で参照されます。
offset
デバイス上のマッピングの始点オフセット
以下に crypt ターゲットの例を示します。
0 2097152 crypt aes-plain 0123456789abcdef0123456789abcdef 0 /dev/hda 0

このページには機械翻訳が使用されている場合があります (詳細はこちら)。