Ubuntu 18.04では、次のようなRAID 1アレイを作成します。
mdadm --create /dev/md/myarray --level=1 --run --raid-devices=2 /dev/sdc /dev/sdd
次に、mdadm --detail --scan /dev/md/myarray
の出力を/etc/mdadm/mdadm.confに追加します。次のようになります。
ARRAY /dev/md/myarray metadata=1.2 name=MYHOSTNAME:myarray UUID=...
デバイス名の前に「MYHOSTNAME:」が付いています。この時点でシンボリックリンク/dev/md/myarray
はまだ存在していますが、最初に再起動した後は/dev/md/MYHOSTNAME:myarray
になり、問題が発生します。さらに悪いことに、これはsomeマシンでのみ発生します-他のマシンではシンボリックリンクは/dev/md/myarray
のままです。すべてがUbuntu 18.04を実行しているので、理由はわかりません。
MDデバイスの一貫したデバイスパス、理想的には指定したもの( "/ dev/md/myarray")を取得するにはどうすればよいですか? mdadm.confを編集してホスト名を削除しようとしましたが、次の行でも
ARRAY /dev/md/myarray metadata=1.2 name=myarray UUID=...
シンボリックリンクは、再起動時にも変更されます-ホスト名を「必要とする」マシン上。私はまた逆の方法で両方の場所にホスト名を追加してみました:
ARRAY /dev/md/HOSTNAME:myarray metadata=1.2 name=HOSTNAME:myarray UUID=...
しかし、ホスト名を「望まない」マシンでも、再起動後、シンボリックリンクは/ dev/md/myarrayになります。
数値デバイス(/ dev/md127)も使用できません。このように作成された複数のMDデバイスがある場合、md126とmd127も交互に使用される傾向があるためです。狂ってる!
MDデバイスの一貫したデバイスパス、理想的には指定したもの( "/ dev/md/myarray")を取得するにはどうすればよいですか?
_mdadm --create /dev/md/foobar ...
_の後、_mdadm --examine
_または_mdadm --detail
_で確認する必要があるため、hostname
とname
の両方がmdadmメタデータに格納されます。
_# mdadm --detail /dev/md/foobar
Name : ALU:foobar (local to Host ALU)
_
ALU
はたまたま私のArchLinuxマシンのホスト名です:
_# hostname
ALU
_
作成時に保存するホストを指定できます。
_# mdadm --create /dev/md/foobar --homehost=barfoo
# mdadm --detail /dev/md/foobar
Name : barfoo:foobar
_
...しかし、だれもそうすることを覚えていないのが普通です。
そして、それはすでに問題の始まりです...あなたはいくつかのLiveCDまたはその他からRAIDアレイを作成したかもしれません、そしてその環境のホスト名はメインのインストールと全く一致しませんでした。そして、メタデータは完全に無関係なホスト名を保存します。
同様に、すべてを正しく設定したが、RAIDで問題が発生し、レスキューシステムを起動して確認した場合でも、ホスト名との不一致があります。
または逆に、2台の独立したシステムに同じホスト名を使用してドライブを移行した場合でも、ホスト名が一致しない場合があります。次に、エイリアンの配列が元の配列の名前を引き継ぎます...
現在、メタデータは、後で_mdadm --assemble --update=homehost
_または_--update=name
_を使用して変更することもできます。これは、問題に対処する1つの方法です。正しく設定する必要がありますが、(何らかの理由で)メタデータを16進編集できないため、変更するのは困難です。これは、アセンブリ時にのみ実行できます。
別の方法は、システムhostname
を無視して、代わりにアセンブリで_--homehost
_を指定するか、_mdadm.conf
_でHOMEHOST
を設定することです。これについては、mdadm.confのマンページで詳しく説明しています。
[〜#〜]ホームホスト[〜#〜]
homehost行は、mdadmの--homehost =オプションのデフォルト値を示しています。通常、行には他に1つのWordしかありません。これは、ホスト名、または_<system>
_、_<none>
_、_<ignore>
_のいずれかの特殊な単語のいずれかである必要があります。 _<system>
_が指定されている場合、gethostname(2)システムコールを使用してホスト名を取得します。これがデフォルトです。
[...]
アレイが作成されると、このホスト名はメタデータに保存されます。自動アセンブリを使用して配列をアセンブルすると、メタデータに正しいホームホスト名を記録しない配列は、「外部」名を使用してアセンブルされます。 「外来」の名前は、可能なローカル名と区別するために、常にアンダースコアで始まる数字列で終わります。例えば/ dev/md/1_1または/ dev/md/home_0。
したがって、_HOMEHOST ALU
_(私の場合)、または_HOMEHOST <ignore>
_でより一般的な_HOMEHOST <none>
_(または_mdadm.conf
_)を設定することができます。ただし、その_mdadm.conf
_が存在する場合にのみ機能します。また、ignoreを設定してから別のマシンからアレイを接続すると、名前の競合が発生する可能性があります。
したがって、メタデータとmdadm.confでホスト名を正しく設定し、それを無視しないことをお勧めします。さらに、Assemblyの前にinitramfsで実際のホスト名を設定することをお勧めしますが、実践するのは難しい場合があります。
私の個人的な好みは、古典的な数値スタイルに固執することです。 UUIDのみで識別します。
_ARRAY /dev/md1 UUID=8fe790ca:f3fa3388:4ae125b6:2c3a5d44
ARRAY /dev/md2 UUID=f14bef5b:a5356e51:25fde128:09983091
ARRAY /dev/md3 UUID=0639c68d:4c844bb1:5c02b33e:00ab4a93
_
これも一貫しています(ただし、この方法で作成され、メタデータに適切に設定されているかどうかにも依存します。それ以外の場合は、_--update
_にする必要がある場合もあります)。そして、与えられたUUIDと一致しないエイリアン配列は、最終的に_/dev/md127+
_になるはずです。
結局のところ、何をしていても、_/dev/mdX
_文字に盲目的に依存しないのと同じように、_/dev/md/name
_または_/dev/sdX
_ sに盲目的に依存するべきではありません。常にファイルシステムのUUIDを使用して、これらのアレイにあるものを識別します。
名前が予期せず変更されるコーナーケースが多すぎるため、せいぜい、これはオリエンテーションの助けになるか、またはシステム管理者へのヒントになる可能性があります。それはすべての問題に対する答えではありません。