mdadm: невозможно удалить компоненты в RAID 1

14

У меня есть / boot раздел в массиве RAID 1 с использованием mdadm. Этот массив несколько раз ухудшался в прошлом, и каждый раз, когда я удаляю физический диск, добавляю новый, приводлю массив в нормальное состояние, он использует новую букву диска. Оставить старый все еще в массиве и не удалось. Я не могу удалить все компоненты, которые больше не существуют.

[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_]

Вот что я пытался удалить несуществующие диски и разделы. Например, /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

То, что 8:49я считаю, относится к старшему и младшему числу, показанным на рисунке --detail, но я не совсем уверен, куда идти дальше. Я пытаюсь избежать перезагрузки или перезапуска 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

Примечание . Массив на данный момент законно поврежден, и я получаю новый диск, пока мы говорим. Однако, как вы можете видеть выше, это не должно иметь значения. Я все еще должен быть в состоянии удалить /dev/sdb1из этого массива.

Саджан Парих
источник
Вам не нужно --force удалять диск в состоянии «удалено», и это может скрыть более серьезную проблему. Оставь это.

Ответы:

16

Это потому, что узлы устройства больше не существуют в вашей системе (вероятно, udev удалил их, когда диск умер). Вы должны быть в состоянии удалить их, используя ключевое слово failedили detachedвместо:

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

Если ваша версия mdadm слишком старая, чтобы сделать это, вы, возможно, сможете заставить ее работать, mknodесли устройство снова будет существовать. Или, если честно, просто проигнорируйте это - это на самом деле не проблема и должно исчезнуть при следующей перезагрузке.

derobert
источник
Я попытался использовать ключевые слова, вы можете увидеть результат, который он дал мне в оригинальном сообщении. Я посмотрю на mknod. Да, это, вероятно, не проблема, но я ОКР, лол.
Саджан Парих
Да, я использовал mknod, чтобы сделать это, и это сработало.
Саджан Парих
@SajanParikh действительно, почему-то я пропустил строки, показывающие, что вы уже пробовали, потерпели неудачу и отсоединились. Рад, что Макнод работал.
Дероберт
6

В итоге я использовал mknod@derobert, предложив создать устройства, которые mdadmискали. Я попробовал старшие / младшие числа, которые mdadm говорил мне, что не может найти с различными буквами диска, которые я пытался удалить, пока это не сработало.

mknod /dev/sde1 b 8 17

Затем мне пришлось использовать --forceопцию, чтобы заставить его удалить компонент.

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

Затем я удалил созданное блочное устройство.

rm /dev/sde1
Саджан Парих
источник
Хм ... 8:17 это sdb1. (8:65 - это sde1) Но этого тоже не хватало, так что я думаю, что это работает ...
Дероберт
Это не сработало для меня, mdadmпродолжал говорить: «устройство или ресурс занят», но это заставило меня попытаться накормить его не поддельным блочным устройством, а «истинным» блочным устройством, таким как монтированное в петлю изображение. В этот момент я обнаружил, что у меня был устаревший /dev/loopфайл, который все еще использовал файл в поврежденном массиве. Я отключил его и, наконец, mdadmпозволил мне остановить массив. Horay! Для всех, кто читает это, всегда есть логическое объяснение mdadmтого, чтобы быть таким рывком, так что ищите устаревший обработчик процесса / файла / точки монтирования / nfs / open bash / loopback device / etc. все еще использую ухудшенный массив. :)
Avio
Я смог использовать одинаковые старшие и младшие версии (в моем случае 8:18) для создания поддельного устройства / dev / sdb2. После этого mdadm --remove удалил устаревшую запись / dev / sdb2 из / proc / mdstat. Не забудьте rm / dev / sdb2 после успешного действия --remove.
ILIV
3

Вы также можете исправить это, просто уменьшив количество дисков в массиве:

В моем случае у меня есть массив raid-1 /dev/md0с /dev/sda1и "удален". Я просто сжал его, чтобы использовать только один диск:

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

После этого удалено было действительно удалено (больше не было удаленных строк mdadm --detail)

Limalski
источник
Вы должны быть осторожны с этим подходом, хотя. Хорошо поймите, с каким типом RAID вы работаете, прежде чем модифицировать --raid-devices.
ILIV