null

Загрузка FreeBSD 10 UEFI с ZFS и Windows в dualboot

Приобрёл я себе как-то ноутбук Asus N56JK, внутри которого вместо привычного BIOS установлен новомодный UEFI.
Большинство людей ограничивается тем, что выключают SecureBoot, включают CSM (это efi программка, которая эмулирует из себя legacy boot) и накатывают парк систем по старинке. Но этот путь не для нас.
Рассказать мне хочется о том, как же всё-таки установить и добиться загрузки FreeBSD 10 именно через UEFI, благо EFI-загрузчик они всё-таки доделали.
Из требований: красота и дуал-бут с Windows 8.1 enterprise.
Вкратце опишу как же работает UEFI с точки зрения пользователя. Во-первых, после включения компьютера проходит всё тот-же POST, только под другим соусом. Во многих UEFI его можно урезать до минимума, чтобы опросом (и диагностикой) устройств занималось ядро ОС во время загрузки. Дальше, если внезапно EFI-раздела на системе не оказалось, включается режим совместимости и всё работает по старым и объезженным сценариям. Но это не наш случай ;) У нас же GPT с EFI разделом. После выполнения подготовительных процедур, UEFI выбирает стандартный 'boot option' - фактически, это efi программа, которой UEFI передаёт управление. По умолчанию, это /EFI/Boot/bootx64.efi. Эта программа загружает загрузчик ОС, который уже загружает ядро.
А теперь про мой конкретный кейс:
Установка лицензионной windows 8.1 создала мне на диске схему GPT, создала свой загрузочный раздел (ada0p1), создала EFI-раздел (ada0p2) и, собственно, раздел под диск C: (ada0p3). После установки, естественно, всё работало как по маслу. Не зря же корпорация Microsoft трудится над user-friendly софтом.
В принципе, если вы не собираетесь ставить винду, можно и руками создать EFI раздел, который по-сути представляет из себя обычный слайс с определённым типом (0xef) и на котором обычная fat32. Внутри него должна быть определённая иерархия, которая в общем случае ограничивается файлом /EFI/Boot/bootx64.efi.
Дальше я приступил к установке FreeBSD 10. И вот тут начались грабли. Так как разработчики добавили поддержку EFI начиная с r264095, а на установочном диске у нас (если мне не изменяет память) примерно r260890, пришлось временно включить в "BIOS-e" запуск CSM. Загрузившись с диска, я как-обычно выбрал shell и установил фрю без особых танцев. В качестве исключения стоит отметить, что UEFI загрузчик FreeBSD не умеет ZFS (который для меня критичен), поэтому когда создавал разделы с помощью gpart, добавил два раздела: -t freebsd-ufs -s 2048M ada0p4 (да, я очень люблю много ядер с дебаг-символами в /boot) и -t freebsd-zfs ada0p5.
Изначально я монтировал ada0p4 в /boot и не знал проблем, ибо грузиться приходилось руками, но позже походил по граблям с loader.efi и теперь ada0p4 я монтирую /altboot, а /boot ссылается на /altboot/boot. Поэтому советую сразу исходить из этого при установке системы.
Естественно, никаких загрузчиков в процессе инсталляции я не ставил.
После успешной установки базовой поставки фри (хоть и без загрузчика), рекомендую перезагрузиться. Грузиться мы будем опять с cdrom, но в меню загрузки нажмём кнопочку '3' и попадём в boot-prompt. А теперь, используя загруженный с CD загрузчик, загрузим свежепоставленную фрю:

unload
load disk0p4:/boot/kernel/kernel
load disk0p4:/boot/kernel/opensolaris.ko
load disk0p4:/boot/kernel/zfs.ko
set vfs.root.mountfrom="zfs:rpool/ROOT"
boot


Если на данном этапе загрузилась фря, значит дальше всё будет хорошо.
В первую очередь, обновим систему.

svnlite co svn://svn.freebsd.org/base/stable/10 /usr/src
cd /usr/src
make kernel-toolchain
# я указываю -j10 для сборки в 10 потоков
make -j10 buildworld
# тут кстати можно сразу кастомный конфиг ядра сделать. Мой называется KORG
make -j10 buildkernel KERNCONF=KORG
# ну а если собирать GENERIC, то просто
#make -j10 buildkernel
make installkernel KERNCONF=KORG
# или для GENERIC
#make installkernel


На этом шаге хэндбук рекомендует ``shutdown now'', но я привык к полноценному reboot в single-user (опять же, с cdrom, только "boot -s" вместо "boot")

mount -a
zfs mount -a
# запустим mergemaster в режиме pre-buildworld
mergemaster -p
make installworld
# остальной merge-инг
mergemaster -iF
cd /usr/src
# удалим старые ненужные файлы, которые могут приводить к конфликтам
make delete-old


Если всё прошло гладко, у нас есть свежая система (в моём случае, это r273924), но совсем без загрузчика.
Дальше я вспомнил про существование требований (см. выше) и отправился на поиски красивого загрузчика. Для себя я выбрал rEFInd, который можно скачать на SourceForge (даже в бинарном виде).
Установим загрузчики - rEFInd и фряшный.

mount_msdosfs /dev/ada0p2 /mnt
cd /mnt/EFI/
cp -r ...../refind .
cd refind
rm -rf *ia32*
cp refind.conf-sample refind.conf
# пока-что конфигурировать его не будем, об этом чуть позже
cd /mnt/EFI
mkdir FreeBSD
cp /usr/obj/usr/src/sys/boot/amd64/boot1.efi/boot1.efi FreeBSD/
# и, наконец, настроим loader.conf
cat <<@ >/boot/loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:rpool/ROOT"
@


И перезагрузимся в "BIOS". Разработчики ASUS настолько лояльны к "прочим операционным системам", что из останстки UEFI можно удобно управлять boot-option-ами. Я добавил опцию rEFInd, которая загружает /EFI/refind/refind_x64.efi и выбрал её как опцию "по-умолчанию". Если же у вас не ASUS, то единственное, что могу посоветовать, это загрузиться в какой-нибудь linux liveCD и воспользоваться efibootmgr для выполнения этой операции.

В общем, после перезагрузки должен загрузиться rEFInd и показать на выбор два значка: винду и фрю, каждый из которых должен загружать соответствующую систему.
Ну и на десерт - немного красивостей. Этот замечательный refind можно легко темизировать (достаточно найти в интернете красивую тему, или сделать свою, как это сделал я). Мой конфиг refind я решил выложить тут же:

timeout 10
hideui label singleuser safemode hwtest arrows hints editor
icons_dir korg
banner korg/bg.png
banner_scale fillscreen
selection_big korg/selection_big.png
selection_small korg/selection_small.png
resolution 1920 1080
showtools
scanfor manual

menuentry "FreeBSD" {
        icon /EFI/refind/korg/os_freebsd.png
        loader /EFI/FreeBSD/boot1.efi
}
menuentry "MustDIE" {
        icon /EFI/refind/korg/os_win.png
        loader /EFI/Boot/bootx64.efi
}


Когда всё ещё-раз будет проверено и настроено, нужно на забыть выключить CSM - он нам больше не понадобится.

korg

 

Коротко о себе

Работаю в компании Tune-IT, администрирую инфраструктуру компании и вычислительную сеть кафедры Вычислительной ТехникиСПбНИУ ИТМО.

Интересы: администрирование UNIX и UNIX-like систем и активного сетевого оборудования, написание shell- и perl-скриптов, изучение технологий глобальных сетей.
Люблю собирать GNU/Linux и FreeBSD, использовать тайлинговые оконные менеджеры и писать системный софт.

Ничего не найдено. n is 0