Bagaimana memulihkan array Linux md RAID5 yang macet?


17

Beberapa waktu lalu saya punya sistem RAID5 di rumah. Salah satu dari 4 disk gagal tetapi setelah menghapus dan meletakkannya kembali sepertinya OK jadi saya memulai sinkronisasi ulang. Ketika selesai saya menyadari, betapa ngerinya saya, bahwa 3 dari 4 disk gagal. Namun saya tidak percaya itu mungkin. Ada beberapa partisi pada disk, masing-masing bagian dari array RAID yang berbeda.

  • md0 adalah array RAID1 yang terdiri dari sda1, sdb1, sdc1 dan sdd1.
  • md1 adalah array RAID5 yang terdiri dari sda2, sdb2, sdc2 dan sdd2.
  • md2 adalah array RAID0 yang terdiri dari sda3, sdb3, sdc3 dan sdd3.

md0 dan md2 melaporkan semua disk sementara md1 melaporkan 3 gagal (sdb2, sdc2, sdd2). Kesalahpahaman saya bahwa ketika hard drive gagal semua partisi harus hilang bukan hanya yang tengah.

Pada saat itu saya mematikan komputer dan mencabut drive. Sejak itu saya menggunakan komputer itu dengan disk baru yang lebih kecil.

Apakah ada harapan memulihkan data? Bisakah saya meyakinkan mdadm bahwa disk saya sebenarnya berfungsi? Satu-satunya disk yang mungkin benar-benar memiliki masalah adalah sdc tetapi satu juga dilaporkan oleh array lainnya.

Memperbarui

Saya akhirnya mendapat kesempatan untuk menghubungkan disk lama dan mem-boot mesin ini dari SystemRescueCd. Segala sesuatu di atas ditulis dari memori. Sekarang saya punya beberapa data. Berikut ini adalah output darimdadm --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

Tampaknya segala sesuatu telah berubah sejak boot terakhir. Jika saya membaca ini dengan benar sda2, sdb2 dan sdc2 berfungsi dan mengandung data yang disinkronkan dan sdd2 adalah cadangan. Saya ingat dengan jelas melihat 3 disk gagal tetapi ini adalah kabar baik. Namun array masih tidak berfungsi:

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 tampaknya diubah namanya menjadi md127. md125 dan md126 sangat aneh. Mereka harus menjadi satu array bukan dua. Itu dulu disebut md1. md2 benar-benar hilang tapi itu swap saya jadi saya tidak peduli.

Saya dapat memahami nama-nama yang berbeda dan itu tidak terlalu penting. Tetapi mengapa sebuah array dengan 3 disk "sinkronisasi aktif" tidak dapat dibaca? Dan ada apa dengan sdd2 berada di array yang terpisah?

Memperbarui

Saya mencoba yang berikut setelah mencadangkan superblok:

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

Sejauh ini baik. Karena sdd2 adalah cadangan, saya belum ingin menambahkannya.

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

Rupanya saya tidak bisa melakukan itu.

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>

Itu juga tidak berhasil. Mari kita coba dengan semua disk.

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>

Tidak berhasil Berdasarkan jawaban ini saya berencana untuk mencoba:

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

Apakah ini aman?

Memperbarui

Saya menerbitkan skrip parser superblock yang saya gunakan untuk membuat tabel itu di komentar saya. Mungkin seseorang akan merasakan manfaatnya. Terima kasih atas seluruh bantuan Anda.


Saya kira mdadm --re-addbukan yang Anda cari. Apakah Anda melakukan tes memori baru-baru ini? Apakah Anda memiliki pesan log yang terkait dengan kegagalan array?
Gilles 'SO- berhenti bersikap jahat'

@Gilles: Saya tidak punya log dari sebelum crash karena disimpan pada array yang gagal. Dan saya rasa saya tidak bisa memperbaikinya dengan antarmuka standar mdadm. Segala jenis operasi yang melibatkan sinkronisasi ulang tidak mungkin dilakukan dengan 1 dari 4 disk. Saya pikir 3 "gagal" disk berisi informasi yang cukup untuk mengembalikan semuanya. Misalnya saya bisa membacanya dengan dd. Yang "baik" mungkin tidak sinkron. Saya akan melakukan memtest tetapi mesin itu sekarang bekerja dengan sempurna dengan disk baru.
stribika

2
Apakah Anda mencoba menghentikan array dan memasang kembali yang baru dengan mdadm -A /dev/md1 /dev/sd{b,c,d}2(mungkin --force)? (Jika Anda belum melakukannya, cadangkan superblock terlebih dahulu.)
Gilles 'SO- stop being evil'

@Gilles: Saya memperbarui pertanyaan saya dengan informasi terkini. Apa yang saya butuhkan untuk membuat cadangan? Beberapa blok pertama disk atau ada alat khusus untuk ini?
stribika

