Pull to refresh

Настройка RAID5 на FreeBSD

На днях понадобилось хранить большой объём данных, да так, чтобы максимально надежно. По сей день использовалось соaтовое зеркало, но существующего объёма уже не хватало, и решено было соорудить RAID5 из трёх дисков по терабайту. В моём случае избыточность составит 1/3 против 1/2 (зеркало).

Погуглив, нормальных руководств по настройке софтового рейда на FreeBSD не нашел. Поэтому решил написать сам, то, что у меня получилось.

Судя по тому, что мне удалось узнать, FreeBSD поддерживает организацию RAID5 двумя менеджерами дискового пространства: VINUM и GEOM.

Попробуем каждый из них:

I. VINUM

Начиная с FreeBSD5, VINUM была переписана для совместимости с архитектурой GEOM, и теперь новая подсистема называется GVINUM, а модуль ядра сменил название с vinum.ko на geom_vinum.ko.

Создадим директорию, к которой будем монтировать наш RAID5:

snap# mkdir /raid5

Теперь создаём конфигурационный файл нашего массива(расположить его можно где угодно):

snap# touch /usr/local/gvinum.conf

После этого непосредственно конфигурируем наш массив(как я говорил, в моем случае будет 3 диска по терабайту):

snap# vi /usr/local/gvinum.conf

Пишем в файле следующее:

drive raid51 device /dev/ad5
drive raid52 device /dev/ad6
drive raid53 device /dev/ad7
volume raid5
plex org raid5 256k
sd len 1t drive raid51
sd len 1t drive raid52
sd len 1t drive raid53


Где:
— drive raid51/raid52/raid53 — это просто псевдонимы физических дисков (можно придумать любое). Используются чисто для удобства. С этими псевдонимами мы будем работать во всём файле и, поменяв физический диск, нам не придётся менять его название во всём конфигурационном файле, а достаточно лишь изменить в описании.
— volume raid5 — это виртуальный диск (можно придумать тоже любое название). Система его будет видеть как одно физическое устройство, хотя в моем случае это массив из 3х дисков с полезным объёмом равным ~2м терабайтам. Отображаться будет как /dev/gvinum/raid5 (Назовёте volume terminator, отображаться будет /dev/gvinum/terminator)
— plex — это набор, который предоставляет полное адресное пространство тома. Нам необходим набор RAID5, поэтому организуем набор RAID5: org raid5, причем организовываем со страйпом в 256кВ (судя по документации это самый оптимальный размер полосы).
— sd — это поддиски(SubDisk), VINUM может организовывать массивы не только из отдельных физических дисков, но и используя разделы UNIX. Я же использую 3 отдельных физических устройства, каждый по 1 терабайту, поэтому указываем размер: len 1t.

На этом описание конфигурационного файла закончилось. Теперь создаём сам RAID массив:

snap# gvinum create /usr/local/gvinum.conf

Создаётся устройство /dev/gvinum/raid5. На нём необходимо создать файловую систему. Создаём:

snap# newfs /dev/gvinum/raid5

Стандартное ядро FreeBSD(GENERIC) не включает Vinum. Можно пересобрать ядро с поддержкой Vinum, но этого делать не рекомендуют. Обычный способ активации Vinum — загрузка модуля для ядра (kld). Так и поступим, только использовать команду kldload не будем, да и нет необходимости, при первом вызове gvinum проверит наличие поддержки Vinum в ядре и при необходимости загрузит модуль автоматически. Я сделаю так, чтобы модуль Vinum был доступен на этапе загрузки, для этого делаем так:

snap# echo geom_vinum_load="YES" >> /boot/loader.conf

И последний момент, нужно смонтировать наш массив (Точку монтирования мы указываем /raid5, ту, что создали изначально):

snap# echo /dev/gvinum/raid5 /raid5 ufs rw 2 2 >> /etc/fstab

Перегружаемся и всё должно работать.

… У меня сервер уходит в Fatal trap 12(Kernel panic) и перегружается до бесконечности. Ничего страшного. Выключаем, ждём 5 минут и включаем, если не получится, выключаем, ждём ещё 5 минут и включаем, в конце концов, включается всё норм! Называется размечтался… 1t = 1024G, смотрю свой диск… а там всего 953869m… В общем, нужно в конфиге уменьшить размер — len! И после этого всё замечательно работает!

Можно выводить диски из массива и т.д., но как-то долго… проще сбросить конфиг:

snap# gvinum resetconfig

