FreeBSD. Изображение с сайта: wallpapercave.com
Menu
Perl & JS

RAID в FreeBSD с помощью gmirror


Проблемы с HPE Dynamic SmartArray B140i и их лечение

MILKOV.RU

Блог / Perl & JS
RAID в FreeBSD с помощью gmirror — Проблемы с HPE Dynamic SmartArray B140i и их лечение

На фото: FreeBSD. Изображение с сайта: wallpapercave.com
Связанные материалы:


Не скажу что часто, но иногда приходится устанавливать FreeBSD и на этот раз судьба свела меня с HP ProLiant DL20 Gen9 - не сказать, что супер-навороченным сервером, но по количеству потраченного времени и нервов начинающего претендовать на это гордое звание. Сразу оговорюсь, дальнейшее повествование будет посвящено лишь одной проблеме, указанной в заголовке - теперь же обо всём по-порядку.

Итак, обнаружив на www.freebsd.org свежий FreeBSD 10.3-RELEASE, я вооружился флешкой на 1 гигабайт, Win32DiskImager и, получив менее чем через четверть часа всё необходимое для инсталляции, воткнул вилку в розетку, нажал кнопку и вскоре обнаружил, что устанавливать операционку, мягко сказать, некуда. Доступное место, которое мне предложил инсталлятор, было всего одно и на самом деле являлось моей флешкой.

Недолгий поиск ответа в интернете практически сразу убедил меня, что подружить фирменный HP-шный Smart Array (в моём случае он назывался HPE Dynamic SmartArray B140i Raid Controller) с FreeBSD у меня точно не получится. Для решения проблемы необходимо было создавать RAID-массив программными средствами FreeBSD (B140i, кстати, тоже был программным, а не аппаратным контроллером) при однозначном отключении чуда инженерной мысли от Hewlett Packard. 

С этого я и начал, вырубив Dynamic Smart Array в BIOS (System Options: SATA Controller Options), а точнее поменяв его на поддержку обычных контроллеров SATA. Чтобы окончательно включить Intel(R) SATA Controller #1 (System Options: PCI Device Enable/Disable), пришлось разок перегрузиться и снова зайти в BIOS и, да - ещё разок перегрузиться.

Результатом данных операций стало то, что инсталлятор наконец-то "увидел" оба жёстких диска, а очередной дилеммой стал выбор варианта создания "зеркала". Потратив пару часов на изучение "матчасти" и вдоволь начитавшись про ZFS, gstripe и, наконец, gmirror, я принял решение остановиться на последнем варианте, тем более, что под руку подвернулась достаточно подробная инструкция, которая, забегая вперёд, и легла в основу всех моих последующих действий, правда, с небольшой оговоркой.

Перенесение существующей инсталляции FreeBSD на gmirror

Идея заключалась в следующем:

1. Установить на первом диске FreeBSD
2. Создать средствами модуля geom_mirror логическое зеркало на втором диске
3. Вручную прописать на втором диске разделы и перетащить туда систему с первого
4. Загрузиться со второго диска и подключить в зеркало первый диск

Первые три пункта прошли "на ура", а вот, с четвёртым пришлось повозиться. Теперь весь процесс по шагам (диски: /dev/ada0 и /dev/ada1)

Устанавливаем FreeBSD на первый диск

Стандартная (дефолтная установка), при которой система располагается в трёх разделах:

ada0p1    freebsd-boot
ada0p2    freebsd-ufs    /
ada0p3    freebsd-swap

Создаём "зеркало"

Загружаем модуль geom_mirror:

# kldload geom_mirror

Прописываем соответствующую строчку в автозагрузку:

# echo `geom_mirror_load="YES"` >> /boot/loader.conf

Проверяем, загрузился ли модуль:

# kldstat

Создаём зеркало на ada1:

# gmirror label m0 ada1

Проверяем:

# gmirror list

Теперь вместо физического /dev/ada1 мы будем работать с логическим "зеркалом" /mirror/m0, первым и пока единственным компонентом которого и является этот (второй) диск 

Вручную переносим копию системы на "зеркало"

Создаём разделы на зеркале:

# gpart backup ada0 > /tmp/part.txt
# gpart restore mirror/m0 < /tmp/part.txt

Создаём загрузочную запись:

# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 mirror/m0

Форматируем и монтируем "корневой" раздел "зеркала":

# newfs -U /dev/mirror/m0p2
# mount /dev/mirror/m0p2 /mnt

Копируем систему с ada0 на "зеркало":

# cd /
# tar --one-file-system -cpf - . | (cd /mnt; tar -xvpf -)

Меняем в /etc/fstab на "зеркале" все "ada0" на "mirror/m0".

# vi /mnt/etc/fstab

Вроде всё готово и, следуя исходной инструкции, чтобы закончить процесс создания RAID-а осталось перезагрузиться со второго диска и добавить в "зеркало" первый. Но если ваш сервер оснащён современным интерфейсом UEFI, который пришёл на смену BIOS, то загрузиться со второго диска у Вас не получится. Не получилось и у меня, поэтому пришлось продолжить "пляски" и в итоге на помощь пришла вот эта статья.

Создаём загрузочную область EFI 

Не буду вдаваться в долгие рассуждения на тему особенностей нового интерфейса, особо любопытным рекомендую поиск, ленивым будет достаточно пройти по ссылке, приведенной выше. Остальным сообщаю, что решение на самом деле лежало под носом и загрузочный раздел у нас уже существовал, ведь как-то мы загрузились с первого диска, прежде чем начать "мутить" зеркала и копировать систему. Просто, скопировав "корневой" раздел, мы напрочь забыли скопировать и загрузочный. Поэтому сейчас будем восполнять пробелы.

Форматируем раздел (да, без Microsoft тут не обошлось):

# newfs_msdos /dev/mirrorE/m0p1

Монтируем разделы, создаём каталоги и копируем загрузчик EFI с первого диска в "зеркало":

# mount /dev/ada0p1 /mnt0
# mount /dev/mirror/m0p1 /mnt1
# mkdir -p /mnt1/EFI/BOOT
# cp /mnt0/EFI/BOOT/BOOTX64.EFI /mnt1/EFI/BOOT/BOOTX64.EFI

Вот теперь для счастливых обладателей UEFI всё готово к "ребуту". Размонтируем разделы и перегружаемся.

# umount -a
# shutdown -r now

Добавляем первый диск к "зеркалу"

Теперь осталось зайти в "Boot menu" или как оно там у нас называется и сказать серверу загрузиться со второго диска. Если всё сделано аккуратно, то FreeBSD успешно загрузится и нам останется лишь добавить первый диск в массив и подождать часиков шесть (у меня оба диска были по 2TB), пока они синхронизируются.

Проверяем из нужного ли места всё загрузилось (должно быть mirror/m0p2)

# mount

и swap-раздел (должен быть mirror/m0p3)

# swapinfo

"Цепляем" первый диск к "зеркалу":

# gmirror insert m0 ada0

Время от времени проверяем статус "зеркала", пока первый диск не синхронизируется со вторым:

# gmirror status

По-хорошему стоит дождаться, пока диски полностью синхронизируются, и после этого можно перегрузиться и продолжить конфигурирование системы.