상세 버전

상세 버전

요약: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스페어를 표시했음에도 불구하고 어레이를 중지하고 재조립할 때까지 재구축이 시작되지 않았다는 것입니다.

관련 정보