На днях понадобилось хранить большой объём данных, да так, чтобы максимально надежно. По сей день использовалось соaтовое зеркало, но существующего объёма уже не хватало, и решено было соорудить RAID5 из трёх дисков по терабайту. В моём случае избыточность составит 1/3 против 1/2 (зеркало). Погуглив, нормальных руководств по настройке софтового рейда на FreeBSD не нашел. Поэтому решил написать сам, то, что у меня получилось. Судя по тому, что мне удалось узнать, FreeBSD поддерживает организацию RAID5 двумя менеджерами дискового пространства: VINUM и GEOM. Попробуем каждый из них:I. VINUM. Начиная с FreeBSD5, VINUM была переписана для совместимости с архитектурой GEOM, и теперь новая подсистема называется GVINUM, а модуль ядра сменил название с vinum.ko на geom_vinum.ko. Создадим директорию, к которой будем монтировать наш 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 ! И после этого всё замечательно работает!!! Можно выводить диски из массива и т.д., но как-то долго... проще сбросить конфиг:
На что, он нас спрашивает, вы, мол, в своё уме? подтвердите, что вы это делаете осмысленно! И просит ввести текст "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: http://wgboome.homepage.t-online.de./geom_raid5.tbz geom_raid5 TNG: http://wgboome.homepage.t-online.de./geom_raid5-eff.tbz geom_raid5 PP: http://wgboome.homepage.t-online.de./geom_raid5-pp.tbz Я выбрал "geom_raid5 ", поэтому переходим в папку с источниками:
И скачиваем архив:
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# cd /usr/src/sys/geom/raid5
И правим в файле g_raid5.c (если у вас ошибки будут такие же как и у меня) кому каким редактором удобнее:1. Ошибка: в строке № 2015 в функции "[i]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_cre ate 4. Ошибка: в строке № 2639 нету описания функции "kthread_create " исправляем: меняем в строке № 2639 kthread_create (остальное не трогаем ), наkproc_create Примечание: Ошибка 4 другая, и ссылается на строку 2635, но изменив строку 2635 необходимо изменить и 2639, так что делаем так.[/i] После того как исправили,снова делаем компиляцию модуля:
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
И создаём устройство:
Создаётся устройство /dev/raid5/graid5 . На нём необходимо создать файловую систему. Создаём:
snap# newfs /dev/raid5/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 на крах(отключением питания и отсоединением шлейфа от одного из дисков в режимах чтение\запись, после этого записывал\удалял данные с битого массива, перегружался, добавлял снова диск, восстанавливал всё работает замечательно! ...но это уже тема для другой статьи...)