RAID(mdadm)-ドライブのサイズが一致しない場合はどうなりますか?


15

質問1-「小さいディスクを使用するだけです」と答える前に、すぐに私に聞いてください。3TB WD Redのサイズは3001 GBです。ドライブの100%にまたがるsdb1とsdc1のmdadmを介してミラーをセットアップしたとしましょう。しかし、突然、ドライブの1つが故障します。代替品は3TBで、重量は3000 GBです。アレイに現在存在するドライブより小さいドライブを挿入するとどうなりますか?3000対3001を使用する新しいアレイでは、3000になるようにアレイが構築されます。しかし、先ほど言ったように、3001の現在のアレイはどうでしょうか。再構築時にサイズが3000 GBになるように再構築されますか?

質問2-既存の3001 GBのアレイに3000 GBを追加できず、単純に3000に縮小した場合... 3001を少し縮小できますか?

質問3-または、より良いアイデア。3TBドライブを2999 GBに縮小した場合はどうなりますか。ドライブが1 MB、1バイト、10 KB短いかどうかは関係ありません。常に2999 GBの「より小さい」ドライブを選択します。

回答:


28

間違ってこの答えに出会いましたが、誰かが興味を持っている場合のために、実験によって裏付けられた答えがあります。

ショートバージョン

ボーナス質問:md(4)サイズが異なるブロックデバイスからRAIDアレイを作成できますか?はい。ただし、RAIDアレイは最小のブロックデバイスのサイズになります(さらに、独自のハウスキーピングのためのオーバーヘッドもあります)。デバイスのサイズが互いに1%以内にない場合、警告が表示されます。

質問1:md(4)現在の最小メンバーよりも小さいデバイスを既存のRAIDアレイに追加できますか?いいえ、ごめんなさい。mdadmあなたのデータを保護するためにそれを行うことを拒否します。

質問2:既存のmd配列のサイズを変更できますか?はい(mdadmマンプを読んでください!)、しかし努力する価値はないかもしれません。すべてをバックアップしてから、RAIDデバイスの内容のサイズを変更してから、デバイス自体のサイズを変更する必要があります。これらはすべて、エラー、誤算、その他のデータの損失を招く傾向があります。 。

リスクと労力の価値はありません。新しい空のディスクがある場合、サイズを変更する方法と、すべてのデータのコピーを常に1〜2個保持する方法を次に示します(2ディスクRAID1がある場合)。

  1. その上に新しいmd(4)アレイを作成します(1つのディスクが欠落しています)。
  2. アレイの内容の構造を再作成します(暗号、LVM、パーティションテーブル、それらの任意の組み合わせ、ボートに浮かぶものは何でも)。
  3. 既存のディスクから新しいディスクにデータをコピーします。
  4. 新しいディスクを使用して再起動します。
  5. 古いディスクのパーティションテーブルを消去します(またはmd(4)スーパーブロックをゼロにします)。必要に応じて、新しいディスク上のスキームに一致するように必要なパーティションを作成します。
  6. 古いディスクを新しいアレイに追加します。
  7. アレイメンバーが同期するのを待ちます。コーヒーを飲みます。ラテンアメリカに飛んで、そのためにあなた自身のコーヒー豆を選んでください。:)(ラテンアメリカに住んでいる場合は、代わりにアフリカに飛ぶ)。

注:はい、これは彼の答えで説明した0xC0000022Lと同じ手法です。

質問3.ドライブが1G短い場合はどうなりますか?:)心配しないでください。交換用ドライブが大きくなる可能性があります。実際には、それは上記のような戦略に支払う 1に障害が発生した時はいつでも安く、より大きなドライブを取得するために(または安価なアップグレード用)。プログレッシブアップグレードを取得できます。

実験的証明

実験セットアップ

まず、いくつかのブロックデバイスを偽造しましょう。私たちは、使用します/tmp/sdx/tmp/sdy(それぞれ100M)、および/tmp/sdz(99M)。

cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99  # Here's a smaller one!
sudo losetup -f sdz

:3つの3つのループバックブロックデバイスとしてファイルをバックアップこのセット/dev/loop0/dev/loop1および/dev/loop2、マッピングsdxsdyおよびsdzそれぞれ。サイズを確認しましょう:

sudo grep loop[012] /proc/partitions
   7        0     102400 loop0
   7        1     102400 loop1
   7        2     101376 loop2

予想どおり、100M(102400 KiB = 100 MiB)の2つのループデバイスと99M(正確に99×1024 1Kブロック)の1つのループデバイスがあります。

同一サイズのデバイスからRAIDアレイを作成する

ここに行く:

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.

サイズを確認してください:

sudo grep md100 /proc/partitions
   9      100     102272 md100

これは、precicely我々が期待するもの:mdadmのマニュアルで1つの外観はバージョン1.2が128Kを取るメタデータということを思い出させてくれる:128 + = 102400. 102272今度は、第二の実験の準備のためにそれを破壊しましょう。

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1

不均等なサイズのデバイスからRAIDアレイを作成する

今回は、小さなブロックのデバイスを使用します。

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.

さて、警告を受けましたが、配列は作成されました。サイズを確認しましょう:

sudo grep md100 /proc/partitions
   9      100     101248 md100

ここで取得できるのは101,248ブロックです。101248 + 128 = 101376 = 99×1024。使用可能なスペースは、最小のデバイスのスペース(および128K RAIDメタデータ)です。私たちの最後の実験のために、すべてをもう一度ダウンさせましょう。

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2

そして最後に:実行中のアレイに小さなデバイスを追加する

