# 12.11编辑:重读rEFInd文档,发现它有一个很好的特性,即如果在/boot下发现后缀名为.efi.signed的内核文件,即自动屏蔽除后缀.efi.signed以外完全同名的内核文件。
# 此外,文档中确认了rEFInd的默认特性:发现linux内核后,会自动寻找以init开头并具备相同内核版本号的initrd镜像文件,其中内核版本号定义为init之后的第一个数字到最后一个数字。
# 这为签名内核的命名提供了方便:签名内核可命名为vmlinuz-xyz.efi.signed,rEFInd在加载此内核时,会自动寻找并加载initrd.img-xyz,xyz为内核版本号。这样,签名内核可以直接加载而无需修改启动参数。
- 一、背景
- 1. 安全启动(Secure Boot)是微软提出的计算机启动的新标准,目前已通过新一代UEFI固件全面部署在计算机中,Linux社区也认可了这一标准,并推荐用户在BIOS中打开这一设置。
2. 安全启动会影响通过UEFI Shell调用的驱动文件(.efi),包括用来启动WIndows和Ubuntu等操作系统的引导文件。对于windows,该文件叫做bootmgr.efi,对于ubuntu,该文件叫做grubx64.efi。
3. bootmgr.efi是windows自带的经过微软安全签名的,grubx64.efi是ubuntu自带的经过微软安全签名的,因此打开安全启动后,这两个文件均可以通过UEFI Shell加载并引导系统。
4. 目前ubuntu的默认启动逻辑是,通过UEFI调用grubx64.efi,然后再通过Grub loader加载Linux内核镜像。
5. Linux内核自3.3x版本之后,已经在其内核中加入了对UEFI直接加载的支持,也就是stubloader支持,从而可以跳过Grub Loader这一步。
6. 开启安全启动时,只有经过安全签名的内核才能由UEFI直接调用。
- 1. 安全启动(Secure Boot)是微软提出的计算机启动的新标准,目前已通过新一代UEFI固件全面部署在计算机中,Linux社区也认可了这一标准,并推荐用户在BIOS中打开这一设置。
- 二、rEFInd
1. rEFInd是一个第三方的UEFI程序,通过它可以方便地调用各种UEFI驱动文件。rEFInd软件包可以通过官方源安装,也可以通过其ppa源安装,后者的版本要高一些,但是有一个很荒谬的问题:rEFInd没有为其自身进行安全签名。也就是说,如果你打开了安全启动,rEFInd自己也启动不了,更别说通过它加载其他驱动了。
2. 好在rEFInd提供了对其自身做安全签名并将安全证书(refind_local.cer)注册到UEFI的方法:refind-install,该命令可以自动生成refind_local.key,refind_local.crt和refind_local.cer,部署签名后的refind到efi分区,并将refind_local.cer注册到UEFI固件。3. 建议将/etc/refind.d/keys下的refind_local.key和refind_local.crt备份到别处。因为这两个文件生成的证书已经注册到计算机的UEFI,以后可以方便地用它们来对任何其他的.efi文件做签名,无需再使用shim注册。代码: 全选
# refind-install --localkeys --shim /usr/lib/shim/shimx64.efi.signed --keepname
- 三、linux签名内核
- 1. Ubuntu官方源里提供了经过安全签名的内核,可以直接安装
安装程序会在/boot下自动生成vmlinuz-xyz.efi.signed文件,这个文件可以由rEFInd直接加载启动系统。
代码: 全选
# apt install linux-signed-image-xyz linux-signed-generic
2. 第三方内核模块
开启安全启动时,第三方内核模块也需要进行安全签名,否则无法载入,需要使用内核源码中自带的sign-file来签名。以virtualbox为例以上命令对vbox生成的4个内核模块做签名,其中`uname -r`表示当前使用内核版本号。如果要在其他内核下使用vbox,替换其中的版本号即可。代码: 全选
/usr/src/linux-headers-`uname -r`/scripts/sign-file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer /lib/modules/`uname -r`/misc/vboxdrv.ko /usr/src/linux-headers-`uname -r`/scripts/sign-file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer /lib/modules/`uname -r`/misc/vboxnetadp.ko /usr/src/linux-headers-`uname -r`/scripts/sign-file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer /lib/modules/`uname -r`/misc/vboxnetflt.ko /usr/src/linux-headers-`uname -r`/scripts/sign-file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer /lib/modules/`uname -r`/misc/vboxpci.ko
- 1. Ubuntu官方源里提供了经过安全签名的内核,可以直接安装
在一些情况下,refind安装程序在写入密匙时会失败,这时需要使用mok管理工具手动写入,使用mokutil命令,例如
代码: 全选
sudo mokutil --import /etc/refind.d/keys/refind_local.cer