요약: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
대체를 수동으로 추가하려고 시도했고 다음을 얻었습니다.
# 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
# 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
# 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.
답변1
를 추적 mdadm
하면 gdb
어레이를 스캔하여 동기화된 모든 장치를 찾는 루프가 발생합니다. 작동하는 sdc2를 찾기 전에 일찍 중지됩니다. 잘못된 코드 줄:
for (d = 0; d < MAX_DISKS && found < array->active_disks; d++) {
mdadm git에서 이 문제가 해결되었음을 쉽게 확인할 수 있습니다.
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
스페어를 표시했음에도 불구하고 어레이를 중지하고 재조립할 때까지 재구축이 시작되지 않았다는 것입니다.