วิธีการกู้คืนอาร์เรย์ Linux md RAID5 ที่ล้มเหลว


17

ก่อนหน้านี้ฉันมีระบบ RAID5 ที่บ้าน หนึ่งในสี่ดิสก์ล้มเหลว แต่หลังจากลบแล้วนำกลับมามันก็ดูเหมือนว่าจะตกลงดังนั้นฉันจึงเริ่มซิงค์ใหม่ เมื่อเสร็จฉันก็ตระหนักถึงความสยองขวัญของฉันว่า 3 ใน 4 ของดิสก์นั้นล้มเหลว อย่างไรก็ตามฉันไม่เชื่อว่าเป็นไปได้ มีหลายพาร์ติชันบนดิสก์แต่ละส่วนของอาร์เรย์ RAID ที่แตกต่างกัน

  • md0 เป็นอาร์เรย์ RAID1 ประกอบด้วย sda1, sdb1, sdc1 และ sdd1
  • md1 เป็นอาร์เรย์ RAID5 ประกอบด้วย sda2, sdb2, sdc2 และ sdd2
  • md2 เป็นอาร์เรย์ RAID0 ประกอบด้วย sda3, sdb3, sdc3 และ sdd3

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 ที่กำลังอยู่ในอาร์เรย์ที่แยกจากกัน

ปรับปรุง

ฉันลองทำสิ่งต่อไปนี้หลังจากทำการสำรอง superblocks:

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

ปลอดภัยไหม

ปรับปรุง

ฉันเผยแพร่สคริปต์ตัวแยกวิเคราะห์ superblock ที่ฉันใช้ทำตารางนั้นในความคิดเห็นของฉัน บางทีบางคนอาจพบว่ามีประโยชน์ ขอบคุณสำหรับความช่วยเหลือของคุณ


ฉันเดาว่าmdadm --re-addไม่ใช่สิ่งที่คุณกำลังมองหา คุณทำการทดสอบความจำเมื่อเร็ว ๆ นี้หรือไม่? คุณมีข้อความบันทึกที่เกี่ยวข้องกับความล้มเหลวของแถวลำดับหรือไม่?
Gilles 'หยุดความชั่วร้าย'

@Gilles: ฉันไม่มีบันทึกจากก่อนที่จะเกิดความผิดพลาดเนื่องจากมีการจัดเก็บไว้ในอาร์เรย์ที่ล้มเหลว และฉันไม่คิดว่าฉันจะสามารถแก้ไขได้ด้วยอินเทอร์เฟซ mdadm มาตรฐาน การดำเนินการใด ๆ ที่เกี่ยวข้องกับการซิงค์ซ้ำเป็นไปไม่ได้ด้วยดิสก์ 1 ใน 4 ฉันคิดว่าดิสก์ 3 "ล้มเหลว" มีข้อมูลเพียงพอที่จะกู้คืนทุกสิ่ง ตัวอย่างเช่นฉันสามารถอ่านได้ด้วยวว หนึ่ง "ดี" อาจไม่ซิงค์กัน ฉันจะทำ memtest แต่ตอนนี้เครื่องทำงานได้อย่างสมบูรณ์กับดิสก์ใหม่
stribika

2
คุณลองหยุดอาร์เรย์และประกอบชิ้นส่วนใหม่ด้วยmdadm -A /dev/md1 /dev/sd{b,c,d}2(อาจ--force) หรือไม่ (ถ้าคุณยังไม่ได้สำรอง superblock ก่อน)
Gilles 'ดังนั้นหยุดชั่วร้าย'

@Gilles: ฉันได้อัปเดตคำถามของฉันด้วยข้อมูลล่าสุด ฉันต้องสำรองอะไรบ้าง สองสามช่วงแรกของดิสก์หรือมีเครื่องมือเฉพาะสำหรับสิ่งนี้
stribika

@stribika: superblock เป็นบล็อกเต็ม 64kB สุดท้ายที่จัดชิดบนขอบเขต 64kB บนพาร์ติชัน ฉันไม่รู้ว่า/dev/sdd2จะอยู่ในอาร์เรย์แยกกันได้อย่างไรแม้ว่าจะมี UUID เช่นsd{a,b,c}2เดียวกัน
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


12

ก่อนอื่นให้ตรวจสอบดิสก์แล้วลองเรียกใช้ selftest ที่ฉลาดที่สุด

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

อาจใช้เวลาสองสามชั่วโมงในการเสร็จสิ้น แต่ตรวจสอบสถานะการทดสอบของแต่ละไดรฟ์ทุกสองสามนาทีเช่น

smartctl -l selftest /dev/sda

