前言

我们产品是支持UEFI安装的,在很多款机器上都正常的安装。今日在浪潮服务器和技嘉服务器上都遇到一次,可以安装,但是无法正常启动。

所以我们必须要解决此问题,来支持更多的硬件。

基础知识

EFI的全称是,Extensible Firmware Interface , UEFI是Unified EFI。

我们以安装好的Linux系统为例,如何查看我们机器使用的是UEFI还是Legacy呢?

答案是查看如下文件是否存在:

/sys/firmware/efi

下面的输出分别是以Legacy和UEFI模式的情况下,各自的输出情况。

# 没有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/

在我们的系统盘上,有单独的一个分区,是boot 分区:

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中也会有相应的条目:

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

如何查看我们的引导项呢:

这个efibootmgr我们系统默认自带,如果安装模式是EFI的话。其中该命令会自动的显示当前所有启动项,包括启动顺序。

BootCurrent表示我们当前的系统是哪个启动项。因此我们当前的系统是:

Boot0000* grubHD(1,200,100600,3a92c3e7-adc5-4fcc-8197-ac21b84b601d)File(\EFI\grub\grubx64.efi)

对于我们的系统来讲,EFI分区占据sda的第一个分区:

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

....

紧接着的是如下内容

File(\EFI\grub\grubx64.efi)

这指定了我们的OS bootloader 这个文件的类型如下:

root@node245:/boot/efi/EFI/grub# file grubx64.efi

grubx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), forMS Windows

一般来讲,正常安装好的系统,某个启动条目后面都有File指定某个文件,我们本次探索技嘉设备,安装好了之后并不能正确的启动,我们发现,启动条目后面并没有指定对应的File:

我们看到,上面输出中,并没有指定File,我们怀疑这也是为什么技嘉设备不能正常启动的原因,尽管我们在/boot/efi/EFI/grub/存在 grubx64.efi文件。

Fallback Path (回退路径)

debian帮助文档中提到,一些机器的EFI可能存在bug:

Weak EFI implementation only recognizes the fallback bootloader

某些比较脆弱的EFI实现,并不能认识我们的bootloader,导致启动的时候,他会查找默认的回退路径。

UEFI 规范定义了一种“回退”路径 (Fallback path),用于启动此类启动管理器项,其工作原理类似于 BIOS 驱动器启动:它会在标准位置查找某些启动装载程序代码。但是其中的细节和 BIOS 不同。

当尝试以这种方式启动时,固件真正执行的操作相当简单。固件会遍历磁盘上的每个 EFI 系统分区(按照磁盘上的分区顺序)。在 ESP 内,固件将查找位于特定位置的具有特定名称的文件。在 x86-64 PC 上,固件会查找文件 \EFI\BOOT\BOOTx64.EFI。固件实际查找的是 \EFI\BOOT\BOOT{计算机类型简称}.EFI,其中,“x64”是 x86-64 PC 的“计算机类型简称”。文件名还有可能是 BOOTIA32.EFI (x86-32)、BOOTIA64.EFI (Itanium)、BOOTARM.EFI(AArch32,即32位ARM)和 BOOTAA64.EFI(AArch64,即64位ARM)。然后,固件将执行找到的第一个有效文件(当然,文件需要符合UEFI规范中定义的可执行格式)。

回到我们的情况,技嘉的机器可能只认 /boot/efi/EFI/BOOT/BOOTx64.EFI 这个回退路径,因此昨晚我和胜国,将我们自己的文件 /boot/efi/EFI/grub/grubx64.efi 拷贝到了 回退路径,这样,之前不能启动的路径就可以自如的启动了。

所以对于我们的问题,比较正确的处理方法是,grub-install执行完毕后, efibootmgr -v

grep grubx64.efi ,如果可以找到我们的File,那么什么也不做,如果找不到,则执行紧急补救不错,即cp我们的文件到回退路径。

efibootmgr

这个工具非常有用,可以创建新的启动项:

创建新的启动项

–create (-c) 表示要创建条目

–part (-p) 用于提供ESP所在的分区号

–disk (-d) 用于提供ESP所在的磁盘名称

–label (-L) 用于提供条目名称

–loader (-l) 用于提供要加载的EFI image

删除某启动项

可以使用-B参数删除某个启动项:

-b | --bootnum XXXX

Modify BootXXXX (hex)

-B | --delete-bootnum

Delete bootnum

改变启动顺序

-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.

出现在前面的启动项,启动优先级要高。

启用禁用启动项:

efibootmgr -a -b X ==> 启用标号为X的启动项

efibootmgr -A -b X ==> 禁用标号为X的启动项

参考文献

