На днях понадобилось хранить большой объём данных, да так, чтобы максимально надежно. По сей день использовалось соaтовое зеркало, но существующего объёма уже не хватало, и решено было соорудить RAID5 из трёх дисков по терабайту. В моём случае избыточность составит 1/3 против 1/2 (зеркало).
Погуглив, нормальных руководств по настройке софтового рейда на FreeBSD не нашел. Поэтому решил написать сам, то, что у меня получилось.
Судя по тому, что мне удалось узнать, FreeBSD поддерживает организацию RAID5 двумя менеджерами дискового пространства: VINUM и GEOM.
Попробуем каждый из них:
I. VINUM
Начиная с FreeBSD5, VINUM была переписана для совместимости с архитектурой GEOM, и теперь новая подсистема называется GVINUM, а модуль ядра сменил название с vinum.ko на geom_vinum.ko.
Создадим директорию, к которой будем монтировать наш RAID5:
Теперь создаём конфигурационный файл нашего массива(расположить его можно где угодно):
После этого непосредственно конфигурируем наш массив(как я говорил, в моем случае будет 3 диска по терабайту):
Пишем в файле следующее:
Где:
— 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 массив:
Создаётся устройство /dev/gvinum/raid5. На нём необходимо создать файловую систему. Создаём:
Стандартное ядро FreeBSD(GENERIC) не включает Vinum. Можно пересобрать ядро с поддержкой Vinum, но этого делать не рекомендуют. Обычный способ активации Vinum — загрузка модуля для ядра (kld). Так и поступим, только использовать команду kldload не будем, да и нет необходимости, при первом вызове gvinum проверит наличие поддержки Vinum в ядре и при необходимости загрузит модуль автоматически. Я сделаю так, чтобы модуль Vinum был доступен на этапе загрузки, для этого делаем так:
И последний момент, нужно смонтировать наш массив (Точку монтирования мы указываем /raid5, ту, что создали изначально):
Перегружаемся и всё должно работать.
… У меня сервер уходит в Fatal trap 12(Kernel panic) и перегружается до бесконечности. Ничего страшного. Выключаем, ждём 5 минут и включаем, если не получится, выключаем, ждём ещё 5 минут и включаем, в конце концов, включается всё норм! Называется размечтался… 1t = 1024G, смотрю свой диск… а там всего 953869m… В общем, нужно в конфиге уменьшить размер — len! И после этого всё замечательно работает!
Можно выводить диски из массива и т.д., но как-то долго… проще сбросить конфиг:
На что, он нас спрашивает, вы, мол, в своё уме? подтвердите, что вы это делаете осмысленно! И просит ввести текст «NO FUTURE», ну что ж, вводим:
Я поменял в конфиге размеры дисков на:
После этого, повторяем команды:
Перегружаемся ещё раз… И вуаля! Всё работает!
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», поэтому переходим в папку с источниками:
И скачиваем архив:
Архив необходимо распаковать. Действуем:
Архив распакован, переходим к процессу инсталляции. Первым делом необходимо собрать модуль. Переходим в папку с конфигом:
И запускаем компиляцию:
упс… у меня вылезли ошибки… читаем… пробуем исправить… Для этого делаем следующее:
И правим в файле 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, так что делаем так.
После того как исправили, снова делаем компиляцию модуля:
Появляется нужный нам файл: "*geom_raid5.ko". Его необходимо скопировать ко всем модулям. Копируем:
Теперь устанавливаем сам geom_raid5:
Собственно после инсталляции GEOM_RAID5 собираем сам RAID массив:
И создаём устройство:
Создаётся устройство /dev/raid5/graid5. На нём необходимо создать файловую систему. Создаём:
Создаём точку монтирования:
Добавляем запись в /etc/fstab, для автоматического монтирования нашего массива RAID5 при загрузке системы:
Не забываем добавить загрузку модуля при старте системы:
P.S. В конечном итоге остановил свой выбор на GVINUM. В основном из-за того, что он входит в состав FreeBSD, а разработчики, раз решили, что GEOM_RAID5 ещё рано(или уже поздно) входить в релиз, то значит так и есть. Потестил GVINUM на крах(отключением питания и отсоединением шлейфа от одного из дисков в режимах чтение\запись, после этого записывал\удалял данные с битого массива, перегружался, добавлял снова диск, восстанавливал всё работает замечательно!… но это уже тема для другой статьи...)
Погуглив, нормальных руководств по настройке софтового рейда на 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 на крах(отключением питания и отсоединением шлейфа от одного из дисков в режимах чтение\запись, после этого записывал\удалял данные с битого массива, перегружался, добавлял снова диск, восстанавливал всё работает замечательно!… но это уже тема для другой статьи...)