devel писал(а):
НО:
пока не понятно как грузить систему без вот этого вот:
Код: Выделить всё
kfreebsd /@/boot/kernel/kernel
kfreebsd_module_elf /@/boot/kernel/opensolaris.ko
kfreebsd_module_elf /@/boot/kernel/zfs.ko
kfreebsd_module /@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
set kFreeBSD.vfs.root.mountfrom=zfs:z
не то чтобы я против такого способа (ведь он работает)... но имхо незачем grub'у знать столько интимных подробностей... лучше бы просто пнуть загрузчик, и пусть он сам уже отрабатывает, при этом правильно отработав всё, что в loader.conf прописано
наконец-то настали выходные и выпало время разобраться. В принципе всё весьма логично. Отпишу здесь, может кому пригодится и сэкономит время...
Итак, задача была позволить grub2 грузить FreeBSD с корневого раздела на zfs (разметка диска: gpt) и при этом не пользоваться сервисом стандартного лоадера (а не явно в конфиге grub'a дублировать всё необходимое содержимое loader.conf). Задача решается с помощью стандартной фичи grub'a: пнуть альтернативный загрузчик (т.е. воспользоваться chainloader). Для этого нужно:
1) найти альтернативный загрузчик (в нашем случае это pmbr);
2) загрузить его, тем самым передав ему управление.
очевидно, чтобы это сработало, нужен раздел freebsd-boot кула будет записан bootcode (gptzfsboot), так как задача pmbr найти раздел freebsd-boot и загрузить с него bootcode. В моём случае такого раздела не было, пришлось создавать (причём, пришлось потеснить bios-boot диск grub'a... теснить можно ровно настолько, чтобы не "обрезать" инсталлированный туда core.img. в моём случае это было около 70К.).
Код: Выделить всё
#
# исходное состояние
#
[silent@t410][/home/silent]gpart show
=> 34 625142381 ada0 GPT (298G)
34 512 1 bios-boot (256K)
546 420335454 2 freebsd-zfs (200G)
420336000 61432560 3 linux-data (29G)
481768560 143373855 4 linux-data (68G)
#
# выделяем место под freebsd-boot
#
[silent@t410][/home/silent]sudo gpart resize -s 256 -i 1 ada0
ada0p1 resized
[silent@t410][/home/silent]gpart show
=> 34 625142381 ada0 GPT (298G)
34 256 1 bios-boot (128K)
290 256 - free - (128K)
546 420335454 2 freebsd-zfs (200G)
420336000 61432560 3 linux-data (29G)
481768560 143373855 4 linux-data (68G)
#
# инициализируем freebsd-boot
#
[silent@t410][/home/silent]sudo gpart add -b 290 -t freebsd-boot ada0
ada0p5 added
[silent@t410][/home/silent]gpart show
=> 34 625142381 ada0 GPT (298G)
34 256 1 bios-boot (128K)
290 256 5 freebsd-boot (128K)
546 420335454 2 freebsd-zfs (200G)
420336000 61432560 3 linux-data (29G)
481768560 143373855 4 linux-data (68G)
#
# устанавливаем partition bootcode (он же stage[12])
#
[silent@t410][/home/silent]sudo gpart bootcode -p /boot/gptzfsboot -i 5 ada0
всё, теперь в /boot/grub/grub.conf достаточно такой записи:
Код: Выделить всё
menuentry "FreeBSD" --class freebsd --class bsd --class os {
chainloader /@/boot/pmbr
}
(конечно же при условии, что core.img уже включает в себя модуль biosdisk, part_gpt, zfs, иначе ничего не будет... так же в load.cfg при создании core.img (с помощью grub-mkimage) были сразу заданы для удобства переменные root и prefix, в моём случае это были '(hd0,gpt2)' и '(hd0,gpt2)/@/boot/grub' соответственно).
PS:
по идее, если есть куда выложить добро grub'a (/boot/grub/*), то для загрузки freebsd с корневого zfs раздела, вовсе необязательна поддержка zfs (врочем grub2 тоже тогда необязателен, можно и старой версией пользоваться с патчами для gpt). Ведь pmbr можно записать куда угодно (например в последний сектор того же bios-boot раздела или даже раздела freebsd-boot.. главное чтобы там было свободно хотя бы 512 байт), потом просто chainloader'у сказать что-то вроде:
Код: Выделить всё
menuentry "FreeBSD" --class freebsd --class bsd --class os {
chainloader (hd0,gpt1)N+1
}
# где N - номер блока в разделе, куда был записан pmbr