云网牛站
所在位置:首页 > Linux教程 > Linux用户的UEFI固件指南

Linux用户的UEFI固件指南

2017-12-08 11:30:47作者:linux大神稿源:linuxdashen

本文我们来讨论计算机主板的固件-BIOS和UEFI,UEFI本身是一个非常复杂的技术标准,下面仅介绍最基本的知识。

 

UEFI BIOS还是UEFI

你会看到有人说UEFI BIOS,甚至有的主板固件也会标明UEFI BIOS,但实际上BIOS不是固件的通用叫法,BIOS只是IBM兼容PC里的一个具体的固件。UEFI是另外一种固件的标准,所以,UEFI应该只被称呼为UEFI,而不是UEFI BIOS。

 

为什么需要BIOS

BIOS的全称为Basic Input/Output System(基本输入输出系统),它的职责是:

1.初始化CPU和RAM

2.开机自检(Power on Self Test)

3.初始化LAN、PCIe接口

4.启动MBR分区的boot loader,或USB存储设备,网络上的boot loader。

当它完成以上任务时,BIOS将控制权交给操作系统。

 

Legacy BIOS

因为BIOS是在1985年诞生的,至今已经有31年历史了,所以有时候BIOS也会被称为Legacy BIOS。在八九十年代,鼠标键盘用的是PS/2接口,软盘(floppy disk)也非常流行,今天这些技术已经过时了,但BIOS里还保留了针对这些过时技术的代码。

 

什么是UEFI

UEFI的前身是EFI,全称为Extensible Firmware Interface(可扩展的固件接口)。EFI是由Intel公司于上世纪90年代开始研发的,当时Intel正在生产64位的处理器,但是BIOS的代码是16位的,不能充分发挥64位处理器的作用,所以Intel便开发一种新的固件,即EFI,第一个版本的EFI于2002年发布.2005年,计算机硬件和软件厂商联合组成了UEFI论坛,开头的U,代表Unified,意指计算机硬件和软件厂商之间的统一。

UEFI实际上只是一个固件的标准,而不是具体的固件实现。任何人都可以按照UEFI标准来写自己的UEFI兼容的固件,简称UEFI固件。

 

BIOS和UEFI的不同之处

1.编程语言不同

BIOS是用汇编语言写的,而UEFI固件是99%都是用C语言写的,对于程序员来说,C语言更易于阅读,维护,添加或删除新功能。

2.OptionROM vs. 驱动

BIOS固件要求主板的其他设备采用OptionROM存放代码。例如,网卡的OptionROM可以增强BIOS的功能,让计算机从网络上的其他设备启动,瘦客户端(thin client)就是利用网卡的OptionROM来启动远程主机的操作系统.但OptionROM最大容量只有64KB,它不能从硬盘,USB设备加载。另外,OptionROM依赖于具体的硬件,移植性差,如果硬件变了,那么OptionROM的代码也得变。

如果主板用的是UEFI固件,那么程序员就不需要写OptionROM代码了,而是写驱动程序,驱动程序没有OptionROM以上的缺点。

3.MBR vs. GPT

BIOS固件通常要求硬盘采用MBR分区,MBR的全称是Master Boot Record,MBR分区有两个缺陷,一是主分区不能超过4个,二是不支持2TB以上容量的硬盘。

UEFI固件要求硬盘采用GPT分区,GPT的全称是GUID Parition Style,GPT允许硬盘有128个主分区,并且支持2TB以上容量的硬盘。

在使用BIOS固件的计算机上,Linux支持硬盘采用GPT分区,这时硬盘上要有一个bios_grub分区,这个分区通常为1MB大小,而windows只支持MBR分区。

BIOS在初始化硬件和开机自检后,仍然会提供一些服务,而UEFI只在启动时提供服务,启动完成后将控制权完全交给操作系统。

 

UEFI Shell

