linux uefi无法启动文件,解决UEFI安装无法启动的问题
前言
我們產(chǎn)品是支持UEFI安裝的,在很多款機(jī)器上都正常的安裝。今日在浪潮服務(wù)器和技嘉服務(wù)器上都遇到一次,可以安裝,但是無(wú)法正常啟動(dòng)。
所以我們必須要解決此問(wèn)題,來(lái)支持更多的硬件。
基礎(chǔ)知識(shí)
EFI的全稱(chēng)是,Extensible Firmware Interface , UEFI是Unified EFI。
我們以安裝好的Linux系統(tǒng)為例,如何查看我們機(jī)器使用的是UEFI還是Legacy呢?
答案是查看如下文件是否存在:
/sys/firmware/efi
下面的輸出分別是以Legacy和UEFI模式的情況下,各自的輸出情況。
# 沒(méi)有efi 目錄,Legacy模式
root@node243:/sys/firmware# ll
total 0
drwxr-xr-x 4 root root 0 Jul 2 11:16 ./
dr-xr-xr-x 12 root root 0 Jul 2 11:15 ../
drwxr-xr-x 5 root root 0 Jul 2 16:43 acpi/
drwxr-xr-x 12 root root 0 Jul 2 16:43 memmap/
# 有efi 目錄, UEFI模式
root@node245:/sys/firmware# ll
total 0
drwxr-xr-x 5 root root 0 Jul 2 16:33 ./
dr-xr-xr-x 12 root root 0 Jul 2 11:29 ../
drwxr-xr-x 5 root root 0 Jul 2 16:43 acpi/
drwxr-xr-x 5 root root 0 Jul 2 16:33 efi/
drwxr-xr-x 16 root root 0 Jul 2 16:43 memmap/
在我們的系統(tǒng)盤(pán)上,有單獨(dú)的一個(gè)分區(qū),是boot 分區(qū):
root@node245:/sys/firmware# parted /dev/sda print
Model: AVAGO MR9361-8i (scsi)
Disk /dev/sda: 16.0TB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 262kB 538MB 538MB fat32 EFI boot, esp
2 538MB 103GB 102GB ext4
3 103GB 131GB 27.6GB linux-swap(v1)
4 131GB 16.0TB 15.9TB
在fstab中也會(huì)有相應(yīng)的條目:
root@node245:/sys/firmware# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
# / was on /dev/sda2 during installation
UUID=efc5dbbf-8eb5-45ba-94b0-ce5253ed5d8d / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/sda1 during installation
UUID=92A1-DB43 /boot/efi vfat defaults 0 1
# swap was on /dev/sda3 during installation
UUID=59a84533-d365-4e06-8a55-a2fa63b7e82e none swap sw 0 0
如何查看我們的引導(dǎo)項(xiàng)呢:
這個(gè)efibootmgr我們系統(tǒng)默認(rèn)自帶,如果安裝模式是EFI的話。其中該命令會(huì)自動(dòng)的顯示當(dāng)前所有啟動(dòng)項(xiàng),包括啟動(dòng)順序。
BootCurrent表示我們當(dāng)前的系統(tǒng)是哪個(gè)啟動(dòng)項(xiàng)。因此我們當(dāng)前的系統(tǒng)是:
Boot0000* grubHD(1,200,100600,3a92c3e7-adc5-4fcc-8197-ac21b84b601d)File(\EFI\grub\grubx64.efi)
對(duì)于我們的系統(tǒng)來(lái)講,EFI分區(qū)占據(jù)sda的第一個(gè)分區(qū):
root@node245:/sys/firmware# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 14.6T 0 disk
├─sda1 8:1 0 512.8M 0 part /boot/efi
├─sda2 8:2 0 95.4G 0 part /
├─sda3 8:3 0 25.7G 0 part [SWAP]
└─sda4 8:4 0 14.4T 0 part
其中 HD(1,200,100600, 3a92c3e7-adc5-4fcc-8197-ac21b84b601d)
1 : partition number
200 : partition offset
100600 : partition size
3a92c3e7-adc5-4fcc-8197-ac21b84b601d : partition GUID:
root@node245:/sys/firmware# ll /dev/disk/by-partlabel/
total 0
drwxr-xr-x 2 root root 180 Jul 2 17:35 ./
drwxr-xr-x 9 root root 180 Jul 2 11:29 ../
lrwxrwxrwx 1 root root 10 Jul 2 11:29 EFI -> ../../sda1
....
root@node245:/sys/firmware# ll /dev/disk/by-partuuid
...
lrwxrwxrwx 1 root root 10 Jul 2 11:29 3a92c3e7-adc5-4fcc-8197-ac21b84b601d -> ../../sda1
....
緊接著的是如下內(nèi)容
File(\EFI\grub\grubx64.efi)
這指定了我們的OS bootloader 這個(gè)文件的類(lèi)型如下:
root@node245:/boot/efi/EFI/grub# file grubx64.efi
grubx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), forMS Windows
一般來(lái)講,正常安裝好的系統(tǒng),某個(gè)啟動(dòng)條目后面都有File指定某個(gè)文件,我們本次探索技嘉設(shè)備,安裝好了之后并不能正確的啟動(dòng),我們發(fā)現(xiàn),啟動(dòng)條目后面并沒(méi)有指定對(duì)應(yīng)的File:
我們看到,上面輸出中,并沒(méi)有指定File,我們懷疑這也是為什么技嘉設(shè)備不能正常啟動(dòng)的原因,盡管我們?cè)?boot/efi/EFI/grub/存在 grubx64.efi文件。
Fallback Path (回退路徑)
debian幫助文檔中提到,一些機(jī)器的EFI可能存在bug:
Weak EFI implementation only recognizes the fallback bootloader
某些比較脆弱的EFI實(shí)現(xiàn),并不能認(rèn)識(shí)我們的bootloader,導(dǎo)致啟動(dòng)的時(shí)候,他會(huì)查找默認(rèn)的回退路徑。
UEFI 規(guī)范定義了一種“回退”路徑 (Fallback path),用于啟動(dòng)此類(lèi)啟動(dòng)管理器項(xiàng),其工作原理類(lèi)似于 BIOS 驅(qū)動(dòng)器啟動(dòng):它會(huì)在標(biāo)準(zhǔn)位置查找某些啟動(dòng)裝載程序代碼。但是其中的細(xì)節(jié)和 BIOS 不同。
當(dāng)嘗試以這種方式啟動(dòng)時(shí),固件真正執(zhí)行的操作相當(dāng)簡(jiǎn)單。固件會(huì)遍歷磁盤(pán)上的每個(gè) EFI 系統(tǒng)分區(qū)(按照磁盤(pán)上的分區(qū)順序)。在 ESP 內(nèi),固件將查找位于特定位置的具有特定名稱(chēng)的文件。在 x86-64 PC 上,固件會(huì)查找文件 \EFI\BOOT\BOOTx64.EFI。固件實(shí)際查找的是 \EFI\BOOT\BOOT{計(jì)算機(jī)類(lèi)型簡(jiǎn)稱(chēng)}.EFI,其中,“x64”是 x86-64 PC 的“計(jì)算機(jī)類(lèi)型簡(jiǎn)稱(chēng)”。文件名還有可能是 BOOTIA32.EFI (x86-32)、BOOTIA64.EFI (Itanium)、BOOTARM.EFI(AArch32,即32位ARM)和 BOOTAA64.EFI(AArch64,即64位ARM)。然后,固件將執(zhí)行找到的第一個(gè)有效文件(當(dāng)然,文件需要符合UEFI規(guī)范中定義的可執(zhí)行格式)。
回到我們的情況,技嘉的機(jī)器可能只認(rèn) /boot/efi/EFI/BOOT/BOOTx64.EFI 這個(gè)回退路徑,因此昨晚我和勝?lài)?guó),將我們自己的文件 /boot/efi/EFI/grub/grubx64.efi 拷貝到了 回退路徑,這樣,之前不能啟動(dòng)的路徑就可以自如的啟動(dòng)了。
所以對(duì)于我們的問(wèn)題,比較正確的處理方法是,grub-install執(zhí)行完畢后, efibootmgr -v
grep grubx64.efi ,如果可以找到我們的File,那么什么也不做,如果找不到,則執(zhí)行緊急補(bǔ)救不錯(cuò),即cp我們的文件到回退路徑。
efibootmgr
這個(gè)工具非常有用,可以創(chuàng)建新的啟動(dòng)項(xiàng):
創(chuàng)建新的啟動(dòng)項(xiàng)
–create (-c) 表示要?jiǎng)?chuàng)建條目
–part (-p) 用于提供ESP所在的分區(qū)號(hào)
–disk (-d) 用于提供ESP所在的磁盤(pán)名稱(chēng)
–label (-L) 用于提供條目名稱(chēng)
–loader (-l) 用于提供要加載的EFI image
刪除某啟動(dòng)項(xiàng)
可以使用-B參數(shù)刪除某個(gè)啟動(dòng)項(xiàng):
-b | --bootnum XXXX
Modify BootXXXX (hex)
-B | --delete-bootnum
Delete bootnum
改變啟動(dòng)順序
-o | --bootorder XXXX,YYYY,ZZZZ
Explicitly set BootOrder (hex). Any value from 0 to FFFF is accepted so long as it corresponds to an existing Boot#### variable, and zero padding is not required.
出現(xiàn)在前面的啟動(dòng)項(xiàng),啟動(dòng)優(yōu)先級(jí)要高。
啟用禁用啟動(dòng)項(xiàng):
efibootmgr -a -b X ==> 啟用標(biāo)號(hào)為X的啟動(dòng)項(xiàng)
efibootmgr -A -b X ==> 禁用標(biāo)號(hào)為X的啟動(dòng)項(xiàng)
參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的linux uefi无法启动文件,解决UEFI安装无法启动的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html页面左右布局透明背景,HTML透
- 下一篇: oracle未授权sql查询,【orac