mdadm: tidak dapat menghapus komponen dalam RAID 1

14

Saya memiliki partisi / boot dalam array RAID 1 menggunakan mdadm. Array ini telah mengalami degradasi beberapa kali di masa lalu, dan setiap kali saya menghapus drive fisik, menambahkan yang baru, membawa array menjadi normal, ia menggunakan huruf drive yang baru. Meninggalkan yang lama masih ada dalam array dan gagal. Sepertinya saya tidak bisa menghapus semua komponen yang sudah tidak ada.

[root@xxx ~]# cat /proc/mdstat 
Personalities : [raid1] 
md0 : active raid1 sdg1[10] sde1[8](F) sdb1[7](F) sdd1[6](F) sda1[4] sdc1[5]
      358336 blocks super 1.0 [4/3] [UUU_]

Inilah yang saya coba untuk menghapus drive dan partisi yang tidak ada. Sebagai contoh /dev/sdb1,.

[root@xxx ~]# mdadm /dev/md0 -r /dev/sdb1
mdadm: Cannot find /dev/sdb1: No such file or directory
[root@xxx ~]# mdadm /dev/md0 -r faulty
mdadm: Cannot find 8:49: No such file or directory
[root@xxx ~]# mdadm /dev/md0 -r detached
mdadm: Cannot find 8:49: No such file or directory

Yang 8:49saya percaya merujuk pada angka besar dan kecil yang ditunjukkan --detail, tetapi saya tidak yakin ke mana harus pergi dari sini. Saya mencoba menghindari reboot atau memulai ulang mdadm.

[root@xxx ~]# mdadm --detail /dev/md0 
/dev/md0:
        Version : 1.0
  Creation Time : Thu Aug  8 18:07:35 2013
     Raid Level : raid1
     Array Size : 358336 (350.00 MiB 366.94 MB)
  Used Dev Size : 358336 (350.00 MiB 366.94 MB)
   Raid Devices : 4
  Total Devices : 6
    Persistence : Superblock is persistent

    Update Time : Sat Apr 18 16:44:20 2015
          State : clean, degraded 
 Active Devices : 3
Working Devices : 3
 Failed Devices : 3
  Spare Devices : 0

           Name : xxx.xxxxx.xxx:0  (local to host xxx.xxxxx.xxx)
           UUID : 991eecd2:5662b800:34ba96a4:2039d40a
         Events : 694

    Number   Major   Minor   RaidDevice State
       4       8        1        0      active sync   /dev/sda1
      10       8       97        1      active sync   /dev/sdg1
       5       8       33        2      active sync   /dev/sdc1
       6       0        0        6      removed

       6       8       49        -      faulty
       7       8       17        -      faulty
       8       8       65        -      faulty

Catatan: Array terdegradasi secara sah sekarang dan saya mendapatkan drive baru di sana saat kita bicara. Namun, seperti yang Anda lihat di atas, itu tidak masalah. Saya masih bisa menghapus /dev/sdb1dari array ini.

Sajan Parikh
sumber
Anda tidak perlu - memaksa untuk menghapus disk dalam keadaan "dihapus", dan mungkin menyembunyikan masalah yang lebih serius. Biarkan saja.

Jawaban:

16

Itu karena node perangkat tidak lagi ada di sistem Anda (mungkin udev menghapusnya ketika drive mati). Anda harus dapat menghapusnya dengan menggunakan kata kunci failedatau detachedsebagai gantinya:

mdadm -r /dev/md0 failed     # all failed devices
mdadm -r /dev/md0 detached   # failed ones that aren't in /dev anymore

Jika versi mdadm Anda terlalu tua untuk melakukan itu, Anda mungkin bisa membuatnya berfungsi dengan mknodmembuat perangkat ada lagi. Atau, jujur ​​saja, abaikan saja — itu tidak benar-benar masalah, dan akan hilang begitu Anda reboot lagi.

derobert
sumber
Saya sudah mencoba menggunakan kata kunci, Anda dapat melihat output yang diberikannya pada posting asli. Saya akan lihat mknod. Ya, itu mungkin bukan masalah, tapi aku OCD, lol.
Sajan Parikh
Yap, saya menggunakan mknod untuk menyelesaikan ini dan itu berhasil.
Sajan Parikh
@SajanParikh memang, entah bagaimana saya melewatkan garis yang menunjukkan Anda sudah mencoba gagal dan terlepas. Senang bahwa mknod bekerja.
derobert
6

Apa yang akhirnya saya lakukan adalah menggunakan mknodseperti @derobert yang disarankan untuk membuat perangkat yang mdadmdicari. Saya mencoba nomor utama / minor yang dikatakan mdadm kepada saya tidak dapat ditemukan dengan huruf drive yang berbeda yang saya coba hapus sampai berhasil.

mknod /dev/sde1 b 8 17

Kemudian saya harus menggunakan --forceopsi untuk menghapus komponen.

mdadm /dev/md0 --remove --force /dev/sde1

Kemudian, saya menghapus perangkat blok yang dibuat itu.

rm /dev/sde1
Sajan Parikh
sumber
Hmm ... 8:17 adalah sdb1. (8:65 adalah sde1) Tetapi yang satu itu juga hilang, jadi saya kira itu berhasil ...
derobert
Ini tidak berhasil untuk saya, mdadmterus berkata: "perangkat atau sumber daya sibuk", tetapi ini membuat saya mencoba memberinya makan bukan dengan perangkat blok palsu, tetapi dengan perangkat blok "benar" seperti gambar yang dipasang di loopback. Pada titik ini, saya menemukan bahwa saya memiliki basi /dev/loopyang masih menggunakan file pada array yang rusak. Saya melepaskannya dan akhirnya mdadmmembiarkan saya menghentikan array. Horay! Untuk semua orang yang membaca ini, selalu ada penjelasan logis untuk mdadmmenjadi brengsek, jadi cari proses basi / file / mountpoint / nfs handler / open bash / loopback device / etc. masih menggunakan array yang rusak. :)
Avio
Saya dapat menggunakan versi mayor dan minor yang sama (8:18 dalam kasus saya) untuk mknod perangkat palsu / dev / sdb2. Setelah itu, mdadm --hapus catatan basi yang sudah dihapus dari / dev / sdb2 dari / proc / mdstat. Ingatlah untuk rm / dev / sdb2 setelah aksi --remove berhasil.
ILIV
3

Anda juga bisa memperbaiki hanya dengan menurunkan jumlah disk dalam array:

Dalam kasus saya, saya memiliki raid-1 array /dev/md0dengan /dev/sda1dan "dihapus". Saya cukup menyusutkannya untuk menggunakan satu drive saja:

mdadm -G /dev/md0 --raid-devices=1 --force

Setelah itu dihapus benar-benar dihapus (tidak ada garis yang dihapus lagi di mdadm --detail)

Limalski
sumber
Anda harus berhati-hati dengan pendekatan ini. Pahami dengan baik jenis RAID yang Anda hadapi sebelum memodifikasi --raid-devices.
ILIV