На что, он нас спрашивает, вы, мол, в своё уме? подтвердите, что вы это делаете осмысленно! И просит ввести текст «NO FUTURE», ну что ж, вводим:

Enter text -> NO FUTURE

Я поменял в конфиге размеры дисков на:

len 953869m

После этого, повторяем команды:

snap# gvinum create /usr/local/gvinum.conf
snap# newfs /dev/gvinum/raid5


Перегружаемся ещё раз… И вуаля! Всё работает!

II. GEOM

Пробуем второй вариант. GEOM RAID5 в FreeBSD не входит, поэтому придётся скачивать с сайта. На сайте видим, что есть 3 версии это:

— Компромисс скорости и использования памяти: geom_raid5
— Самая стабильная но и самая медленная: geom_raid5 TNG
— Улучшенная скорость но и памяти соответственно потребляет больше: geom_raid5 PP

Все версии доступны тут:

geom_raid5: wgboome.homepage.t-online.de./geom_raid5.tbz
geom_raid5 TNG: wgboome.homepage.t-online.de./geom_raid5-eff.tbz
geom_raid5 PP: wgboome.homepage.t-online.de./geom_raid5-pp.tbz

Я выбрал «geom_raid5», поэтому переходим в папку с источниками:

snap# cd /usr/src

И скачиваем архив:

snap# wget http://wgboome.homepage.t-online.de./geom_raid5.tbz

Архив необходимо распаковать. Действуем:

snap# tar -xf geom_raid5.tbz

Архив распакован, переходим к процессу инсталляции. Первым делом необходимо собрать модуль. Переходим в папку с конфигом:

snap# cd /usr/src/sys/modules/geom/geom_raid5

И запускаем компиляцию:

snap# make

упс… у меня вылезли ошибки… читаем… пробуем исправить… Для этого делаем следующее:

snap# cd /usr/src/sys/geom/raid5

И правим в файле g_raid5.c (если у вас ошибки будут такие же как и у меня) кому каким редактором удобнее:

1. Ошибка: в строке № 2015 в функции «kthread_exit» много аргументов
исправляем: меняем в строке № 2015 kthread_exit(0); на kthread_exit();
2. Ошибка: в строке № 2444 в функции «kthread_exit» много аргументов
исправляем: меняем в строке № 2444 kthread_exit(0); на kthread_exit();
3. Ошибка: в строке № 2635 нету описания функции «kthread_create»
исправляем: меняем в строке № 2635 kthread_create (остальное не трогаем), на kproc_create
4. Ошибка: в строке № 2639 нету описания функции «kthread_create»
исправляем: меняем в строке № 2639 kthread_create (остальное не трогаем), на kproc_create
Примечание: Ошибка 4 другая, и ссылается на строку 2635, но изменив строку 2635 необходимо изменить и 2639, так что делаем так.

После того как исправили, снова делаем компиляцию модуля:

snap# cd /usr/src/sys/modules/geom/geom_raid5
snap# make


Появляется нужный нам файл: "*geom_raid5.ko". Его необходимо скопировать ко всем модулям. Копируем:

snap# cp geom_raid5.ko /boot/kernel/geom_raid5.ko

Теперь устанавливаем сам geom_raid5:

snap# cd /usr/src/sbin/geom/class/raid5
snap# make && make install && make clean


Собственно после инсталляции GEOM_RAID5 собираем сам RAID массив:

snap# graid5 label -v -s 256k graid5 /dev/da0 /dev/da1 /dev/da2

И создаём устройство:

snap# graid5 load

Создаётся устройство /dev/raid5/graid5. На нём необходимо создать файловую систему. Создаём:

snap# newfs /dev/raid5/graid5

Создаём точку монтирования:

snap# mkdir /graid5

Добавляем запись в /etc/fstab, для автоматического монтирования нашего массива RAID5 при загрузке системы:

snap# echo /dev/raid5/graid5 /graid5 ufs rw 2 2 >> /etc/fstab

Не забываем добавить загрузку модуля при старте системы:

snap# echo 'geom_raid5_load="YES" >> /boot/loader.conf

P.S. В конечном итоге остановил свой выбор на GVINUM. В основном из-за того, что он входит в состав FreeBSD, а разработчики, раз решили, что GEOM_RAID5 ещё рано(или уже поздно) входить в релиз, то значит так и есть. Потестил GVINUM на крах(отключением питания и отсоединением шлейфа от одного из дисков в режимах чтение\запись, после этого записывал\удалял данные с битого массива, перегружался, добавлял снова диск, восстанавливал всё работает замечательно!… но это уже тема для другой статьи...)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.