此页面是免费浏览的,没有烦人的外部广告;然而,我的确花了时间准备,网站托管也花了钱。如果您发现此页面帮到了您,请考虑进行小额捐款,以帮助保持网站的运行。谢谢!原著于2013/10/19;最后修改于2015/3/16
引言
几年来,一种新的固件技术悄然出现,而大多数普通用户对此并无所知。该技术被称为可扩展固件接口(extensiblefirmwareinterface)(efi),或更新一些的统一可扩展固件接口(unifiedefi,uefi,本质上是efi2.x),它已经开始替代古老的基本输入/输出系统(basicinput/outputsystem)(bios)固件技术,有经验的计算机用户或多或少都有些熟悉bios。
本页面是给linux用户使用efi技术的一个快速介绍,其中包括有关开始将linux安装到此类计算机上的建议。不幸的是,efi是一个庞杂的话题;efi软件本身是复杂的,许多实现有系统特定的怪异行为甚至是缺陷。因此,我无法在一个页面上描述在efi计算机上安装和使用linux的一切知识。我希望你能将本页面作为一个有用的起点,不管怎么说,每个部分以及末尾“参考文献”部分的链接可以指引你找到更多的文档。
你的计算机是否使用efi技术?
efi是一种固件,意味着它是内置于计算机中处理低级任务的软件。最重要的是,固件控制着计算机的引导过程,反过来说这代表着基于efi的计算机与基于bios的计算机的引导过程不同。(有关此规律的例外之处稍后再说。)这种差异可能使操作系统安装介质的设计超级复杂化,但是一旦安装好并运行之后,它对计算机的日常操作几乎没有影响。请注意,大多数制造商使用术语“bios”来表示他们的efi。我认为这种用法很混乱,所以我避免了;在我看来,efi和bios是两种不同类型的固件。
注意:苹果公司的mac使用的efi在许多方面是不同寻常的。尽管本页面的大部分内容同样适用于mac,但有些细节上的出入,特别是在设置efi引导加载程序的时候。这个任务最好在osx上进行,使用mac的blessutility工具,我不在此做过多描述。
自从2006年第一次推出以来,efi已被用于基于英特尔的mac上。从2012年底开始,大多数安装windows8或更高版本系统的计算机就已经默认使用uefi启动,实际上大多数pc从2011年中期就开始使用uefi,虽然默认情况下它们可能无法以efi模式启动。2011年前销出的pc也有一些支持efi,尽管它们大都默认使用bios模式启动。
如果你不确定你的计算机是否支持efi,则应查看固件设置实用程序和参考用户手册关于efi、uefi以及legacybooting的部分。(可以通过搜索用户手册的pdf文件来快速了解。)如果你没有找到类似的参考,你的计算机可能使用老式的(“legacy”)bios引导;但如果你找到了这些术语的参考,几乎可以肯定它使用了efi技术。你还可以尝试只有efi模式的引导加载器的安装介质。使用refind制作的usb闪存驱动器或cd-r镜像是用来测试不错的选择。
在继续之前,你应当了解大多数x86和x86-64架构的计算机上的efi都包含一个叫做兼容支持模块compatibilitysupportmodule(csm)的组件,这使得efi能够使用旧的bios风格的引导机制来引导操作系统。这会非常方便,因为它向后兼容;但是这样也导致一些意外情况的发生,因为计算机不论以efi模式引导还是以bios(也称为csm或legacy)模式引导,在控制时没有标准的使用规范和用户界面。特别地,你的linux安装介质非常容易意外的以bios/csm/legacy模式启动,这会导致linux以bios/csm/legacy模式安装。如果linux是唯一的操作系统,也可以正常工作,但是如果与在efi模式下的windows组成双启动的话,就会非常复杂。(反过来问题也可能发生。)以下部分将帮助你以正确模式引导安装程序。如果你在阅读这篇文章之前就已经以bios模式安装了linux,并且希望切换引导模式,请阅读后续章节,“哎呀:将传统模式下安装的引导转为efi模式下的引导”。
uefi的一个附加功能值得一提:安全启动secureboot。此特性旨在最大限度的降低计算机受到bootkit病毒感染的风险,这是一种感染计算机引导加载程序的恶意软件。bootkits很难检测和删除,阻止它们的运行刻不容缓。微软公司要求所有带有支持windows8标志的台式机和笔记本电脑启用安全启动。这一配置使linux的安装变得复杂,尽管有些发行版可以较好的处理这个问题。不要将安全启动和efi或uefi混淆;支持efi的计算机不一定支持安全启动,而且支持efi的x86-64的计算机也可以禁用安全启动。微软同意用户在windows8认证的x86和x86-64计算机上禁用安全启动功能;然而对装有windows8的arm计算机而言却相反,它们必须不允许用户禁用安全启动。幸运的是,基于arm的windows8计算机目前很少见。我建议避免使用它们。
你的发行版是否支持efi技术?
大多数linux发行版已经支持efi好多年了。然而,不同的发行版对efi的支持程度不同。大多数主流发行版(fedora,opensuse,ubuntu等)都能很好的支持efi,包括对安全启动的支持。另外一些“自行打造”的发行版,比如gentoo,对efi的支持较弱,但它们的性质使其很容易添加efi支持。事实上,可以向任意linux发行版添加efi支持:你需要安装linux(即使在bios模式下),然后在计算机上安装efi引导加载程序。有关如何执行此操作的信息,请参阅“哎呀:将传统模式下安装的引导转为efi模式下的引导”部分。
你应当查看发行版的功能列表,来确定它是否支持efi。你还应当注意你的发行版对安全启动的支持情况,特别是如果你打算和windows8组成双启动。请注意,即使正式支持安全启动的发行版也可能要求禁用此功能,因为linux对安全启动的支持通常很差劲,或者导致意外情况的发生。
准备安装linux
下面几个准备步骤有助于在efi计算机上linux的安装,使其更加顺利:
1、升级固件
有些efi是有问题的,不过硬件制造商偶尔会发布其固件的更新。因此我建议你将固件升级到最新可用的版本。如果你从论坛的帖子知道自己计算机的efi有问题,你应当在安装linux之前更新它,因为如果安装linux之后更新固件,会有些问题需要额外的操作才能解决。另一方面,升级固件是有一定风险的,所以如果制造商提供了efi支持,最好的办法就是按它们提供的方式进行升级。
2、了解如何使用固件
通常你可以通过在引导过程之初按del键或功能键进入固件设置实用程序。按下开机键后尽快查看相关的提示信息,或者尝试每个功能键。类似的,esc键或功能键通常可以进入固件的内置引导管理器,可以选择要进入的操作系统或外部设备。一些制造商把这些设置隐藏的很深。在某些情况下,如此页面所述,你可以在windows8内做到这些。
3、调整以下固件设置
快速启动—此功能可以通过在硬件初始化时使用快捷方式来加快引导过程。这很好用,但有时候会使usb设备不能初始化,导致计算机无法从usb闪存驱动器或类似的设备启动。因此禁用快速启动可能有一定的帮助,甚至是必须的;你可以让它保持激活,而只在linux安装程序启动遇到问题时将其停用。请注意,此功能有时可能会以其它名字出现。在某些情况下,你必须启用usb支持,而不是禁用快速启动功能。
安全启动—fedora,opensuse,ubuntu以及其它的发行版官方就支持安全启动;但是如果在启动引导加载程序或内核时遇到问题,可能需要禁用此功能。不幸的是,没办法具体描述怎么禁用,因为不同计算机的设置方法也不同。请参阅我的安全启动页面获取更多关于此话题的信息。
注意:一些教程说安装linux时需要启用bios/csm/legacy支持。通常情况下,这样做是错的。启用这些支持可以解决启动安装程序涉及的问题,但也会带来新的问题。以这种方式安装的教程通常可以通过“引导修复”来解决这些问题,但最好从一开始就做对。本页面提供了帮助你以efi模式启动linux安装程序的提示,从而避免以后的问题。
csm/legacy选项—如果你想以efi模式安装,请关闭这些选项。一些教程推荐启用这些选项,有时这是必须的——比如,有些附加视频卡需要在固件中启用bios模式。尽管如此,大多数情况下启用csm/legacy支持只会无意中增加以bios模式启动linux的风险,但你并不想这样。请注意,安全启动和csm/legacy选项有时会交织在一起,因此更改任一选项之后务必检查另一个。
4、禁用windows的快速启动功能
这个页面描述了如何禁用此功能,不禁用的话会导致文件系统损坏。请注意此功能与固件的快速启动不同。
5、检查分区表
使用gptfdisk、parted或其它任意分区工具检查磁盘分区。理想情况下,你应该创建一个包含每个分区确切起点和终点(以扇区为单位)的纸面记录。这会是很有用的参考,特别是在安装时进行手动分区的时候。如果已经安装了windows,确定可以识别你的efi系统分区(esp),它是一个fat分区,设置了“启动标记”(在parted或gparted中)或在gdisk中的类型码为ef00。
安装linux
大部分linux发行版都提供了足够的安装说明;然而我注意到了在efi模式安装中的几个常见的绊脚石:
确保使用正确位深的发行版—efi启动加载器和efi自身的位深相同。现代计算机通常是64位,尽管最初几代基于intel的mac、一些现代的平板电脑和变形本、以及一些鲜为人知的电脑使用32位efi。虽然可以将32位efi引导加载程序添加至32位发行版,但我还没有遇到过正式支持32位efi的linux发行版。(我的《在linux上管理efi引导加载程序》一文概述了引导加载程序,而且理解了这些原则你就可以修改32位发行版的安装程序,尽管这不是一个初学者该做的。)在64位efi的计算机上安装32位发行版最让人头疼,我不准备在这里描述这一过程;在具有64位efi的计算机上,你应当使用64位的发行版。
正确准备引导介质—将.iso镜像传输到usb闪存驱动器的第三方工具,比如unetbootin,在创建正确的efi模式引导项时经常失败。我建议按照发行版维护者的建议来创建usb闪存驱动器。如果没有类似的建议,使用linux的dd工具,通过执行ddif=image.isoof=/dev/sdc在识别为/dev/sdc的usb闪存驱动器上创建一个镜像。至于windows,有windd和ddforwindows,但我从没测试过它们。请注意,使用不兼容efi的工具创建安装介质是错误的,这会导致人们进入在bios模式下安装然后再纠正它们的误区,所以不要忽视这一点!
备份esp分区—如果计算机已经存在windows或者其它的操作系统,我建议在安装linux之前备份你的esp分区。尽管linux不应该损坏esp分区已有的文件,但似乎这时不时发生。发生这种事情时备份会有很大用处。只需简单的文件级的备份(使用cp,tar,或者zip类似的工具)就足够了。
以efi模式启动—以bios/csm/legacy模式引导linux安装程序的意外非常容易发生,特别是当固件启用csm/legacy选项时。下面一些提示可以帮助你避免此问题:
进入linuxshell环境执行ls/sys/firmware/efi验证当前是否处于efi引导模式。如果你看到一系列文件和目录,表明你已经以efi模式启动,而且可以忽略以下多余的提示;如果没有,表明你是以bios模式启动的,应当重新检查你的设置。
使用固件内置的引导管理器(你应该已经知道在哪;请参阅“了解如何使用固件”)使之以efi模式启动。一般你会看到cd-r或usb闪存驱动器两个选项,其中一个选项包括efi或uefi字样的描述,另一个不包括。使用efi/uefi选项来启动介质。
禁用安全启动-即使你使用的发行版官方支持安全启动,有时它们也不能生效。在这种情况下,计算机会静默的转到下一个引导加载程序,它可能是启动介质的bios模式的引导加载程序,导致你以bios模式启动。请参阅我的安全启动的相关文章以得到禁用安全启动的相关提示。
如果linux安装程序总是无法以efi模式启动,试试用我的refind引导管理器制作的usb闪存驱动器或cd-r。如果refind启动成功,那它保证是以efi模式运行的,而且在基于uefi的pc上,它只显示efi模式的引导项,因此若您启动到linux安装程序,则应处于efi模式。(但是在mac上,除了efi模式选项之外,refind还显示bios模式的引导项。)
准备esp分区—除了mac,efi使用esp分区来保存引导加载程序。如果你的计算机已经预装了windows,那么esp分区就已存在,可以在linux上直接使用。如果不是这样,那么我建议创建一个大小为550mb的esp分区。(如果你已有的esp分区比这小,别担心,直接用就行。)在此分区上创建一个fat32文件系统。如果你使用gparted或者parted准备esp分区,记得给它一个“启动标记”。如果你使用gptfdisk(gdisk,cgdisk或sgdisk)准备esp分区,记得给它一个名为ef00的类型码。有些安装程序会创建一个较小的esp分区,并且设置为fat16文件系统。尽管这样能正常工作,但如果你之后需要重装windows,安装程序会无法识别fat16文件系统的esp分区,所以你需要将其备份后转为fat32文件系统。
使用esp分区—不同发行版的安装程序以不同的方式辨识esp分区。比如,debian和ubuntu的某些版本把esp分区称为“efibootpartition”,而且不会明确显示它的挂载点(尽管它会在后台挂载);但是有些发行版,像arch或gentoo,需要你去手动挂载。尽管将esp分区挂载到/boot进行相应配置后可以正常工作,特别是当你想使用gummiboot或elilo(译者注:gummiboot和elilo都是efi引导工具)时,但是在linux中最标准的esp分区挂载点是/boot/efi。某些发行版的/boot不能用fat分区。因此,当你设置esp分区挂载点时,请将其设置为/boot/efi。除非esp分区没有,否则不要为其新建文件系统—如果已经安装windows或其它操作系统,它们的引导文件都在esp分区里,新建文件系统会销毁这些文件。
设置引导程序的位置—某些发行版会询问将引导程序(grub)装到何处。如果esp分区按上述内容正确标记,不必理会此问题,但有些发行版仍会询问。请尝试使用esp分区。
其它分区—除了esp分区,不再需要其它的特殊分区;你可以设置根(/)分区,swap分区,/home分区,或者其它分区,就像你在bios模式下安装时一样。请注意efi模式下不需要设置bios启动分区,所以如果安装程序提示你需要它,意味着你可能意外的进入了bios模式。另一方面,如果你创建了bios启动分区,会更灵活,因为你可以安装bios模式下的grub,然后以任意模式(efi模式或bios模式)引导。
解决无显示问题—2013年,许多人在efi模式下经常遇到(之后出现的频率逐渐降低)无显示的问题。有时可以在命令行下通过给内核添加nomodeset参数解决这一问题。在grub界面按e键会打开一个简易文本编辑器。大多数情况下你需要搜索有关此问题的更多信息,因为此问题更多是由特定硬件引起的。
在某些情况下,你可能不得不以bios模式安装linux。但你可以手动安装efi引导程序让linux以efi模式启动。请参阅《在linux上管理efi引导加载程序》页面获取更多有关它们以及如何安装的可用信息。
解决安装后的问题
如果linux无法在efi模式下工作,但在bios模式下成功了,那么你可以完全放弃efi模式。在只有linux的计算机上这非常简单;安装bios引导程序即可(如果你是在bios模式下安装的,引导程序也应随之装好)。如果是和efi下的windows组成双系统,最简单的方法是安装我的refind引导管理器。在windows上安装它,然后编辑refind.conf文件:取消注释scanfor一行,并确保拥有hdbios选项。这样refind在引导时会重定向到bios模式的引导项。
如果重启后计算机直接进入了windows,很可能是linux的引导程序或管理器安装不正确。(但是应当首先尝试禁用安全启动;之前提到过,它经常引发各种问题。)下面是关于此问题的几种可能的解决方案:
使用efibootmgr—你可以以efi模式引导一个linux急救盘,使用efibootmgr实用工具尝试重新注册你的linux引导程序,如这里所述。
使用windows上的bcdedit—在windows管理员命令提示符窗口中,输入bcdedit/set{bootmgr}path\efi\fedora\grubx64.efi会用esp分区的efi/fedora/grubx64.efi文件作为默认的引导加载程序。根据需要更改此路径,指向你想设置的引导文件。如果你启用了安全启动,需要设置shim.efi,shimx64.efi或者preloader.efi(不管有哪个)为引导而不是grubx64.efi。
安装refind—有时候refind可以解决这个问题。我推荐使用cd-r或者usb闪存驱动器进行测试。如果linux可以启动,就安装debian软件包、rpm程序,或者.zip文件包。(请注意,你需要在一个高亮的linuxvmlinuz*选项按两次f2或insert修改启动选项。如果你的启动分区是单独的,这就更有必要了,因为这种情况下,refind无法找到根(/)分区,也就无法传递参数给内核。)
使用修复引导程序—ubuntu的引导修复实用工具可以自动修复一些问题;然而,我建议只在ubuntu和密切相关的发行版上使用,比如mint。有时候,有必要通过高级选项备份并替换windows的引导。
劫持windows引导程序—有些不完整的efi引导只能引导windows,就是esp分区上的efi/microsoft/boot/bootmgfw.efi文件。因此,你可能需要将引导程序改名(我建议将其移动到上级目录efi/microsoft/bootmgfw.efi),然后将首选引导程序复制到这里。(大多数发行版会在efi的子目录放置grub的副本,例如ubuntu的efi/ubuntu,fedora的efi/fedora。)请注意此方法是个丑陋的解决方法,有用户反映windows会替换引导程序,所以这个办法不是100%有效。然而,这是在不完整的efi上生效的唯一办法。在尝试之前,我建议你升级固件并重新注册自己的引导程序,linux上用efibootmgr,windows上用bcdedit。
有关引导程序的其它类型的问题-如果grub(或者你的发行版默认的其它引导程序或引导管理器)没有引导操作系统,你必须修复这个问题。因为grub2引导windows时非常挑剔,所以windows经常启动失败。在某些情况下,安全启动会加剧这个问题。请参阅我的关于grub2的页面获取一个引导windows的grub2示例。还会有很多原因导致linux引导出现问题,类似于bios模式下的情况,所以我没有全部写出来。
尽管grub2使用很普遍,但我对它的评价却不高-它很复杂,而且难以配置和使用。因此,如果你在使用grub的时候遇到了问题,我的第一反应就是用别的东西代替。我的用于linux的efi引导程序页面有其它的选择。其中包括我的refind引导管理器,它除了能够让许多发行版上的grub2工作,也更容易安装和维护-但是它还不能完全代替grub2。
除此之外,efi引导的问题可能很奇怪,所以你需要去论坛发帖求助。尽量将问题描述完整。bootinfoscript可帮助你提供有用的信息-运行此脚本,将生成的名为results.txt的文件粘贴到论坛的帖子上。一定要将文本粘贴到[code]和[/code]之间;不然会遭人埋怨。或者将results.txt文件上传到pastebin网站上,比如pastebin.com,然后将网站给你的url地址发布到论坛。
哎呀:将传统模式下安装的系统转为efi模式下引导
警告:这些指南主要用于基于uefi的pc。如果你的mac已经安装了bios模式下的linux,但想以efi模式启动linux,可以在osx中安装引导程序。refind(或者旧式的refit)是mac上的常用选择,但grub可以做的更多。
论坛上有很多人看了错误的教程,在已经存在efi模式的windows的情况下,安装了bios引导的linux,这一问题在2015年初很普遍。这样配置效果很不好,因为大多数efi很难在两种模式之间切换,而且grub也无法胜任这项工作。你可能会遇到不完善的efi无法启动外部介质的情况,也可能遇到efi模式下的显示问题,或者其它问题。
如前所述,在“解决安装后的问题”部分,解决办法之一就是在windows上安装refind,将其配置为支持bios模式引导。然后可以引导refind并链式引导到你的bios模式的grub。在linux上遇到efi特定的问题时,例如无法使用显卡,我建议你使用这个办法修复。如果你没有这样的efi特定的问题,在windows中安装refind和合适的efi文件系统驱动可以让linux直接以efi模式启动。这个解决方案很完美,它和我下面描述的内容等同。
大多数情况下,最好将linux配置为以efi模式启动。有很多办法可以做到,但最好的是使用linux的efi引导模式(或者,可以想到,windows,或者一个efishell)注册到你首选的引导管理器。实现这一目标的方法如下:
下载适用于usb闪存驱动器或cd-r的refind引导管理器。
从下载的镜像文件生成安装介质。可以在任何计算机上准备,不管是efi还是bios的计算机都可以(或者在其它平台上使用其它方法)。
如果你还没有这样做,请禁用安全启动。因为refindcd-r和usb镜像不支持安全启动,所以这很必要,你可以在以后重新启用它。
在目标计算机上启动refind。如前所述,你可能需要调整固件设置,并使用内置引导管理器选择要引导的介质。你选择的那一项也许在其描述中包含uefi这样的字符串。
在refind上测试引导项。你应该至少看到一个启动linux内核的选项(名字含有vmlinuz这样的字符串)。有两种方法可以启动它:
如果你没有独立的/boot分区,只需简单的选择内核并按回车键。linux就会启动。
如果你确定有一个独立的/boot分区,按两次insert或f2键。这样会打开一个行编辑器,你可以用它来编辑内核选项。增加一个root=格式以标识根(/)文件系统,如果根(/)分区在/dev/sda5上,就添加root=/dev/sda5。如果不知道根文件统在哪里,那你需要重启并尽可能想到办法。
在一些罕见的情况下,你可能需要添加其它内核选项来代替或补充root=选项。比如配置了lvm(lctt译注:logicalvolumemanager,逻辑卷管理)的gentoo就需要dolvm选项。
linux一旦启动,安装你想要的引导程序。refind的安装很简单,可以通过rpm、debian软件包、ppa,或从refind下载页面下载的二进制.zip文件进行安装。在ubuntu和相关的发行版上,引导修改程序可以相对简单地修复你的grub设置,但你要对它有信心可以正常工作。(它通常工作良好,但有时候会把事情搞得一团糟。)另外一些选项都在我的《在linux上管理efi引导加载程序》页面上。
如果你想在安全启动激活的情况下引导,只需重启并启用它。但是,请注意,可能需要额外的安装步骤才能将引导程序设置为使用安全启动。有关详细信息,请参阅我关于这个主题的页面或你的引导程序有关安全启动的文档资料。
重启时,你可以看到刚才安装的引导程序。如果计算机进入了bios模式下的grub,你应当进入固件禁用bios/csm/legacy支持,或调整引导顺序。如果计算机直接进入了windows,那么你应当阅读前一部分,“解决安装后的问题”。
你可能想或需要调整你的配置。通常是为了看到额外的引导选项,或者隐藏某些选项。请参阅引导程序的文档资料,以了解如何进行这些更改。
参考和附加信息
信息网页
我的《在linux上管理efi引导加载程序》页面含有可用的efi引导程序和引导管理器。
osx'sblesstool的手册页页面在设置osx平台上的引导程序或引导管理器时可能会很有用。
efi启动过程描述了efi启动时的大致框架。
archlinuxuefiwikipage有大量关于uefi和linux的详细信息。
亚当·威廉姆森写的一篇不错的《什么是efi,它是怎么工作的》。
这个页面描述了如何从windows8调整efi的固件设置。
马修·j·加勒特是shim引导程序的开发者,此程序支持安全启动,他维护的博客经常更新有关efi的问题。
如果你对efi软件的开发感兴趣,我的《efi编程》页面可以为你起步助力。
附加程序
refind官网
gummiboot官网
elilo官网
grub官网
gptfdisk分区软件官网
ubuntu的引导修复实用工具可帮助解决一些引启动问题
交流
sourceforge上的refind交流论坛是refind用户互相交流或与我联系的一种方法。
pastebin网站,比如,是在web论坛上与其他用户交换大量文本的一种便捷的方法。
(题图:pixabay,cc0)