충돌 한 Linux md RAID5 어레이를 복구하는 방법?


17

얼마 전에 집에 RAID5 시스템이있었습니다. 4 개의 디스크 중 하나가 고장 났지만 디스크를 제거했다가 다시 넣은 후에는 다시 동기화를 시작했습니다. 그것이 끝났을 때, 나는 공포로 4 개의 디스크 중 3 개가 고장났다는 것을 깨달았습니다. 그러나 나는 그것이 가능하다는 것을 믿지 않습니다. 디스크에는 서로 다른 RAID 배열의 각 부분에 여러 개의 파티션이 있습니다.

  • md0은 sda1, sdb1, sdc1 및 sdd1로 구성된 RAID1 배열입니다.
  • md1은 sda2, sdb2, sdc2 및 sdd2로 구성된 RAID5 배열입니다.
  • md2는 sda3, sdb3, sdc3 및 sdd3으로 구성된 RAID0 배열입니다.

md0 및 md2는 모든 디스크를보고하지만 md1보고 3은 실패했습니다 (sdb2, sdc2, sdd2). 하드 드라이브가 고장 나면 중간 파티션뿐만 아니라 모든 파티션이 손실되어야한다는 것을 알고 있습니다.

그 시점에서 나는 컴퓨터를 끄고 드라이브의 플러그를 뽑았다. 그 이후로 나는 작은 디스크로 그 컴퓨터를 사용하고있었습니다.

데이터를 복구 할 희망이 있습니까? 어떻게 든 내 디스크가 실제로 작동한다고 mdadm을 설득 할 수 있습니까? 실제로 문제가있을 수있는 유일한 디스크는 sdc이지만 다른 디스크에서도 해당 디스크를보고합니다.

최신 정보

마침내 이전 디스크를 연결하고 SystemRescueCd에서이 시스템을 부팅 할 수있었습니다. 위의 모든 것은 메모리에서 작성되었습니다. 이제 하드 데이터가 있습니다. 출력은 다음과 같습니다mdadm --examine /dev/sd*2

/dev/sda2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:40:48 2010
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b48835 - correct
         Events : 53204

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     0       8        2        0      active sync   /dev/sda2

   0     0       8        2        0      active sync   /dev/sda2
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdb2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 1
       Checksum : 68b4894a - correct
         Events : 53205

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     1       8       18        1      active sync   /dev/sdb2

   0     0       0        0        0      removed
   1     1       8       18        1      active sync   /dev/sdb2
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdc2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48975 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     2       8       34        2      active sync   /dev/sdc2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2
/dev/sdd2:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 53eb7711:5b290125:db4a62ac:7770c5ea
  Creation Time : Sun May 30 21:48:55 2010
     Raid Level : raid5
  Used Dev Size : 625064960 (596.11 GiB 640.07 GB)
     Array Size : 1875194880 (1788.33 GiB 1920.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 1

    Update Time : Mon Aug 23 11:44:54 2010
          State : clean
 Active Devices : 1
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 1
       Checksum : 68b48983 - correct
         Events : 53210

         Layout : left-symmetric
     Chunk Size : 64K

      Number   Major   Minor   RaidDevice State
this     4       8       50        4      spare   /dev/sdd2

   0     0       0        0        0      removed
   1     1       0        0        1      faulty removed
   2     2       8       34        2      active sync   /dev/sdc2
   3     3       0        0        3      faulty removed
   4     4       8       50        4      spare   /dev/sdd2

마지막 부팅 이후에 상황이 변경된 것으로 보입니다. 이 sda2를 올바르게 읽으면 sdb2와 sdc2가 작동하고 동기화 된 데이터가 포함되어 있으며 sdd2는 여분입니다. 디스크가 3 개 고장난 것을 분명히 기억하지만 이것은 좋은 소식입니다. 그러나 배열은 여전히 ​​작동하지 않습니다.

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md125 : inactive sda2[0](S) sdb2[1](S) sdc2[2](S)
      1875194880 blocks

md126 : inactive sdd2[4](S)
      625064960 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

md0의 이름이 md127로 바뀌 었습니다. md125와 md126은 매우 이상합니다. 두 개가 아닌 하나의 배열이어야합니다. 이것을 md1이라고했습니다. md2는 완전히 사라졌지 만 스왑이므로 신경 쓰지 않았습니다.

다른 이름을 이해할 수 있으며 실제로 중요하지 않습니다. 그러나 왜 3 개의 "활성 동기화"디스크가있는 어레이를 읽을 수 없습니까? 그리고 sdd2가 별도의 배열에 있습니까?

최신 정보

수퍼 블록을 백업 한 후 다음을 시도했습니다.

root@sysresccd /root % mdadm --stop /dev/md125
mdadm: stopped /dev/md125
root@sysresccd /root % mdadm --stop /dev/md126
mdadm: stopped /dev/md126

여태까지는 그런대로 잘됐다. sdd2가 여분이므로 아직 추가하고 싶지 않습니다.

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2 missing 
mdadm: cannot open device missing: No such file or directory
mdadm: missing has no superblock - assembly aborted

분명히 나는 ​​그것을 할 수 없습니다.

root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c}2        
mdadm: /dev/md1 assembled from 1 drive - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdb2[1](S) sda2[0](S)
      1875194880 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

