TLDR: mdadm 3.3.2(Debian Jessie)を使用して劣化したRAID1に空のパーティションを追加しようとすると、(完全に機能しています!)アレイが「失敗」し、「-addが機能しません」と表示されて失敗します。 。ここで本当の危険を告げているのでしょうか、それとも奇妙なバグにぶつかっただけでしょうか?
一晩、私はディスクダイを持っていました。ボックスには5つのmdraidアレイがあります。それらの1つ(RAID10)は、スペアを使用して期待どおりに再構築されました。 RAID6は、交換用ディスクが今夜到着するまで劣化したままです。/bootの5ディスクミラーと同じです。スワップに使用されるRAID1アレイは2つあります。彼らはホットスペアを共有しています。ホットスペアは、障害が発生していないものに接続されていましたが、両方とも同じスペアグループに属しているため、mdadm --monitor
はスペアを移動しようとしましたが、失敗しました。私が知る限り、エラーは発生しませんでした。スペアを失っただけです。
今朝、劣化したミラーは次のようになります。
md124 : active raid1 sda2[0](F) sdc2[2]
9767448 blocks super 1.2 [2/1] [_U]
bitmap: 0/150 pages [0KB], 32KB chunk
スペアを手動で追加しようとしましたが、次のようになりました。
# mdadm -a /dev/md124 /dev/sdj2
mdadm: /dev/md124 has failed so using --add cannot work and might destroy
mdadm: data on /dev/sdj2. You should stop the array and re-assemble it.
/dev/sdj2
には他のミラーのスーパーブロックが(そのミラーのスペアとして)あったので、先に進んでmdadm --zero-superblock /dev/sdj2
を試しましたが、その後も同じエラーで追加が失敗します。私はこれを機能させることができると確信しています(たとえば、まだ--force
を試したことがないか、障害が発生したディスクでmdadm -r
を試していません。最悪の場合、スワップするだけでアレイを再作成します)。
私は先に進んで、今のところその配列の使用をやめました(スワップに使用されました)。 swapoff
はエラーなしでアレイへのI/Oを実行したため、失敗したようには見えません。
小さすぎるデバイスではないようです:
# blockdev --getsize64 /dev/sda2 /dev/sdj2
10001940480
10001940480
ですから、このエラーの意味を誰かが知っていることを願っています。
重要な場合、これはmdadm 3.3.2(Debian Jessie)です。
# mdadm -D /dev/md124
/dev/md124:
Version : 1.2
Creation Time : Thu Mar 11 20:34:00 2010
Raid Level : raid1
Array Size : 9767448 (9.31 GiB 10.00 GB)
Used Dev Size : 9767448 (9.31 GiB 10.00 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Oct 12 12:35:13 2015
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 1
Spare Devices : 0
Name : Einstein:swap_a (local to Host Einstein)
UUID : 3d7da9d2:5ea17db5:3b122196:11968e91
Events : 2044
Number Major Minor RaidDevice State
0 0 0 0 removed
2 8 34 1 active sync /dev/sdc2
0 8 2 - faulty /dev/sda2
# mdadm -E /dev/sdc2
/dev/sdc2:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x1
Array UUID : 3d7da9d2:5ea17db5:3b122196:11968e91
Name : Einstein:swap_a (local to Host Einstein)
Creation Time : Thu Mar 11 20:34:00 2010
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 19534897 (9.31 GiB 10.00 GB)
Array Size : 9767448 (9.31 GiB 10.00 GB)
Used Dev Size : 19534896 (9.31 GiB 10.00 GB)
Data Offset : 144 sectors
Super Offset : 8 sectors
State : clean
Device UUID : 95e09398:1c155ebd:323371cf:a3acc3ad
Internal Bitmap : 8 sectors from superblock
Update Time : Mon Oct 12 12:35:13 2015
Checksum : 132239e4 - correct
Events : 2044
Device Role : Active device 1
Array State : .A ('A' == active, '.' == missing, 'R' == replacing)
# mdadm -E /dev/sdj2
mdadm: No md superblock detected on /dev/sdj2.
mdadm
をgdb
でトレースすると、同期されたすべてのデバイスを探して、アレイをスキャンしようとするループが発生しました。動作しているsdc2が見つかる前に、早期に停止したことを除いて。バグのあるコード行を手にした場合:
for (d = 0; d < MAX_DISKS && found < array->active_disks; d++) {
これがmdadmgitで修正されていることを見つけるのはかなり簡単でした:
commit d180d2aa2a1770af1ab8520d6362ba331400512f
Author: NeilBrown <[email protected]>
Date: Wed May 6 15:03:50 2015 +1000
Manage: fix test for 'is array failed'.
We 'active_disks' does not count spares, so if array is rebuilding,
this will not necessarily find all devices, so may report an array
as failed when it isn't.
Counting up to nr_disks is better.
Signed-off-by: NeilBrown <[email protected]>
diff --git a/Manage.c b/Manage.c
index d3cfb55..225af81 100644
--- a/Manage.c
+++ b/Manage.c
@@ -827,7 +827,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
int d;
int found = 0;
- for (d = 0; d < MAX_DISKS && found < array->active_disks; d++) {
+ for (d = 0; d < MAX_DISKS && found < array->nr_disks; d++) {
disc.number = d;
if (ioctl(fd, GET_DISK_INFO, &disc))
continue;
そのパッチをmdadmに適用すると、問題が修正されます。奇妙なことに、ディスクを追加した後、/proc/mdstat
スペアが存在することを示しました。アレイを停止して再アセンブルするまで、再構築は開始されませんでした。