TLDR:尝试使用 mdadm 3.3.2 (Debian Jessie) 将空白分区添加到降级的 RAID1 失败,说(完美工作!)阵列“失败”和“--add 无法工作”。它是在告诉我这里有真正的危险,还是我刚刚遇到了一些奇怪的错误?
一夜之间,我的磁盘死了。盒子上有5个mdraid阵列;其中一个(RAID10)使用备用设备按预期重建。RAID6 一直处于降级状态,直到今晚更换磁盘到达。与 /boot 的 5 磁盘镜像相同。有两个 RAID1 阵列用于交换;他们共享一个热备件。热备用连接到没有出现故障的那个,但它们都在同一个备用组中,因此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
Run Code Online (Sandbox Code Playgroud)
我尝试手动添加备用,并得到:
# 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.
Run Code Online (Sandbox Code Playgroud)
/dev/sdj2有另一个镜像的超级块(作为该镜像的备用),所以我继续尝试mdadm --zero-superblock /dev/sdj2,但即使在那之后,添加也失败并出现相同的错误。我很确定我可以完成这项工作(例如,我还没有尝试过--force,或者mdadm -r在出现故障的磁盘上——或者最坏的情况——它只是交换——重新创建阵列)。
我已经继续并暂时停止使用该数组(它用于交换)。swapoff对数组执行 I/O 没有错误,所以它似乎没有失败。
似乎不是一个太小的设备:
# blockdev --getsize64 /dev/sda2 /dev/sdj2
10001940480
10001940480
Run Code Online (Sandbox Code Playgroud)
所以我希望其他人知道这个错误意味着什么。
如果重要的话,这是 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
Run Code Online (Sandbox Code Playgroud)
# 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.
Run Code Online (Sandbox Code Playgroud)
跟踪mdadmwithgdb导致我进入一个循环,该循环尝试扫描数组,查找所有已同步的设备。只是它在找到工作的 sdc2 之前就提前停止了。手头上有错误的代码行:
for (d = 0; d < MAX_DISKS && found < array->active_disks; d++) {
Run Code Online (Sandbox Code Playgroud)
很容易发现这个问题在 mdadm git 中得到了修复:
commit d180d2aa2a1770af1ab8520d6362ba331400512f
Author: NeilBrown <neilb@suse.de>
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 <neilb@suse.de>
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;
Run Code Online (Sandbox Code Playgroud)
将该补丁应用于 mdadm 可以解决该问题。尽管奇怪的是,添加磁盘后,尽管/proc/mdstat显示了备用磁盘,但直到我停止并重新组装阵列后,它才开始重建。
| 归档时间: |
|
| 查看次数: |
1159 次 |
| 最近记录: |