Arch-Linux

Arch Linux 未在 UEFI 系統上顯示引導載入程序

  • December 12, 2015

我最近在我的筆記型電腦(Dell Precision M4500)上安裝了 Arch。我剛剛更換了硬碟,所以在安裝過程中我不得不從頭開始分區。我選擇了 GPT 分區並將我的系統設置為使用 UEFI 啟動。

在安裝過程中,我嘗試安裝 GRUB 並失敗,因為我使用傳統命令安裝到 MBR 磁碟 ( grub-install /dev/sda)。這失敗了一條關於 EFI 的消息(恐怕我不記得是什麼),所以我轉而選擇了bootctl。我按照Arch Beginners Guide寫了這封信:

# bootctl install

boot/loader/entries/arch.conf使用以下內容創建:

title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=/dev/sda2 rw

/boot/loader/loader.conf

timeout 3
default arch

然後我繼續正常安裝系統。但是,在重新啟動後,系統 POST 後出現黑屏並且沒有引導載入程序。進入引導載入程序的唯一方法是按下F12以調出系統的引導菜單(與讓我進入 BIOS 的菜單相同,或者當系統不是 EFI 時讓我進入 BIOS),然後選擇“linux bootloader”從菜單中。這將帶我進入一個引導載入程序螢幕,我可以在其中選擇“Arch”。

  1. 按下時我得到的菜單F12

主菜單 2. 如果我選擇“grub”,我會得到:

子菜單1

再次選擇“grub”只會讓我直接回到同一個菜單。 3. 如果從第一個菜單中選擇“Linux Boot Manager”,我會得到一個帶有 Arch 條目和“EFI 預設載入程序”條目的菜單:

在此處輸入圖像描述

選擇“Arch”啟動我的 Arch 安裝並選擇“EFI 預設載入程序”將我帶到下面 4 所示的菜單。 4. 如果從第一個菜單中選擇“UEFI:INT 13(RAID.0x80)”,我會得到一個只有 Arch 條目的菜單,選擇哪個將啟動我的 Arch 系統:

在此處輸入圖像描述

我也嘗試安裝grub(這次是正確的):

pacman -S efibootmgr grub os-prober
grub-install --target=x86_64-efi --efi-directory=/boot/EFI --bootloader-id=grub --recheck
grub-mkconfig -o /boot/grub/grub.cfg

這使得F12啟動菜單中出現了一個新的“grub”條目,但選擇它會使我進入黑屏,然後返回啟動菜單。

grub.cfg的是(已刪除評論):

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,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
 search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  98202b4b-af35-413a-b3ff-87c149c5061d
else
 search --no-floppy --fs-uuid --set=root 98202b4b-af35-413a-b3ff-87c149c5061d
fi
   font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
 set gfxmode=auto
 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
else
 set timeout=5
fi

menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-98202b4b-af35-413a-b3ff-87c149c5061d' {
   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  9943-114D
   else
     search --no-floppy --fs-uuid --set=root 9943-114D
   fi
   echo    'Loading Linux linux ...'
   linux   /vmlinuz-linux root=UUID=98202b4b-af35-413a-b3ff-87c149c5061d rw  quiet
   echo    'Loading initial ramdisk ...'
   initrd   /initramfs-linux.img
}
submenu 'Advanced options for Arch Linux' $menuentry_id_option 'gnulinux-advanced-98202b4b-af35-413a-b3ff-87c149c5061d' {
   menuentry 'Arch Linux, with Linux linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-advanced-98202b4b-af35-413a-b3ff-87c149c5061d' {
       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  9943-114D
       else
         search --no-floppy --fs-uuid --set=root 9943-114D
       fi
       echo    'Loading Linux linux ...'
       linux   /vmlinuz-linux root=UUID=98202b4b-af35-413a-b3ff-87c149c5061d rw  quiet
       echo    'Loading initial ramdisk ...'
       initrd   /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-98202b4b-af35-413a-b3ff-87c149c5061d' {
       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  9943-114D
       else
         search --no-floppy --fs-uuid --set=root 9943-114D
       fi
       echo    'Loading Linux linux ...'
       linux   /vmlinuz-linux root=UUID=98202b4b-af35-413a-b3ff-87c149c5061d rw  quiet
       echo    'Loading initial ramdisk ...'
       initrd   /initramfs-linux-fallback.img
   }
}
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

我的分區表(注意錯誤,我不知道這是否相關):

$ sudo parted  /dev/sda print
Error: The backup GPT table is corrupt, but the primary appears OK, so that will
be used.
OK/Cancel? OK                                                             
Model: ATA TOSHIBA MQ01ABD0 (scsi)
Disk /dev/sda: 750GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
1      1049kB  538MB   537MB   fat32                 boot, esp
2      538MB   32.7GB  32.2GB  ext4
3      32.7GB  462GB   429GB   ext4
4      462GB   479GB   17.2GB  linux-swap(v1)
5      479GB   750GB   271GB   ntfs                  msftdata

並且/etc/fstab

# /dev/sda2
UUID=98202b4b-af35-413a-b3ff-87c149c5061d   /           ext4        rw,relatime,data=ordered    0 1
# /dev/sda3
UUID=baa9dd1e-835c-4d88-af8a-31dc97ac7af6   /home       ext4        rw,relatime,data=ordered    0 2
# /dev/sda1
UUID=9943-114D          /boot       vfat        rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro    0 2
# /dev/sda4
UUID=8eaf91cd-f638-487b-8299-50d39342df0d   none        swap        defaults    0 0

(我的 EFI 分區 ( sda1) 安裝在/boot; 應該是這樣/boot/EFI嗎?)

所以,我的問題是,我怎樣才能讓我的系統直接啟動到可用的引導載入程序而無需按下F12?我更喜歡這個引導載入程序,但如果有必要 grub我可以忍受。bootctl

在嘗試了各種各樣的事情之後,沒有任何區別,我終於發現我必須做的是在我的 BIOS 中禁用快速啟動。就我而言,它是:

BIOS 快速啟動設置

將其從“最小”更改為“徹底”讓我無需點擊即可直接進入我的引導載入程序F12

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