最初に、100Mディスクの1つだけでRAID1アレイを作成しましょう。アレイは劣化しますが、実際には気にしません。開始された配列が必要です。missingキーワードは、「私は、まだあなたのためのデバイスを持っている今、彼のアレイを起動して、私は後で1を追加しますしないでください」と言いプレースホルダです。

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing

再度、サイズを確認しましょう:

sudo grep md100 /proc/partitions
   9      100     102272 md100

案の定、それは102400ブロックの128K不足です。小さいディスクを追加します。

sudo mdadm  --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array

ブーム!許可されず、エラーは非常に明確です。


Synology Hybrid RAID(SHR)はこの問題を解決します。
デニスデニソフ

1

mdXデバイスをセットアップするにはいくつかの方法があります。方法は、これをGPTとしてパーティション化するために使用しますgdisk(またはsgdisk、コマンドラインのみのバージョンを使用する場合)。アレイから起動する場合は、「BIOSブートパーティション」を作成し、codeと入力しますef02。これは、このアレイから起動する場合にのみ必要です。それ以外の場合は気にする必要はありません。次に、アレイに追加する最小ディスクと同じサイズまたはそれより小さいパーティションを作成します。最後になりますが、GPTデータを他のディスクにコピーします(のエキスパートメニューgdisk、を使用してxuターゲットデバイスを指定します)。これは破壊的なプロセスです。

ファイルシステムで許可されている場合は、既存のパーティションのサイズを小さくしてから、同じ方法を使用してGPTデータをコピーすることが可能です。ただし、これにより、ちょっとした混乱が生じます。なぜなら今では2つのディスクがありますが、まだmdXデバイスはありません。そのうちの1つをmdX、パーティション単位(上記で暗示されている)またはディスク単位で準備し、既存のディスクからそのディスクにデータを移動する必要があります。

そう:

  1. ビッグディスク(/dev/sda)にはデータが含まれ、データは3001 GB未満、パーティションは含まれません
  2. より小さなディスク/dev/sdbがシステムに追加されます
  3. あなた/dev/sdbgdisk
  4. 各パーティションから配列を作成します(mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2
  5. 新しいアレイにファイルシステムを作成します
  6. すべてのデータをコピーし、システムがGPTディスクから実行する準備ができていることを確認し、GRUB2に影響を理解させます(以下を参照)
  7. GPTパーティションデータをコピーします /dev/sdb/dev/sda
  8. 「生の」パーティションを/dev/sda既存のアレイに追加します
  9. あなたは待っています /proc/mdstat同期が完了したことを示すの

すべての手順を実行すると、mdXアレイから新しいシステムを起動できるようになります。ただし、万一に備えて、レスキューCDまたはPXEブートオプションを手元に置いておきます。


GRUB2は、セットアップをすぐに認識できません。そのため、「魔法」が必要です。ワンライナーは次のとおりです。

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

または、もっと冗長にしましょう:

for i in /dev/disk/by-id/md-uuid-*
do
  DEV=$(readlink $i)
  echo "(${DEV##*/}) $i"
done|sort|sudo tee /boot/grub/devicemap

これにより、デフォルト/boot/grub/devicemapを作成(または上書き)して、GRUB2にそれぞれのディスクを見つける場所を指示します。結果は次のリストのようになります。

(md0) /dev/disk/by-id/md-uuid-...
(md2) /dev/disk/by-id/md-uuid-...
(md3) /dev/disk/by-id/md-uuid-...
(md4) /dev/disk/by-id/md-uuid-...

レガシーGRUBを使用する場合、メタデータバージョン0.9を使用して「BIOSブートパーティション」を作成する必要もありますが、使用mdadm -e 0 ...方法とプロセスは異なります。しかし、私はそれをしていません。


1
お返事をありがとうございます。この配列は、実際にはサーバー上のrawストレージ専用であるため、起動などを処理しません。ゲームの後半で、異なるサイズのハードドライブを混在させて一致させることを心配していました。つまり、sdb1 @ 3001 GBとsdc1 @ 3001 GBがありますが、sdc1が死んで交換が3000 GBの場合、どうなるでしょうか?sdb1は3000に縮小しますか?アレイ@ / dev / md0は3000 GBに縮小しますか?考えれば考えるほど、上記の2999の例のように、最後に余地を残すのが理にかなっています。そのようにして頭痛を解消する必要があります。私が何かを逃していない限り?
JaSauders

1
実際、ここでRAIDレベル1を想定mdadmすると、互換性がない場合、そもそもアレイの構築を拒否します。RAID 5では最終的にはより多くのディスクが必要になりますが、RAID 0ではそれを気にしません。だから、RAID 1を想定しました。
0xC0000022L

私は馬に勝つつもりはありませんが、あなたが行った「相容れない」声明については少し確信が持てません。互換性のないものは何ですか?私の例では、3000 GBと3001 GBの点でサイズの違いを参照していましたか?いずれにせよ、各ディスクが3001 GBであっても、各パーティションが2999 GBでアレイを実行しました。これにより、同一の交換用ドライブを入手できない場合に発生する頭痛の種を取り除くことができます。あなたの洞察力に感謝します!
JaSauders

@JaSauders:1 つのGiBは多かれ少なかれ既に互換性がないと思います。しかし、率直に言って、私は限界がどこにあるのか分かりません。ただし、サイズのわずかな変動は許容されることを知っています。他のすべてについては、私が概説したのと同様の方法で移行する必要があります。
-0xC0000022L

@ 0xC0000022L:mdadm配列メンバーの任意の1%のサイズの違いを許容します。
アレクシオス14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.