UEFI固件还有一个UEFI Shell,它看起来像Linux的终端,UEFI Shell有自己的命令语法,可以让你运行一些UEFI程序。

 

启动模式

有一些UEFI固件内置了一个兼容支持模块(Compatibility Support Module、CSM),CSM可以让主板使用BIOS模式,在这种情况下,计算机可以有3种启动模式。

1.BIOS模式

2.BIOS和UEFI混合模式

3.原生UEFI模式 (native UEFI)

注意,混合模式是不同于原生UEFI模式的,如果你真的想让你的计算机使用UEFI,那么你必须关闭CSM模块,启用原生UEFI模式,原生UEFI可以加快系统启动速度,因为这时候不需要加载BIOS代码。

 

操作系统支持

1.MS Windows只支持BIOS固件+MBR硬盘,或UEFI固件+GPT硬盘。

2.Linux支持BIOS固件+MBR硬盘,BIOS固件+GPT硬盘,UEFI固件+GPT硬盘,以及UEFI固件+MBR硬盘。

3.苹果Mac电脑的固件是EFI+UEFI混合固件,它不是符合UEFI标准的固件。

 

UEFI固件的架构

大多数Intel处理器支持32位和64位指令,同时可执行8086/80286的16位指令,所以Intel平台下的UEFI有可能编译成32位的,也可能编译成64位。

UEFI标准要求boot loader的架构要与UEFI固件的架构一致,以减少不必要的麻烦,换句话说,32位的UEFI固件只能加载32位的boot loader,64位的UEFI只能加载64位的boot loader,但我们可以用32位的boot loader加载64位的操作系统,也可以用64位的boot loader来加载32位的操作系统。

 

怎么查看自己的UEFI固件是32位还是64位

在Linux终端里运行下面的命令

cat /sys/firmware/efi/fw_platform_size

Linux用户的UEFI固件指南

从输出中可以知道,我的UEFI固件是64位的,现在的大多数新电脑采用的是64位UEFI。

 

怎么确定自己的Linux系统是在UEFI模式下安装的

方法一、查看Grub

如果Linux是以UEFI模式下安装的,那么系统上会有一个grub-efi程序。

Linux用户的UEFI固件指南

grub-efi是为UEFI固件编写的boot loader,grub-pc是为BIOS固件编写的boot loader。

Linux用户的UEFI固件指南

方法二、在Linux终端里运行下面的命令

[ -d /sys/firmware/efi ] && echo "Installed in UEFI mode" || echo "Installed in Legacy mode"

 

怎么确信操作系统是以UEFI模式启动的

首先,你可以在主板固件设置里禁用BIOS以及CSM模块,只启用原生UEFI模式,另外,你可以查看Linux系统上是否有/sys/firmware/efi这个目录,如果这个目录存在,那么系统就是以UEFI模式启动的。

Linux用户的UEFI固件指南

 

ESP分区

UEFI标准要求硬盘上要有一个ESP分区,ESP的全称是EFI System Partition,即EFI系统分区,ESP分区的文件系统格式为FAT32或FAT16,它是用来存放boot loader程序的,推荐ESP分区大小为512MB,Linux用户要将ESP分区要挂载到/boot/efi目录下。

在Gparted分区管理器中,ESP分区有两个标识(flag): boot和esp,ESP分区可以不是硬盘的第一个分区。

Linux用户的UEFI固件指南

 

Secure Boot 安全引导

Secure boot是UEFI固件的一个扩展功能,Fedora、OpenSUSE、Ubuntu等Linux发行版支持secure boot,但很多Linux发行版如Debian还不支持secure boot,注意,secure boot不是微软的创造物,微软只是要求电脑销售商必须默认启用secure boot才能在电脑上贴上微软认证的标签,但是这一做法间接地伤害了广大Linux用户,因为很多Linux发行版不支持secure boot。

 

相关主题

Virtualbox下开启UEFI固件安装Arch Linux虚拟机

精选文章
热门文章