Не скажу что часто, но иногда приходится устанавливать 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
По-хорошему стоит дождаться, пока диски полностью синхронизируются, и после этого можно перегрузиться и продолжить конфигурирование системы.