Làm thế nào để khôi phục một mảng Linux md RAID5 bị lỗi?


17

Thời gian trước tôi có một hệ thống RAID5 ở nhà. Một trong 4 đĩa không thành công nhưng sau khi gỡ bỏ và đặt lại thì có vẻ vẫn ổn nên tôi bắt đầu đồng bộ lại. Khi nó kết thúc tôi nhận ra, điều kinh hoàng của tôi là 3 trong số 4 đĩa không thành công. Tuy nhiên tôi không tin điều đó là có thể. Có nhiều phân vùng trên các đĩa, mỗi phần của một mảng RAID khác nhau.

  • md0 là một mảng RAID1 bao gồm sda1, sdb1, sdc1 và sdd1.
  • md1 là một mảng RAID5 bao gồm sda2, sdb2, sdc2 và sdd2.
  • md2 là một mảng RAID0 bao gồm sda3, sdb3, sdc3 và sdd3.

md0 và md2 báo cáo tất cả các đĩa lên trong khi md1 báo cáo 3 lỗi (sdb2, sdc2, sdd2). Đó là sự hiểu biết của tôi rằng khi các ổ đĩa cứng bị hỏng, tất cả các phân vùng sẽ bị mất không chỉ các ổ giữa.

Lúc đó tôi tắt máy tính và rút ổ đĩa ra. Kể từ đó tôi đã sử dụng máy tính đó với một đĩa mới nhỏ hơn.

Có bất kỳ hy vọng phục hồi dữ liệu? Tôi có thể bằng cách nào đó thuyết phục mdadm rằng các đĩa của tôi trong thực tế đang hoạt động? Đĩa duy nhất có thể thực sự có vấn đề là sdc nhưng đĩa đó cũng được báo cáo bởi các mảng khác.

Cập nhật

Cuối cùng tôi cũng có cơ hội kết nối các đĩa cũ và khởi động máy này từ SystemResTHERCd. Tất cả mọi thứ ở trên được viết từ bộ nhớ. Bây giờ tôi có một số dữ liệu cứng. Đây là đầu ra củamdadm --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

Có vẻ như mọi thứ đã thay đổi kể từ lần khởi động cuối cùng. Nếu tôi đọc chính xác sda2 này, sdb2 và sdc2 đang hoạt động và chứa dữ liệu được đồng bộ hóa và sdd2 là phụ tùng. Tôi nhớ rõ ràng nhìn thấy 3 đĩa thất bại nhưng đây là tin tốt. Tuy nhiên, mảng vẫn không hoạt động:

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 dường như được đổi tên thành md127. md125 và md126 rất lạ. Chúng nên là một mảng chứ không phải hai. Điều đó từng được gọi là md1. md2 đã biến mất hoàn toàn nhưng đó là sự hoán đổi của tôi nên tôi không quan tâm.

Tôi có thể hiểu các tên khác nhau và nó không thực sự quan trọng. Nhưng tại sao một mảng với 3 đĩa "đồng bộ hóa hoạt động" không thể đọc được? Và những gì với sdd2 là trong một mảng riêng biệt?

Cập nhật

Tôi đã thử như sau sau khi sao lưu các siêu khóa:

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

Càng xa càng tốt. Vì sdd2 là phụ tùng nên tôi không muốn thêm nó vào.

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

Rõ ràng tôi không thể làm điều đó.

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>

Điều đó cũng không hiệu quả. Hãy thử với tất cả các đĩa.

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>

Không may mắn. Dựa trên câu trả lời này, tôi dự định thử:

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

Nó có an toàn không?

Cập nhật

Tôi xuất bản tập lệnh phân tích cú pháp siêu khối mà tôi đã sử dụng để tạo bảng đó trong nhận xét của mình. Có lẽ ai đó sẽ thấy nó hữu ích. Cảm ơn tất cả sự giúp đỡ của bạn.


Tôi đoán mdadm --re-addkhông phải là những gì bạn đang tìm kiếm. Bạn đã làm một bài kiểm tra trí nhớ gần đây? Bạn có bất kỳ thông điệp tường trình liên quan đến lỗi mảng?
Gilles 'SO- ngừng trở thành ác quỷ'

@Gilles: Tôi không có nhật ký từ trước khi sự cố xảy ra vì chúng được lưu trữ trên mảng không thành công. Và tôi không nghĩ rằng tôi có thể sửa nó với giao diện mdadm tiêu chuẩn. Bất kỳ loại hoạt động nào liên quan đến đồng bộ lại là không thể với 1 trong 4 đĩa. Tôi nghĩ rằng 3 đĩa "thất bại" chứa đủ thông tin để khôi phục lại mọi thứ. Ví dụ tôi có thể đọc chúng với dd. Cái "tốt" có thể không đồng bộ. Tôi sẽ làm một memtest nhưng máy đó hiện đang hoạt động hoàn hảo với một đĩa mới.
stribika

2
Bạn đã thử dừng mảng và lắp lại một cái mới với mdadm -A /dev/md1 /dev/sd{b,c,d}2(có lẽ --force) chưa? (Nếu bạn không có, hãy sao lưu các siêu khóa trước.)
Gilles 'SO- ngừng trở thành ác quỷ'

@Gilles: Tôi đã cập nhật câu hỏi của mình với thông tin cập nhật. Tôi cần gì để sao lưu chính xác? Một vài khối đầu tiên của đĩa hoặc có một công cụ cụ thể cho việc này không?
stribika

