标签归档:EFI

Linux中设置UEFI启动项 -- efibootmgr

usage: efibootmgr [options]
-a | --active sets bootnum active
-A | --inactive sets bootnum inactive
-b | --bootnum XXXX modify BootXXXX (hex)
-B | --delete-bootnum delete bootnum (hex)
-c | --create create new variable bootnum and add to bootorder
-C | --create-only create new variable bootnum and do not add to bootorder
-D | --remove-dups remove duplicate values from BootOrder
-d | --disk disk (defaults to /dev/sda) containing loader
-e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess
-E | --device num EDD 1.0 device number (defaults to 0x80)
-g | --gpt force disk with invalid PMBR to be treated as GPT
-i | --iface name create a netboot entry for the named interface
-l | --loader name (defaults to \EFI\redhat\grub.efi)
-L | --label label Boot manager display label (defaults to "Linux")
-n | --bootnext XXXX set BootNext to XXXX (hex)
-N | --delete-bootnext delete BootNext
-o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex)
-O | --delete-bootorder delete BootOrder
-p | --part part (defaults to 1) containing loader
-q | --quiet be quiet
-t | --timeout seconds set boot manager timeout waiting for user input.
-T | --delete-timeout delete Timeout.
-u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII)
-v | --verbose print additional information
-V | --version return version and exit
-w | --write-signature write unique sig to MBR if needed
-@ | --append-binary-args file append extra args from file (use "-" for stdin)
-h | --help show help/usage