그것은 작동하지 않았다. 모든 디스크를 사용해 봅시다.

mdadm --stop /dev/md1
mdadm: stopped /dev/md1
root@sysresccd /root % mdadm --assemble /dev/md1 /dev/sd{a,b,c,d}2
mdadm: /dev/md1 assembled from 1 drive and 1 spare - not enough to start the array.
root@sysresccd /root % cat /proc/mdstat                           
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)
      2500259840 blocks

md127 : active raid1 sda1[0] sdd1[3] sdc1[2] sdb1[1]
      64128 blocks [4/4] [UUUU]

unused devices: <none>

불운. 이 답변을 바탕으로 시도 할 계획입니다.

mdadm --create /dev/md1 --assume-clean --metadata=0.90 --bitmap=/root/bitmapfile --level=5 --raid-devices=4 /dev/sd{a,b,c}2 missing
mdadm --add /dev/md1 /dev/sdd2

안전 해요?

최신 정보

내 의견에 해당 테이블을 만드는 데 사용한 수퍼 블록 파서 스크립트를 게시합니다 . 누군가가 유용하다고 생각할 수도 있습니다. 모든 도움을 주셔서 감사합니다.


mdadm --re-add당신이 찾고있는 것이 아닌 것 같습니다 . 최근에 메모리 테스트를 했습니까? 어레이 오류와 관련된 로그 메시지가 있습니까?
Gilles 'SO- 악의를 그만두십시오'

@Gilles : 오류가 발생한 배열에 저장되었으므로 충돌 이전의 로그는 없습니다. 그리고 표준 mdadm 인터페이스로 해결할 수 있다고 생각하지 않습니다. 재 동기화와 관련된 모든 종류의 작업은 4 개 중 1 개의 디스크에서는 불가능합니다. 3 개의 "실패한"디스크에는 모든 정보를 복원하기에 충분한 정보가 포함되어 있다고 생각합니다. 예를 들어 dd로 읽을 수 있습니다. "좋은"것이 동기화되지 않았을 수 있습니다. 나는 memtest를 할 것이다. 그러나 그 기계는 지금 ​​새로운 디스크와 완벽하게 작동하고있다.
stribika

2
mdadm -A /dev/md1 /dev/sd{b,c,d}2(아마도 --force)로 배열을 중지하고 새 배열을 다시 어셈블하려고 했습니까 ? (만약 당신이 없다면 슈퍼 블록을 먼저 백업하십시오.)
Gilles 'SO- 악의를 그만두십시오'

@Gilles : 질문을 최신 정보로 업데이트했습니다. 정확히 백업해야하는 것은 무엇입니까? 디스크의 처음 몇 블록 또는 이에 대한 특정 도구가 있습니까?
stribika

@stribika : 수퍼 블록은 파티션의 64kB 경계에 정렬 된 마지막 전체 64kB 블록입니다. /dev/sdd2와 같은 UUID가 있음에도 불구하고 어떻게 별도의 배열에있을 수 있는지 모르겠습니다 sd{a,b,c}2.
Gilles 'SO- 악마 그만해'

답변:


12

먼저 디스크를 확인하고 스마트 자체 테스트를 실행하십시오.

for i in a b c d; do
    smartctl -s on -t long /dev/sd$i
done

완료하는 데 몇 시간이 걸릴 수 있지만 몇 분마다 각 드라이브의 테스트 상태를 확인하십시오.

smartctl -l selftest /dev/sda

읽기 오류로 인해 디스크 상태가 완료되지 않은 경우이 디스크는 md1 리 어셈블리에 안전하지 않은 것으로 간주해야합니다. 자체 테스트가 완료되면 어레이 재 조립을 시작할 수 있습니다. 선택적으로, 추가로주의를 기울이려면 계속 진행하기 전에 디스크를 다른 시스템으로 이동하십시오 (램 / 컨트롤러 등이 불량한 경우).