@stribika: Superblock adalah blok 64kB penuh terakhir yang diselaraskan pada batas 64kB pada partisi. Saya tidak tahu bagaimana /dev/sdd2bisa dalam array yang terpisah walaupun memiliki UUID yang sama dengan sd{a,b,c}2.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:


12

Pertama periksa disk, coba jalankan smart selftest

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

Mungkin perlu beberapa jam untuk menyelesaikannya, tetapi periksa status tes setiap drive setiap beberapa menit, misalnya

smartctl -l selftest /dev/sda

Jika status disk melaporkan tidak selesai karena kesalahan baca, maka disk ini harus dianggap tidak aman untuk pemasangan kembali md1. Setelah selesai selftest, Anda dapat mulai mencoba menyusun kembali array Anda. Secara opsional, jika Anda ingin ekstra hati-hati, pindahkan disk ke komputer lain sebelum melanjutkan (hanya untuk ram buruk / pengontrol / dll).

Baru-baru ini, saya punya kasus persis seperti ini. Satu drive gagal, saya menambahkan kembali dalam array tetapi selama membangun kembali 3 dari 4 drive gagal sama sekali. Isi / proc / mdadm sama dengan milik Anda (mungkin tidak dalam urutan yang sama)

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

Tapi saya beruntung dan memasang kembali susunan dengan ini

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

Dengan melihat --examine output yang Anda berikan, saya dapat memberitahu skenario berikut terjadi: sdd2 gagal, Anda menghapusnya dan menambahkannya kembali, Jadi itu menjadi drive cadangan yang mencoba untuk membangun kembali. Tetapi saat membangun kembali sda2 gagal dan kemudian sdb2 gagal. Jadi penghitung peristiwa lebih besar di sdc2 dan sdd2 yang merupakan drive aktif terakhir dalam array (meskipun sdd tidak memiliki kesempatan untuk membangun kembali dan itu adalah yang paling usang dari semua). Karena perbedaan dalam penghitung acara, --force akan diperlukan. Jadi, Anda juga bisa mencoba ini

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

Untuk menyimpulkan, saya pikir jika perintah di atas gagal, Anda harus mencoba membuat ulang array seperti ini:

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

Jika Anda melakukan itu --create, missingbagian itu penting, jangan mencoba untuk menambahkan drive keempat dalam array, karena konstruksi akan dimulai dan Anda akan kehilangan data Anda . Membuat array dengan drive yang hilang, tidak akan mengubah kontennya dan Anda akan memiliki kesempatan untuk mendapatkan salinan di tempat lain (raid5 tidak bekerja dengan cara yang sama seperti raid1).

Jika gagal memunculkan array, coba solusi ini (skrip perl) di sini Membuat array

Jika akhirnya Anda berhasil membawa array ke atas, sistem file akan menjadi najis dan mungkin rusak. Jika satu disk gagal selama pembangunan kembali, diharapkan array akan berhenti dan membeku tidak melakukan penulisan ke disk lain. Dalam hal ini dua disk gagal, mungkin sistem sedang melakukan permintaan tulis yang tidak dapat diselesaikan, jadi ada kemungkinan kecil Anda kehilangan beberapa data, tetapi juga kemungkinan Anda tidak akan pernah melihatnya :-)

sunting: beberapa klarifikasi ditambahkan.


mdadm --assemble /dev/md1 /dev/sd[abc]2 --forcebekerja. Terima kasih. Anda menyimpan data saya! :) Saya tidak akan mencoba untuk menambahkan disk keempat karena 3 pertama tidak sebaik yang saya pikir sebelumnya. Selftest yang terungkap masing-masing memiliki 10-20 blok yang tidak dapat dibaca. Saya merasa bodoh karena tidak memeriksa ini dulu.
stribika

Terima kasih atas jawaban yang komprehensif. Dihadiahi 50 repetisi dari saya.
0xC0000022L

Permute_array.pl bekerja bagus untuk saya. Catatan untuk pengguna lain: larik perangkat yang diharapkannya lihat mencakup semua drive, termasuk semua drive mati yang mungkin telah Anda hapus.

"Jika Anda melakukan --create, bagian yang hilang itu penting, jangan mencoba menambahkan drive keempat dalam array, karena saat itu konstruksi akan dimulai dan Anda akan kehilangan data Anda." - BS. Jika Anda menentukan --assume-clean(Anda melakukannya) itu tidak akan.
poige

1

Saya mengalami banyak masalah saat saya menggunakan mdadm, tetapi tidak pernah kehilangan data. Anda harus menghindari --forceopsi tersebut, atau menggunakannya dengan sangat hati-hati, karena Anda dapat kehilangan semua data Anda. Silakan posting Anda/etc/mdadm/mdadm.conf

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.