UEFI Windows7/8系统下的GUID磁盘创建休眠分区

      使用UEFI模式安装Windows7的好处就是开机可以直接跳过传统的BIOS自检,可以省下4~5秒的时间。再说现在的SSD硬盘价格很便宜了,开机的整个过程还不到30秒,可要用UEFI模式安装Windows7,磁盘模式就必须使用GPT格式(传统模式是MBR格式,不支持2TB以上的硬盘分区),可有个问题是MBR磁盘创建休眠分区(iFFS)可以选择OS/2 hiddle C:(set id=0x84),可到了GUID磁盘下要创建休眠分区就没法用diskgenius软件来创建休眠分区,这个问题也折腾了我很久,可创建休眠分区的好处是显尔易见,在Windows7系统下只要主板支持IRST(Intel Rapid Start(快速启动),系统直接睡眠或休眠,下次开机时间可能只要5~6秒的时间。

      那我就告诉大家如何在GUID磁盘下创建一个休眠分区。其实跟MBR磁盘模式下创建休眠分区一个样。

      首先用系统自带的磁盘管理软件选择最后一个分区选压缩卷,根据系统安装内存大少键入压缩空间量,注意2GB内存输入2048,4GB内存是4096,8GB内存是8192,16GB内存是16384。32GB内存是32768。

      接着用管理员模式打开命令提示符,键入diskpart,

      再键入Select disk 0;

      第三步键入create partition  primary

      然后键入set id=D3BFE2DE-3DAF-11DF-BA40-E3A556D89593

      至此休眠分区创建成功。接着安装Intel Rapid Start 软件就可以享受休眠后开机神速的感觉了。

Managing EFI Boot Loaders for Linux

2011年底,Linux内核开发人员开始研究一种新方法,用于启动基于EFI系统的Linux。该方法将Linux内核变成一个EFI应用程序。一旦被加载了,该内核将接管计算机,在严格意义上有效果地绕开/忽略启动加载器(boot loader)的需求。该方法有其独特的优缺点,这些优缺点将在本文中详细阐述。(如果你对技术的细节感兴趣,请阅读 Linux Kernel Mailing
List thread on this topic.

什么时候使用Kernel's EFI Stub
Loader

Linux 内核的EFI stub loader有很多特性,有些是正面的,有些是负面的:

   在某种意义上讲,EFI boot loader是内置于内核中的,因此内核必须是在一个EFI可以读取的分区中,通常是EFI系统分区(ESP)。就像你使用ELILO一样,这会增加ESP的尺寸要求。也可以通过使用第二个FAT分区或EFI filesystem drivers来变通的解决该问题。

   如果想使用初始化的RAM盘(initrd,并且这个盘的内核启动有自己的stub loader, 那么EFi就必须能够读取stub loader 和内核。这与正在使用ELILO一样,会增加对ESP的大小要求。

   你必须有办法将内核参数传递给内核,比如initrd的名字和root filesystem的位置。这可以通过以下方法实现:在建立内核的时候嵌入参数;或者在EFI 外壳(shell)的命令行中输入该选项;也可以通过启动管理器(boot manager)传递。但是,并不是所有的启动管理器都可以传递任意选项,比如 rEFIt就不可以。

   从理论上讲,让内核直接从EFI启动可以改善内核初始化计算机硬盘的能力。至于实际中是否有提高就是另外一回事了。

   EFI stub loader 被添加到内核3.3.0,成为3.3.0特性。如果使用较旧版本的内核, 就需要将内核做下修补。2013年初,Fedora 17OpenSUSE
12.2
Ubuntu 12.10都使用包含EFI stub loader 的内核。所以我相信其他的发行版(distribution)也会这样,但是,依然会有一些版本(对升级内核持保守态度的)会继续使用3.3.0之前的内核。当然了,该情况会随着时间的变化有所改善的。

提示:如果将日志(journaling)禁用了,就可以将Linux/boot 分区放到HFS+上。也可以在Mac的ESP上使用HFS+,这时,将日志(journaling)禁用了,从LINUX读取filesystem会更简单。这个两种不太寻常的方式都可以更简单的升级和引导EFI
stub支持的内核。但是,绝大多数版本(distribution)的安装程序不支持这个配置,所以必须在使用传统的安装方法后再建立。

   该方法的可靠性还尚不确定,但是我的最始测试结果是很乐观的-----进行了7次测试,都可以成功启动,其中只有一次出现奇怪的(也可能是很重要的)警告,发生在32位的Mac Mini上。可以从Mac OS X HFS+分区上启动LINUX kernel EFI stub loader,但是在F ESP's FAT32
filesystem
上不能启动。使用ext2fsReiserFS(采用的是rEFIt rEFInd),可以成功启动这两种文件系统。尽管如此,从FAT ESP是不能启动的,这使设置变得复杂化。局限依然存在,但用内核stub loader的成功率远高于任何其他的EFI boot loader, 与之成功率接近的是ELILOGRUB Legacy。另一个关于可靠性的问题是,对初始Ram盘的规格要求很高。

   关于上一点提到的警告(希望是暂时的),有用户报告了some3.7x3.8x内核EFIstub loader 的问题。该问题出现时,内核就停止引导。Mac 和联想的用户似乎更容易出现这个问题,Arch Linux用户受此问题影响最大。因为他们都倾向于使用最前沿的内核并且比其他版本(distribution)的用户更愿意使用EFI stub loader. 可以点击这里 this thread查看更多关于此问题的讨论。令人奇怪的是,一个版本出现这个问题后,下个版本就不会出现;一些用户(并不是所有的用户)可以通过转换引导管理器或者引导管理器的编译方式来跳过此问题。这是个非常令人困惑的问题,EFI stub loader 的主要开发人员都知道这个情况。

尽管一些3.7x 和3.8x内核依然受此问题困扰,但是该方法在最近发布的版本上都运行正常。EFI stub loader 在与 rEFInd 或 gummiboot在一起使用时效果最好,因为在用这种方式引导,可以指定Linus内核需要的额外选项,免去了每次引导时都需要输入选项的不足。实际上呢,正如rEFInd page, 中所描述的,rEFInd 与 EFI stub loader的结合允许通过拖放方式升级内核,而不必编辑任何配置文件!

安装EFI Stub Loader

注意:这部分是关于编译内核的。如果你正在使用的是3.3.0 或者是更新的支持EFI stub loader的内核,那么你需要做的就是将内核以及它的初始RAM disk 复制到 ESP或是在ESP上的安装驱动(driver)(以便内核可以从EFI被读取)。但是,你必须知道如何运行(launch)内核,"Configuring and Using the EFI Stub
Loader."
这里有简单介绍。

安装EFI stub loader 需要配置你的3.3.0内核 (或者更新的内核)并对其进行编译(也可以用适合的预配置好的内核),然后将内核安装到ESP(或某些EFI可以读取的分区)。如果在编译内核时不能独立完成,可以浏览下相关的网页,比如How to: Compile Linux Kernel
2.6
 和 Compiling the Linux Kernel。如果你之前没有做该项工作,那就得从数千个选项中选出你所需要的选项。通用型的内核比较方便,因为它的选项可以适应几乎所有的计算机,这与版本提供者(distribution provideer)使用的相似。但是,你需要留意一两个内核配置选项:

  CONFIG_EFI_STUB--- 该选项的位置在这里:accessible as Processor Type and Features
-> EFI Runtime Service Support -> EFI Stub Support。这个选项是将EFI stub loader添加到内核的重要选项,如果想使用该功能就必须勾选它。

  CONFIG_CMDLINE_BOOL  CONFIG_CMDLINE-----虽然第一个选项使第二个生效,但是我将他们看做一个选项。通过对命令行设置CONFIG_CMDLINE,需要在EFI外壳提示符键入或通过引导管理器传递,如果没有这个需要可以跳过此选项。如果想通过EFI引导管理器来运行内核,并且该引导管理器不允许将任意参数传递给你的boot loader, 比如EFI和rEFIt中功能不全的引导管理器,这时候这个选择就发挥作用了。如果你打算使用rEFInd或者其他的支持传递任意选项到boot loader 的引导管理器,就不再需要设置该选项了。

如下图:

 

内核编译完成后,需要用正常方式安装模块(键入make
modules_install
)并且准备一个初始的RAM盘(使用 mkinitrd 或 mkinitramfs,
不同的distribution的操作细节会有差别)。将内核文件和初始的RAM盘复制到Linux /boot目录和ESP。例如,你可能会使用ESP上的EFI/linux子目录来存放这些文件。

配置和使用EFI Stub Loader

内核的stub loader 本身不需要配置,但是有时候,在从它里面建立选项的时候会需要。如果编译的内核stub loader没有这些选项的时候,你需要知道如何将选项传递给它,这可以在boot loader中的选项行中传递。此外,如果使用初始RAM盘了,就需要将初始RAM盘的名字也传递给它。在EFI shell输入后,会有如下生成的命令:

fs0:> bzImage.efi
root=/dev/sda4 ro initrd=\EFI\linux\initrd.img

这是个小例子,其中将内核命名为bzImage.efi,root Linux
filesystem在/dev/sda4,初始RAM盘是安装在了ESP EFI的/linux/initrd.img这个文件。 ro这个选项使Linux以只读方式挂载root filesystem。(这个是标准的;初始化脚本后来重新挂载filesystem read/write)。需要注意的是root=这个选项识别Linux root
filesystem, 使用Linux样式的向前倾的斜线(/)来分隔目录元素,与Linux root(/)filesystem相对; 但是,initrd= 使用的是EFI风格的反斜杠(\)用来识别初始的RAM盘,这与ESP's root相对。这很重要,因为不正确的 initrd=规范会使内核停止。较旧版本的EFIstub loader(3.3.0,至少是3.4.0)不会报错。再新一点的版本(比如3.6.0,或者3.5x内核)在不能读取它的initrd文件时 会报错。

EFI有自己的引导管理器,但是通常比较简单原始。然而,如果你的引导管理器可以让你选择boot loader, 或者是你愿意只从一个内核中引导,你可以在Linux通过 efibootmgr程序进行设置。可以通过下面的命令行实现:

# efibootmgr -c
-d /dev/sda -p 1 -L "Arch Linux" -l '\EFI\arch\vmlinuz-arch.efi' -u
root=/dev/sda3 ro initrd=EFI/arch/initramfs-arch.img

该命令是使用指定的 –u后面的函数来让EFI引导 \EFI\arch\vmlinuz-arch.efi这个文件。理论上,如果使用/dev/sda1作为ESP,-d和-p这两个选项就没有必要了;这里将这两个选项加上,是以防你不是使用这样的ESP;此处根据实际情况作改动。 如果你的EFI执行/实施有个不错的启动菜单,你可以用多个命令(multiple commands)建立替代启动选项(alternative boot
options),比如引导不同的内核、多重版本(multiple
distributions)以及使用备用选项(using alternate options)。

如果你使用的是分开的(单独的;分开的;不同的;各自的)EFI引导管理程序,比如rEFInd 或 gummiboot,就可以通过浏览配置将必需的选项传递给内核。刚才提到过,rEFIt不可以。rEFIt和 rEFInd 可通过下面两种方式将选项传递给EFI stub loader: 在主要的refind.conffile中写boot loader节定义;或者是依靠 refind_linux.conf这个文件的半自动查找方式,可以在目录中的 refind_linux.conf文件为所有的内核读取选项。任何一种方式都可将内核支持与rEFInd结合,这个结合在多引导环境中比较灵活并且相对来说容易维持。但是版本(distribution)脚本不支持rEFInd,所以不得不做一些手工维护。gummiboot 的每个主菜单选项都需要一个独立的配置文件,并且所有的版本(distribution)的维护脚本都不支持,需要手工维护。

理论上讲,在使用chainloader(而不是使用内核或linux选项)的GRUB Legacy或GRUB 2上运行编译好的支持EFI stub的Linux内核是完全有可能的。(但我还没试过)。如果你用常规的方式运行遇到硬件初始化的文件,那么使用chainloader就可能会方便一些,但是这一点我还不是非常确定。

ext2fs/ext3fs, ext4fs 以及ReiserFS的EFI驱动程序(drivers)是可用的,这另从Linux filesystem 加载支持EFI stub的Linux内核成为可能。尽管有时候你可能需要给内核重命名或使用.efi这个扩展名建立连接,但是该方法可以简化配置,因为你不必将内核复制到ESP。http://www.rodsbooks.com/refind/drivers.html  这里介绍EFI drivers的使用,并重点介绍配置rEFInd和加载EFI drivers。

维护Kernel's EFI Stub
Loader

因为目前大多数版本(distribution)都不支持内核的EFI stub loader,所以只能自己进行维护。将来,各个版本将有可能使用 efibootmgr或其他工具来帮助维护那些使用该方法的设备,再或者通过维护GRUB, rEFInd, 或 gummiboot的配置文件时支持Kernel's EFI Stub Loader

 

Linux终于搞定Windows 8的UEFI安全启动

所有的Windows 8硬件设备都将默认采用UEFI(统一可扩展固件接口)的安全启动(Secure Boot),防止未经授权的引导装载程序(OS Loader)在BIOS中启动,UEFI只启动通过认证的引导装载程序,而恶意软件则无法再利用这种方法攻击用户。

当微软在2011年宣布这一消息的时候,立即引起了Linux社区的不满,尽管微软表示这并不会将其它操作系统关在门外(通过设置PC固件可以控制任何操作系统执行安全启动,而并非只是Windows系统),自由软件基金会(Free Software Foundation,FSF)还曾呼吁大家抵制微软的这一举措,认为这意味着获得微软认证的计算机无法启动未授权操作系统,“安全启动”应该称为“受限启动”。

Fedora、红帽(Red Hat)都找到了应对办法,与微软签订协议,通过电子签名来提供他们自己的Windows 8系统兼容UEFI安全启动键。难道这就是所有Linux厂商的命运?

本周,Linux基金会终于找到了解决办法,可以让Linux发行版在采用UEFI安全启动的PC上顺利安装运行,就像Windows 8一样。Linux基金会在官方网站上描述道:“在nutshell中,Linux基金会将获取一个微软密钥并签署一个小的预引导装载程序(pre-bootloader),然后链式加载(无需任何形式的签名许可)一个预先指示的引导装载程序,从而启动Linux(或其它操作系统)。这种预引导装载程序能够采用一种‘当前用户’测试来确保它不会用来引导恶意程序。这种预引导装载程序可以被用在CD/DVD安装或LiveCD发行版本中,甚至能够用来在安全模式下启动任一款预装操作系统。”

这种预引导装载程序的源代码当前已经可以下载,不过Linux基金会表示:“获取微软签名的流程还要花费一段时间,一旦完成,Linux基金会将在官网上放出这个预引导装载程序,届时所有人都可以下载并使用它。”

Linux终于搞定Windows 8的UEFI安全启动

让VMware支持EFI启动方式

(U)EFI is the next generation of BIOS.  When you install ESXi 5.0 on VMware Workstation 8, it just uses a regular BIOS.

It is however possible to use EFI instead of BIOS.

The vSphere Installation and Setup guide states that you shouldn’t change the boot type from BIOS to EFI on an already installed ESXi host.  It does work however in VMware Workstation.  But for production systems, just stick to the guide and reinstall the host using EFI instead of BIOS on your hardware server.

 

Now, your normal Virtualized vSphere host in VMware Workstation uses a BIOS.  Notice this in the startup screen when you boot the VM:

 点击查看原图

Power down your Virtual ESXi host.  Go to the location where the vmx file is stored and edit it with your favorite editor.

 点击查看原图

Add the line firmware = “efi” somewhere in the vmx file.

 点击查看原图

Close and save the vmx file.  Power On the ESXi host.  You’ll notice the progress bar at the bottom during the boot is gone:

 点击查看原图

If you look into the vmware.log you can also see some references that he’s using EFI now:

 点击查看原图

Et voila, your ESXi hosts are now booting from EFI instead of BIOS!

 

Tip: if you press ESC during the boot, you can configure some EFI parameters.  Play with it and learn to know if since EFI will replace BIOS gradually!

点击查看原图