หากสถานะของดิสก์รายงานไม่เสร็จสมบูรณ์เนื่องจากข้อผิดพลาดในการอ่านดิสก์นี้ควรพิจารณาว่าไม่ปลอดภัยสำหรับการประกอบซ้ำของ md1 หลังจากเสร็จสิ้นการ selftest แล้วคุณสามารถเริ่มประกอบชิ้นส่วนอีกครั้งได้ หรือหากคุณต้องการระมัดระวังเป็นพิเศษให้ย้ายดิสก์ไปยังเครื่องอื่นก่อนดำเนินการต่อ (ในกรณีที่ ram / controller / etc ไม่ดี)

เมื่อเร็ว ๆ นี้ฉันมีกรณีตรงเช่นนี้ หนึ่งไดรฟ์ล้มเหลวฉันเพิ่มเข้าไปใหม่ในอาร์เรย์ แต่ในระหว่างการสร้าง 3 จาก 4 ไดรฟ์ล้มเหลวโดยสิ้นเชิง เนื้อหาของ / 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 จะไม่ได้มีโอกาสสร้างใหม่และดังนั้นจึงล้าสมัยที่สุด) เนื่องจากความแตกต่างในตัวนับเหตุการณ์ - กำลังจึงจำเป็น ดังนั้นคุณสามารถลองสิ่งนี้

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

เพื่อสรุปฉันคิดว่าถ้าคำสั่งดังกล่าวล้มเหลวคุณควรลองสร้างอาร์เรย์เช่นนี้:

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

ถ้าคุณทำ--createในmissingส่วนที่มีความสำคัญไม่พยายามที่จะเพิ่มไดรฟ์ที่สี่ในอาร์เรย์แล้วเพราะการก่อสร้างจะเริ่มต้นและคุณจะสูญเสียข้อมูลของคุณ การสร้างอาร์เรย์ด้วยไดรฟ์ที่หายไปจะไม่เปลี่ยนเนื้อหาและคุณจะมีโอกาสได้รับสำเนาที่อื่น (raid5 ไม่ทำงานในลักษณะเดียวกับ raid1)

ถ้าสิ่งนั้นล้มเหลวในการนำอาร์เรย์ขึ้นมาให้ลองวิธีนี้ (สคริปต์ Perl) ที่นี่สร้างอาร์เรย์ขึ้นใหม่

หากคุณจัดการเพื่อนำอาร์เรย์ขึ้นมาระบบไฟล์จะไม่สะอาดและอาจเสียหาย หากดิสก์หนึ่งล้มเหลวในระหว่างการสร้างใหม่คาดว่าอาร์เรย์จะหยุดและหยุดไม่ทำการเขียนใด ๆ ไปยังดิสก์อื่น ในกรณีนี้ดิสก์สองตัวล้มเหลวอาจเป็นไปได้ว่าระบบกำลังดำเนินการตามคำขอเขียนที่ไม่สามารถดำเนินการได้ดังนั้นจึงมีโอกาสเล็กน้อยที่คุณสูญเสียข้อมูลบางส่วน แต่ยังเป็นโอกาสที่คุณจะไม่สังเกตเห็น :-)

แก้ไข: เพิ่มการชี้แจงบางอย่าง


mdadm --assemble /dev/md1 /dev/sd[abc]2 --forceทำงาน ขอขอบคุณ. คุณบันทึกข้อมูลของฉัน! :) ฉันจะไม่พยายามเพิ่มดิสก์ตัวที่สี่เพราะ 3 ตัวแรกนั้นไม่ดีเท่าที่เคยคิดมา selftest ที่เปิดเผยแต่ละบล็อกมี 10-20 บล็อกที่อ่านไม่ได้ ฉันรู้สึกโง่ที่ไม่ได้ตรวจสอบสิ่งนี้ก่อน
stribika

ขอบคุณสำหรับคำตอบที่ครอบคลุม ได้รับรางวัล 50 ตัวแทนจากฉัน
0xC0000022L

Permute_array.pl ทำงานได้ดีสำหรับฉัน หมายเหตุสำหรับผู้ใช้รายอื่น: อาร์เรย์อุปกรณ์ที่คาดว่าจะเห็นรวมถึงไดรฟ์ทั้งหมดรวมถึงไดรฟ์ที่คุณอาจนำออก

"ถ้าคุณทำ - สร้างส่วนที่ขาดหายไปเป็นสิ่งสำคัญอย่าพยายามเพิ่มไดรฟ์ที่สี่ในอาเรย์เพราะจะเริ่มการก่อสร้างและคุณจะสูญเสียข้อมูลของคุณ" - BS หากคุณระบุไว้--assume-clean(ทำ) จะไม่เกิดขึ้น
poige

1

ฉันประสบปัญหามากมายขณะใช้งานmdadmแต่ไม่เคยสูญเสียข้อมูล คุณควรหลีกเลี่ยง--forceตัวเลือกหรือใช้อย่างระมัดระวังเพราะคุณอาจสูญเสียข้อมูลทั้งหมด กรุณาโพสต์ของคุณ/etc/mdadm/mdadm.conf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.