Зеркалирование системного диска

Приветствую всех. Сегодня я расскажу как создать RAID1 из системного и резервного винтов. Плюсы такого подхода налицо: вдруг чего случится с системным жестким диском, не охото заново все устанавливать, а так взял, да заменил сбойный винт и зеркало снова в строю, да и к тому же повысится скорость чтения (ведь данные будут идентичны на двух винтах, следовательно можно читать с обоих одновременно разные куски одного элемента ФС), хотя для меня это не самое важное, важнее надежность, да и хватает производительности существующей конфигурации, но все же это плюс. Ну такс начнем. Имеется: два винта и ОС FreeBSD 7.4.

Винты у меня определились так:

# ls /dev | grep ad
ad0
ad1

На винт ad0 установлена операционка. Сначала создадим зеркало:

# gmirror label -v -b round-robin gm0 /dev/ad0
gmirror: Can`t store metadata on /dev/ad0: Operation not permitted.

Что-то не пошло, лечится это просто:

# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16

Снова пробуем создать зеркало

# gmirror label -v -b round-robin gm0 /dev/ad0
Metadata value stored on ad0.
Done.

В этот раз получилось. Вот некоторые ключи, которые принимает команда gmirror label:

  • -b - алгоритм балансировки (доступные смотрите в мане).
  • -F - отключить синхронизацию после сбоев питания.
  • -n - отключить автосинхронизацию.
  • -v - выводить дополнительную информацию.

Чтобы изменить параметры зеркала (алгоритм балансировки, автосинхронизация и т.п.), используйте команду gmirror configure. Теперь правим /etc/fstab. До изменения он у меня выглядел так:

# Device      Mountpoint     FStype     Options     Dump     Pass#
/dev/ad0s1b   none           swap       sw          0        0
/dev/ad0s1a   /              ufs        rw          1        1
/dev/ad0s1e   /tmp           ufs        rw          2        2
/dev/ad0s1f   /usr           ufs        rw          2        2
/dev/ad0s1d   /var           ufs        rw          2        2

После изменений стал таким:

# Device              Mountpoint     FStype     Options     Dump     Pass#
/dev/mirror/gm0s1b    none           swap       sw          0        0
/dev/mirror/gm0s1a    /              ufs        rw          1        1
/dev/mirror/gm0s1e    /tmp           ufs        rw          2        2
/dev/mirror/gm0s1f    /usr           ufs        rw          2        2
/dev/mirror/gm0s1d    /var           ufs        rw          2        2

Чтобы при загрузке ядро смогло обнаружить зеркало, нужно загрузить соответствующий модуль на этапе загрузки ядра, для этого добавляем в /boot/loader.conf следующую запись:

echo 'geom_mirror_load="YES"' >> /boot/loader.conf

Перезагружаемся. Если загрузка не удалась, то подгружаем корневой раздел ручками и доводим fstab до правильного состояния. Загрузившись, можно глянуть состояние зеркала и информацию о носителях:

# gmirror status gm0
        Name            Status               Components
mirror/gm0            COMPLETE     ad0
# gmirror list gm0
Geom name: gm0
State: COMPLETE
Components: 1
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 2730824176
Providers:
1. Name: mirror/gm0
   Mediasize: 21474835968 (20G)
   Sectorsize: 512
   Mode: r5w5e6
Consumers:
1. Name: ad0
   Mediasize: 21474836480 (20G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: NONE
   GenID: 0
   SyncID: 1
   ID: 135984322

Теперь можно добавить второй винт в зеркало. Делается это так:

# gmirror insert -v gm0 /dev/ad1
GEOM_MIRROR: Device gm0: rebuildingprovider ad1.
Done.

После этого зеркало будет синхронизироваться, состояние смотреть командой gmirror status gm0:

# gmirror status gm0
        Name            Status                Components
mirror/gm0            DEGRADED                       ad0
                                                     ad1 (10%)

Теперь ждем, когда закончится синхронизация зеркала, а после окончания синхронизации система на первую консоль выкинет сообщение "GEOM_MIRROR: Device gm0: rebuilding provider ad1 finished." и получится что-то подобное:

# gmirror status gm0
        Name            Status               Components
mirror/gm0            COMPLETE                      ad0
                                                    ad1
# gmirror list gm0
Geom name: gm0
State: COMPLETE
Components: 2
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 2730824176
Providers:
1. Name: mirror/gm0
   Mediasize: 21474835968 (20G)
   Sectorsize: 512
   Mode: r5w5e6
Consumers:
1. Name: ad0
   Mediasize: 21474836480 (20G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: NONE
   GenID: 0
   SyncID: 1
   ID: 135984322
2. Name: ad1
   Mediasize: 21474836480 (20G)
   Sectorsize: 512
   Mode: r1w1e1
   State: ACTIVE
   Priority: 0
   Flags: NONE
   GenID: 0
   SyncID: 1
   ID: 2544032587

На этом настройка закончена, теперь можно не беспокоиться за системный винт - даже если что-то с ним случится, то подстрахует второй в зеркале. Если винт вышел из строя, то заменяете винт, говорите зеркалу "забыть" о сбойном винте (команда gmirror forget) и обычным способом добавляете новый винт в зеркало.

P.S. Общий совет при создании рэйдов: лучше сначала разметить винт - сделать один большой раздел, но чуть меньше объема жесткого диска на 1-2Мб. А потом уже размечать так, как вам нужно массив. Это полезно тем, что винты из разных серий одного производителя или винты разных производителей одинакового объема могут немного различаться в количестве секторов, хорошо когда на втором винте их больше, а если их меньше, то такой винт в зеркало добавить не получится, поэтому намеренное уменьшение объема под рэйд массив избавит от подобных проблем.

Alexandr (не проверено)

Хорошая статья!
У меня сложилась ситуация когда надо сделать откат от gm0 в ad4.
было бы хорошо найти описание каким образом это делается.

nekit

Ничего сложного, просто порядок действий будет обратный:

  1. Оставляем в зеркале один основной винт (gmirror remove)
  2. Приводим /etc/fstab в необходимый вид
  3. Удаляем модуль geom_mirror из автозагрузки
  4. Перезагружаемся
  5. Устанавливаем kern.geom.debugflags равным 16
  6. Стираем метаданные с основного винта командой gmirror clear

Только сначала лучше потренироваться на тестовой машине.

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Яндекс.Метрика