@stribika: Superblock là khối 64kB đầy đủ cuối cùng được căn chỉnh trên ranh giới 64kB trên phân vùng. Tôi không biết làm thế nào /dev/sdd2có thể ở trong một mảng riêng biệt mặc dù có cùng UUID như sd{a,b,c}2.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


12

Trước tiên hãy kiểm tra các đĩa, thử chạy selftest thông minh

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

Có thể mất vài giờ để hoàn tất, nhưng hãy kiểm tra trạng thái kiểm tra của mỗi ổ mỗi vài phút, tức là

smartctl -l selftest /dev/sda

Nếu trạng thái của một báo cáo đĩa không hoàn thành do lỗi đọc, thì đĩa này nên được xem là không an toàn cho việc lắp lại md1. Sau khi kết thúc tốt nhất, bạn có thể bắt đầu thử lắp lại mảng của mình. Tùy chọn, nếu bạn muốn thận trọng hơn, hãy di chuyển các đĩa sang máy khác trước khi tiếp tục (chỉ trong trường hợp ram / bộ điều khiển / vv xấu).

Gần đây, tôi có một trường hợp chính xác như thế này. Một ổ đĩa bị lỗi, tôi đã thêm lại vào mảng nhưng trong quá trình xây dựng lại 3 trong số 4 ổ đĩa đã thất bại hoàn toàn. Nội dung của / Proc / mdadm giống với nội dung của bạn (có thể không theo cùng thứ tự)

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

Nhưng tôi đã may mắn và lắp ráp lại mảng với điều này

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

Bằng cách nhìn vào đầu ra --examine bạn cung cấp, tôi có thể biết tình huống sau đây đã xảy ra: sdd2 không thành công, bạn đã gỡ bỏ nó và thêm lại, vì vậy nó trở thành một ổ đĩa dự phòng đang cố gắng xây dựng lại. Nhưng trong khi xây dựng lại sda2 không thành công và sau đó sdb2 không thành công. Vì vậy, bộ đếm sự kiện lớn hơn trong sdc2 và sdd2 là các ổ đĩa hoạt động cuối cùng trong mảng (mặc dù sdd không có cơ hội để xây dựng lại và vì vậy nó là lỗi thời nhất trong tất cả). Bởi vì sự khác biệt trong các quầy sự kiện, - lực lượng sẽ là cần thiết. Vì vậy, bạn cũng có thể thử điều này

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

Để kết luận, tôi nghĩ rằng nếu lệnh trên thất bại, bạn nên thử tạo lại mảng như thế này:

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

Nếu bạn thực hiện --create, missingphần này rất quan trọng, đừng cố thêm ổ đĩa thứ tư vào mảng, vì khi đó quá trình xây dựng sẽ bắt đầu và bạn sẽ mất dữ liệu của mình . Tạo mảng với một ổ đĩa bị thiếu, sẽ không thay đổi nội dung của nó và bạn sẽ có cơ hội lấy một bản sao ở nơi khác (raid5 không hoạt động giống như raid1).

Nếu điều đó không thể đưa mảng lên, hãy thử giải pháp này (tập lệnh perl) tại đây Tái tạo một mảng

Nếu cuối cùng bạn quản lý để đưa mảng lên, hệ thống tập tin sẽ bị ô uế và có thể bị hỏng. Nếu một đĩa bị lỗi trong quá trình xây dựng lại, dự kiến ​​mảng sẽ dừng và đóng băng không thực hiện bất kỳ ghi vào các đĩa khác. Trong trường hợp này, hai đĩa không thành công, có thể hệ thống đang thực hiện các yêu cầu ghi không thể hoàn thành, do đó có một số khả năng nhỏ bạn bị mất một số dữ liệu, nhưng cũng có khả năng bạn sẽ không bao giờ nhận thấy nó :-)

chỉnh sửa: một số làm rõ thêm.


mdadm --assemble /dev/md1 /dev/sd[abc]2 --forceđã làm việc. Cảm ơn bạn. Bạn đã lưu dữ liệu của tôi! :) Tôi sẽ không cố thêm đĩa thứ tư vì 3 cái đầu tiên không tốt như tôi nghĩ trước đây. Các selftest tiết lộ mỗi có 10-20 khối không thể đọc được. Tôi cảm thấy ngu ngốc vì đã không kiểm tra điều này đầu tiên.
stribika

Cảm ơn cho một câu trả lời toàn diện. Được thưởng với 50 rep từ tôi.
0xC0000022L

Permute_array.pl đã làm việc rất tốt cho tôi. Lưu ý cho những người dùng khác: mảng thiết bị mà nó dự kiến ​​sẽ bao gồm tất cả các ổ đĩa, bao gồm mọi ổ đĩa chết mà bạn có thể đã xóa.

"Nếu bạn thực hiện - tạo, phần còn thiếu rất quan trọng, đừng cố thêm ổ đĩa thứ tư vào mảng, vì khi đó quá trình xây dựng sẽ bắt đầu và bạn sẽ mất dữ liệu của mình." - BS. Nếu bạn chỉ định --assume-clean(bạn đã làm) thì sẽ không.
poige

1

Tôi đã trải qua nhiều vấn đề trong khi tôi sử dụng mdadm, nhưng không bao giờ mất dữ liệu. Bạn nên tránh --forcetùy chọn hoặc sử dụng nó rất cẩn thận, vì bạn có thể mất tất cả dữ liệu của mình. Xin vui lòng gửi/etc/mdadm/mdadm.conf

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.