Boot

無法使用 Grub2 與 Arch Linux 一起雙引導 FreeBSD

  • November 5, 2016

Grub 看到的我的磁碟分區方案如下:

hd0,gpt1: EFI system
hd0,gpt2: Linux Swap
hd0,gpt3: Linux Filesystem
hd0,gpt4: FreeBSD UFS`

FreeBSD 11.0-RELEASE 的安裝過程很順利,我還嘗試了 chroot 和更新系統,以防萬一。然後我啟動到 Arch Linux 並編輯/etc/grub/40_custom,嘗試各種配置(請參閱wiki.archlinux.org 上 GRUB 中的 FreeBSD 菜單條目),然後執行grub-mkconfig -o /boot/grub/grub.cfg.

(注意:我編輯了“mountfrom”參數,為根 fs 指定了正確的 dev 文件,在我的例子中是 ada0p4,並省略了“bsd1”條目,只設置(hd0,gpt4),否則找不到分割。)

如果我載入kfreebsd /boot/loader並啟動,我會得到一個黑屏。

如果我載入

kfreebsd /boot/kernel/kernel 
kfreebsd_loadenv /boot/device.hints
set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ada0p4
set kFreeBSD.vfs.root.mountfrom.options=rw

並啟動,我明白了:

我的筆記型電腦是 Thinkpad X220(股票 BIOS 是最新的)。蠐螬版本:2.02.beta3-4.

有什麼想法嗎?如果您需要更多資訊,請發表評論。

我的grub.cfg(連結)

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
if [ -s $prefix/grubenv ]; then
 load_env
fi
if [ "${next_entry}" ] ; then
  set default="${next_entry}"
  set next_entry=
  save_env next_entry
  set boot_once=true
else
  set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
 menuentry_id_option="--id"
else
 menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
 set saved_entry="${prev_saved_entry}"
 save_env saved_entry
 set prev_saved_entry=
 save_env prev_saved_entry
 set boot_once=true
fi

function savedefault {
 if [ -z "${boot_once}" ]; then
   saved_entry="${chosen}"
   save_env saved_entry
 fi
}

function load_video {
 if [ x$feature_all_video_module = xy ]; then
   insmod all_video
 else
   insmod efi_gop
   insmod efi_uga
   insmod ieee1275_fb
   insmod vbe
   insmod vga
   insmod video_bochs
   insmod video_cirrus
 fi
}

if [ x$feature_default_font_path = xy ] ; then
  font=unicode
else
insmod part_gpt
insmod ext2
set root='hd0,gpt3'
if [ x$feature_platform_search_hint = xy ]; then
 search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3  ff637c2e-1e42-4533-9a12-6ac2f6d43c9b
else
 search --no-floppy --fs-uuid --set=root ff637c2e-1e42-4533-9a12-6ac2f6d43c9b
fi
   font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
 set gfxmode=1024x768
 load_video
 insmod gfxterm
 set locale_dir=$prefix/locale
 set lang=en_US
 insmod gettext
fi
terminal_input console
terminal_output gfxterm
if [ x$feature_timeout_style = xy ] ; then
 set timeout_style=menu
 set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
 set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-ff637c2e-1e42-4533-9a12-6ac2f6d43c9b' {
   load_video
   set gfxpayload=keep
   insmod gzio
   insmod part_gpt
   insmod fat
   set root='hd0,gpt1'
   if [ x$feature_platform_search_hint = xy ]; then
     search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1  BE35-0EC9
   else
     search --no-floppy --fs-uuid --set=root BE35-0EC9
   fi
   echo    'Loading Linux linux ...'
   linux   /vmlinuz-linux root=UUID=ff637c2e-1e42-4533-9a12-6ac2f6d43c9b rw  
   echo    'Loading initial ramdisk ...'
   initrd  /intel-ucode.img /initramfs-linux.img
}
submenu 'Advanced options for Arch Linux' $menuentry_id_option 'gnulinux-advanced-ff637c2e-1e42-4533-9a12-6ac2f6d43c9b' {
   menuentry 'Arch Linux, with Linux linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-advanced-ff637c2e-1e42-4533-9a12-6ac2f6d43c9b' {
       load_video
       set gfxpayload=keep
       insmod gzio
       insmod part_gpt
       insmod fat
       set root='hd0,gpt1'
       if [ x$feature_platform_search_hint = xy ]; then
         search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1  BE35-0EC9
       else
         search --no-floppy --fs-uuid --set=root BE35-0EC9
       fi
       echo    'Loading Linux linux ...'
       linux   /vmlinuz-linux root=UUID=ff637c2e-1e42-4533-9a12-6ac2f6d43c9b rw  
       echo    'Loading initial ramdisk ...'
       initrd  /intel-ucode.img /initramfs-linux.img
   }
   menuentry 'Arch Linux, with Linux linux (fallback initramfs)' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-fallback-ff637c2e-1e42-4533-9a12-6ac2f6d43c9b' {
       load_video
       set gfxpayload=keep
       insmod gzio
       insmod part_gpt
       insmod fat
       set root='hd0,gpt1'
       if [ x$feature_platform_search_hint = xy ]; then
         search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1  BE35-0EC9
       else
         search --no-floppy --fs-uuid --set=root BE35-0EC9
       fi
       echo    'Loading Linux linux ...'
       linux   /vmlinuz-linux root=UUID=ff637c2e-1e42-4533-9a12-6ac2f6d43c9b rw  
       echo    'Loading initial ramdisk ...'
       initrd  /intel-ucode.img /initramfs-linux-fallback.img
   }
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry 'FreeBSD 11.0' {
   insmod ufs2
   set root=(hd0,gpt4)
   kfreebsd /boot/kernel/kernel
   kfreebsd_loadenv /boot/device.hints
   set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ada0p4
   set kFreeBSD.vfs.root.mountfrom.options=rw
}

### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
 source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
 source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

編輯:忘了提,就在磁碟分區之前,我收到以下文本的警告

已知您的 Lenovo 型號有一個 BIOS 錯誤,該錯誤會阻止它在沒有 UEFI 的情況下從 GPT 分區引導。您希望安裝程序為您應用解決方法嗎?

由於我使用 UEFI 啟動,我選擇不應用它(我什至嘗試應用它但沒有成功)。

雖然大多數指南建議使用chainloader +1鍊式載入,但它對我不起作用。

以下配置成功了:

insmod ufs2  
set root=(hd0,gpt4)  
chainloader /boot/loader.efi

我在使用同一台筆記型電腦(聯想 X220 有 2 個硬碟,一個用於系統/一個用於數據)和 FreeBSD 10 時遇到了同樣的問題。對我來說,一種解決方案是:

  1. 安裝 MBR 方案(這台筆記型電腦上的 GPT 支持似乎已損壞)
  2. 安裝 grub
  3. 在某個分區上安裝 FreeBSD

grub.cfg的很簡單(並且適用於年齡):

menuentry 'FreeBSD' {
 insmod bsd
 insmod ufs2
 set root='hd0,msdos3'
 kfreebsd /boot/loader
}

我只是使用 FreeBSD引導載入程序來啟動 FreeBSD 核心(在我的loader.conf中有一些自定義配置)。如果您嘗試使用kfreebsdFreeBSD 核心上的選項直接啟動,您將不得不配置很多東西。

順便說一句,您是否閱讀過有關使用 grub2 的 multiboot env 的官方 FreeBSD 文件

引用自:https://unix.stackexchange.com/questions/320292