linux uefi无法启动文件,解决UEFI安装无法启动的问题相关推荐

  1. Linux解压rar文件(unrar安装和使用,分卷解压)

    windows平台很多压缩文档为rar文件,那么怎么做到Linux解压rar文件(unrar安装和使用)? 简单,centos5安装unrar即可. unrar安装 方法如下: wget  http: ...

  2. Red Hat6 Linux镜像文件,如何下载红帽企业版Linux的ISO镜像文件,如何开始安装红帽企业版Linux?...

    发行版本:红帽企业版 Linux,所有版本 问题: 如何下载红帽企业版 Linux 的 ISO 镜像文件,以便从光盘安装红帽企业版 Linux? 备注:如果您想下载红帽企业版Linux的评估版,需要首 ...

  3. 解决tomcat7安装后启动时一闪而退的bug

    问题描述 从apache官网下载64位tomcat7.0.90安装包文件解压到个人电脑D盘后,进入tomcat服务器的bin目录双击startup.bat windows批处理文件启动tomcat服务 ...

  4. linux服务器中如何解压分卷文件,Linux解压rar文件(unrar安装和使用,分卷解压)...

    windows平台很多压缩文档为rar文件,那么怎么做到Linux解压rar文件(unrar安装和使用)? 简单,centos5安装unrar即可. unrar安装 方法如下: wget  http: ...

  5. u12无线网卡linux驱动装不上,解决Centos7 安装腾达U12无线网卡驱动问题

    解决过程: 办法一: CentOS7.3 默认的内核版本较低,为 3.10.0-514.el7.x86_64. 无论是使用腾达官方提供的驱动,还是github 上的驱动(链接 https://gith ...

  6. 服务器启动文件夹,win10系统开机启动文件夹的路径是什么_网站服务器运行维护...

    装 k8s 要先装 Docker 吗?_网站服务器运行维护 装k8s是不需要先装Docker,两者之间是没有依赖关系的,都是可以独立运行,但是两者是可以配合使用的,Docker是一个独立的应用程序,可 ...

  7. centos中mysql启动失败,解决CentOS下mysql启动失败

    解决CentOS下mysql启动失败 今天用service mysqld start 命令启动mysql失败 查看mysql日志 tail -n 10 /var/log/mysql.log160702 ...

  8. mysql8.0版本怎么启动_mysql8.0.11安装、启动与基本设置

    此次演示的是mysql 8.0.11的安装.启动与基本设置. 下载mysql-8.0.11-el7-x86_64.tar.gz 1.解压并重命名 [[email protected] ~]# cd / ...

  9. 7. Linux系统下在桌面设置添加安装软件启动图标快捷方式

    1. 说明 在Linux系统下安装了对应的软件之后,一般启动时需要在命令行终端中进行启动,可以在终端里设置快速启动的命令,相关设置可参考博客:Linux系统下在终端设置快速启动已安装软件. 另一种快捷 ...

最新文章

  1. mysql中比较函数_MySQL:MySQL层比较函数调用
  2. python turtle画彩虹-python绘制樱花,彩虹旋等
  3. iOS组件化(二):创建远程私有库
  4. Python剑指offer:矩形覆盖问题
  5. 如何理解java采用Unicode编码
  6. python系统学习:函数积累(持续更新)
  7. 全套学习!mysql2003错误代码
  8. H.264 中很有用的一些概念
  9. 嵌入式基于Linux电机控制,基于嵌入式arm+linux平台的直流电机调速控制系统.pdf
  10. bash shell 快捷键
  11. 三星android10电话拦截功能,三星手机阻止来电怎么设置 拒接骚扰电话教程 - Iefans...
  12. android textwatcher 获取当前控件,使用TextWatcher实现EditText与TextView同步
  13. 计算机表格怎么算加减,excel表格数据的加减-excel表格怎么自动计算加减
  14. 华为 MA5683T GPON简单业务配置
  15. 赛前练习(百度之星资格赛及初赛真题+Codeforces(div2级别))
  16. 3步解决AS提示:Compilation is not supported for following modules
  17. redis 保存大量数据
  18. Unity 物理效果插件OBI使用记录,包含OBI-Rope绳索,OBI-Fluid,OBI-Cloth
  19. html复选框,如何通过AJAX动态获取数据库的数据作为复选框显示在页面上
  20. Scrapy爬取豆瓣读书全站

热门文章

  1. Asp.net2.0水晶报表的一些示例源码
  2. 乐学python_铁乐学python_day01-作业
  3. oracle最大实例数,【ORA-16196】一个实例在其生命周期里最多只能装载和打开一个数据库...
  4. [转载] 黑马程序员_学习笔记8_C#基础归纳之数组
  5. 自动化部署kvm虚拟机_自动化虚拟助手
  6. python 示例_Python使用示例设置add()方法
  7. Java FilePermission getActions()方法与示例
  8. 3dmax如何拆分模型_3dmax制作装饰柜1
  9. python map函数的作用_Python的map函数
  10. 湖北计算机技能高考专科学校排名,湖北2021年技能高考专科录取分数线