최근에는 이와 같은 경우가있었습니다. 하나의 드라이브에 오류가 발생하여 어레이에 다시 추가했지만 4 개의 드라이브 중 3 개를 재구성하는 동안 모두 실패했습니다. / proc / mdadm의 내용은 귀하의 내용과 동일합니다 (동일한 순서가 아닐 수도 있음)

md1 : inactive sdc2[2](S) sdd2[4](S) sdb2[1](S) sda2[0](S)

그러나 나는 운이 좋았고 이것으로 배열을 재구성했습니다.

mdadm --assemble /dev/md1 --scan --force

제공 한 --examine 출력을 살펴보면 다음 시나리오가 발생했음을 알 수 있습니다. sdd2가 실패했다가 제거했다가 다시 추가했기 때문에 다시 빌드하려는 스페어 드라이브가되었습니다. 그러나 sda2 재 구축에 실패한 후 sdb2에 실패했습니다. 따라서 이벤트 카운터는 어레이의 마지막 활성 드라이브 인 sdc2 및 sdd2에서 더 큽니다 (sdd는 재 구축 할 기회가 없었으므로 가장 오래된 것임). 이벤트 카운터의 차이로 인해 --force가 필요합니다. 그래서 당신은 또한 이것을 시도 할 수 있습니다

mdadm --assemble /dev/md1 /dev/sd[abc]2 --force

결론적으로 위의 명령이 실패하면 다음과 같이 배열을 다시 작성해야한다고 생각합니다.

mdadm --create /dev/md1 --assume-clean -l5 -n4 -c64 /dev/sd[abc]2 missing

당신이 할 경우 --createmissing부분이 중요하고 건설이 시작하기 때문에, 배열에 네 번째 드라이브를 추가하려고하지 않는 당신은 당신의 데이터가 손실됩니다 . 누락 된 드라이브로 어레이를 생성하면 내용이 변경 되지 않으며 다른 곳 에서 사본을 얻을 수 있습니다 (raid5는 raid1과 같은 방식으로 작동하지 않음).

그 배열을 제기하지 않을 경우, 여기에이 솔루션 (펄 스크립트) 시도 배열을 재 작성을

마지막으로 어레이를 가동하면 파일 시스템이 깨끗하지 않고 손상되었을 수 있습니다. 재 구축 중에 하나의 디스크에 오류가 발생하면 어레이가 중지되고 다른 디스크에 대한 쓰기 작업이 중단 될 것으로 예상됩니다. 이 경우 두 개의 디스크가 고장 났을 수 있습니다 . 시스템이 완료 할 수없는 쓰기 요청을 수행하고 있었기 때문에 데이터를 잃을 가능성이 적지 만,이를 절대 눈치 채지 못할 수도 있습니다.

편집 : 일부 설명이 추가되었습니다.


mdadm --assemble /dev/md1 /dev/sd[abc]2 --force일했다. 감사합니다. 내 데이터를 저장했습니다! :) 첫 번째 3 개는 이전에 사용했던 것보다 좋지 않기 때문에 4 번째 디스크를 추가하지 않습니다. 자체 테스트 결과 각각 10-20 개의 읽을 수없는 블록이 있습니다. 이것을 먼저 확인하지 않은 것은 어리석은 생각입니다.
stribika

포괄적 인 답변에 감사드립니다. 저에게서 50 명의 담당자에게 보상했습니다.
0xC0000022L

Permute_array.pl은 저에게 효과적이었습니다. 다른 사용자를위한 참고 사항 : 표시 될 것으로 예상되는 장치 배열에는 제거 할 수있는 사용 불능 드라이브를 포함한 모든 드라이브가 포함됩니다.

"--create를 수행하면 누락 된 부분이 중요합니다. 배열에 네 번째 드라이브를 추가하려고 시도하지 마십시오. 구성이 시작되고 데이터가 손실되기 때문입니다."— BS. 지정한 경우 --assume-clean( 그렇지 않은 경우) 그렇지 않습니다.
poige

1

사용하는 동안 많은 문제가 발생 mdadm했지만 데이터를 잃어 버리지 않았습니다. --force모든 데이터를 잃을 수 있으므로 옵션을 피 하거나 매우 신중하게 사용해야합니다. 게시하십시오/etc/mdadm/mdadm.conf

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.