Ситуация: есть RAID-массив из двух SATA-дисков в зеркале, созданном с помощью gmirror под FreeBSD.

Необходимо заменить один диск, не останавливая работы сервера.

Капля теории


На тему собственно создания зеркала на GEOM есть много статей.

При создании зеркала gmirror синхронизирует ��се данные, включая MBR, гласит http://people.freebsd.org/~rse/mirror/ (раздел Summary -> GEOM mirror on whole disk). Если при отказе диска сервер умер, можно загрузиться с оставшегося диска, вне зависимости от того, какой диск вышел из строя. Важно только при загрузке правильно выбрать, с какого диска грузиться.

При работе массива команда

# gmirror list

практически постоянно показывает Flags: DIRTY. Это нормально: флаг выставляется, когда на диск записывается информация, и в этот момент состояние данных на дисках массива не совпадает. Если на диск постоянно ведётся запись, флаг DIRTY постоянно будет выставлен.

Процедура замены


Предположим, в массиве gm0 присутствуют два диска: da0 и da1. Заменить нужно da0.

В описываемой ситуации использовался camcontrol. В зависимости от контроллера, через который подключены винты, вместо него может понадобиться atacontrol.
  1. Выводим диск из зеркала:

    # gmirror remove gm0 da0
    

  2. Определяем, какой диск физически нужно заменить — у выведенного из зеркала диска не будет работать индикатор активности.
  3. Не выключая сервер, вытаскиваем диск.
  4. Здесь возможно следующее: сервер несколько секунд ничего не понимает, а потом на полминуты впадает в кому. Нужно немного подождать.
  5. После этого команды

    # geom disk list
    # gmirror list

    помогут обнаружить, что одного диска нет.
  6. Если не был выполнен пункт №1, просим gmirror забыть обо всех дисках, которые сейчас неактивны в зеркале:

    # gmirror forget gm0

    gmirror обнаруживает, что da0 нет и забывает про него.
  7. Вставляем новый диск (желательно идентичный тому, с которым в паре он будет работать, вплоть до модели).
  8. Сканируем шину, чтобы система обнаружила новый подключённый диск:

    # camcontrol devlist           # что имеем сейчас?
    # camcontrol rescan all        # сканируем
    # camcontrol devlist           # что получилось?
    

  9. Добавляем в массив новый da0:

    # gmirror insert gm0 da0

  10. gmirror обнаружит новый диск и начнёт синхронизацию данных. Смотрим состав массива:

    # gmirror list

  11. Не пугаемся, если нам кажется, что синхронизация идёт не в том направлении :) Если заменялся da0, то теперь он в списке ПОСЛЕ da1, а не ДО, как был раньше.
  12. Испытываем счастье.