Linux用户的UEFI固件指南

今天,让我们来讨论计算机主板的固件-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(基本输入输出系统).它的职责是:

  • 初始化CPU和RAM
  • 开机自检(Power on Self Test)
  • 初始化LAN, PCIe接口
  • 启动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的不同之处

编程语言不同

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

OptionROM vs. 驱动

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

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

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

操作系统支持

  • MS Windows只支持BIOS固件+MBR硬盘,或UEFI固件+GPT硬盘.
  • Linux支持BIOS固件+MBR硬盘,BIOS固件+GPT硬盘,UEFI固件+GPT硬盘,以及UEFI固件+MBR硬盘。
  • 苹果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

UEFI固件是32位还是64位

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

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

方法一:查看Grub

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

UEFI模式下安装Linux

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

UEFI模式下安装Linux

方法二

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

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

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

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

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分区可以不是硬盘的第一个分区.

ESP分区

Secure Boot 安全引导

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

本文翻译自我的英文博客:A Quick Start Guide to UEFI Firmware for Linux Users

为这篇文章评分
[Total: 26 Average: 3.1]

发表评论

电子邮件地址不会被公开。 必填项已用*标注