安全启动模式下使用rEFInd跳过grub直接引导内核的方法

启动讨论 grub/grub2/syslinux/grub4dos/Lilo
回复
funicorn
帖子: 1131
注册时间: 2005-09-13 4:56
系统: Ubuntu QQ
送出感谢: 0
接收感谢: 47 次

安全启动模式下使用rEFInd跳过grub直接引导内核的方法

#1

帖子 funicorn » 2017-12-09 11:11

记录一下配置rEFInd,实现在计算机安全启动模式下跳过grub直接引导内核的方法
# 12.11编辑:重读rEFInd文档,发现它有一个很好的特性,即如果在/boot下发现后缀名为.efi.signed的内核文件,即自动屏蔽除后缀.efi.signed以外完全同名的内核文件。
# 此外,文档中确认了rEFInd的默认特性:发现linux内核后,会自动寻找以init开头并具备相同内核版本号的initrd镜像文件,其中内核版本号定义为init之后的第一个数字到最后一个数字。
# 这为签名内核的命名提供了方便:签名内核可命名为vmlinuz-xyz.efi.signed,rEFInd在加载此内核时,会自动寻找并加载initrd.img-xyz,xyz为内核版本号。这样,签名内核可以直接加载而无需修改启动参数。
  1. 一、背景
    • 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. 二、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固件。

    代码: 全选

    # refind-install --localkeys --shim /usr/lib/shim/shimx64.efi.signed --keepname
    3. 建议将/etc/refind.d/keys下的refind_local.key和refind_local.crt备份到别处。因为这两个文件生成的证书已经注册到计算机的UEFI,以后可以方便地用它们来对任何其他的.efi文件做签名,无需再使用shim注册。
[/list]
  1. 三、linux签名内核
    • 1. Ubuntu官方源里提供了经过安全签名的内核,可以直接安装

      代码: 全选

      # apt install linux-signed-image-xyz linux-signed-generic
      
      安装程序会在/boot下自动生成vmlinuz-xyz.efi.signed文件,这个文件可以由rEFInd直接加载启动系统。

      2. 第三方内核模块
      开启安全启动时,第三方内核模块也需要进行安全签名,否则无法载入,需要使用内核源码中自带的sign-file来签名。以virtualbox为例

      代码: 全选

      /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
      
      以上命令对vbox生成的4个内核模块做签名,其中`uname -r`表示当前使用内核版本号。如果要在其他内核下使用vbox,替换其中的版本号即可。
四、MOK密匙管理

在一些情况下,refind安装程序在写入密匙时会失败,这时需要使用mok管理工具手动写入,使用mokutil命令,例如

代码: 全选

sudo mokutil --import /etc/refind.d/keys/refind_local.cer
执行后会提示你输入并确认一个密码(跟sudo密码不是一回事,后面要用到)。重启,计算机会自动启动到密匙管理界面,选择“Enroll MOK”,再选择continue,然后输入之前设置的密码,再选择yes,就完成了导入。
上次由 funicorn 在 2018-01-04 10:54,总共编辑 1 次。
添加ppa后只更新此ppa:
update-ppa()
{ sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/$1.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
}
写入~/.bashrc,source一下,就可以直接用,是不是很方便?觉得方便就按个赞。
头像
男菜鸟
帖子: 1182
注册时间: 2008-12-16 14:01
来自: 漂在江湖
送出感谢: 14 次
接收感谢: 15 次

Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法

#2

帖子 男菜鸟 » 2017-12-14 19:44

mark
头像
男菜鸟
帖子: 1182
注册时间: 2008-12-16 14:01
来自: 漂在江湖
送出感谢: 14 次
接收感谢: 15 次

Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法

#3

帖子 男菜鸟 » 2018-01-02 22:44

6. 然而因为ubuntu官方只对grubx64.efi做了安全签名,没有对(升级后的)Linux(压缩)内核,也就是/boot/vmlinuz-xyz做安全签名(xyz为内核版本号),导致在开启安全启动时无法通过UEFI直接加载内核。
好像现在已经对“Linux(压缩)内核”做了安全签名。
2018-01-02 22-40-39屏幕截图.png
funicorn
帖子: 1131
注册时间: 2005-09-13 4:56
系统: Ubuntu QQ
送出感谢: 0
接收感谢: 47 次

Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法

#4

帖子 funicorn » 2018-01-03 0:37

那倒是挺好。

是否清楚这个签名是内核安装包里自带的,还是安装的过程中才做的签名?能贴一下/etc/kernel/postinst.d/下的脚本名称吗?
添加ppa后只更新此ppa:
update-ppa()
{ sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/$1.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
}
写入~/.bashrc,source一下,就可以直接用,是不是很方便?觉得方便就按个赞。
funicorn
帖子: 1131
注册时间: 2005-09-13 4:56
系统: Ubuntu QQ
送出感谢: 0
接收感谢: 47 次

Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法

#5

帖子 funicorn » 2018-01-04 11:25

明白了,你那里装了签名内核吧?linux-signed-image-xyz

今天才注意到ubuntu源里有签名内核,只是默认没有安装。安装了签名内核就不需要那个脚本了,已对原文做了修改。
男菜鸟 写了:
6. 然而因为ubuntu官方只对grubx64.efi做了安全签名,没有对(升级后的)Linux(压缩)内核,也就是/boot/vmlinuz-xyz做安全签名(xyz为内核版本号),导致在开启安全启动时无法通过UEFI直接加载内核。
好像现在已经对“Linux(压缩)内核”做了安全签名。
2018-01-02 22-40-39屏幕截图.png
添加ppa后只更新此ppa:
update-ppa()
{ sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/$1.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
}
写入~/.bashrc,source一下,就可以直接用,是不是很方便?觉得方便就按个赞。
funicorn
帖子: 1131
注册时间: 2005-09-13 4:56
系统: Ubuntu QQ
送出感谢: 0
接收感谢: 47 次

Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法

#6

帖子 funicorn » 2018-01-04 11:31

明白了,你那里装了签名内核吧?linux-signed-image-xyz

今天才注意到ubuntu源里有签名内核,只是默认没有安装。安装了签名内核就不需要那个脚本了,已对原文做了修改。

看了一下安装后执行脚本,是把一个安装包里自带的签名文件置入原内核里了:
[code】cp /boot/$kernel /boot/$kernel.efi.signed
sbattach --attach /usr/lib/linux/$kernel.efi.signature /boot/$kernel.efi.signed[/code]
男菜鸟 写了:
6. 然而因为ubuntu官方只对grubx64.efi做了安全签名,没有对(升级后的)Linux(压缩)内核,也就是/boot/vmlinuz-xyz做安全签名(xyz为内核版本号),导致在开启安全启动时无法通过UEFI直接加载内核。
好像现在已经对“Linux(压缩)内核”做了安全签名。
2018-01-02 22-40-39屏幕截图.png
添加ppa后只更新此ppa:
update-ppa()
{ sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/$1.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
}
写入~/.bashrc,source一下,就可以直接用,是不是很方便?觉得方便就按个赞。
回复

回到 “启动和引导”