当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 安全启动模式下使用rEFInd跳过grub直接引导内核的方法
帖子发表于 : 2017-12-09 11:11 

注册: 2005-09-13 4:56
帖子: 1129
系统: Ubuntu QQ
送出感谢: 0 次
接收感谢: 47
记录一下配置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. 安全启动(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直接调用。


    二、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]

    三、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,就完成了导入。


_________________
添加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 编辑于 2018-01-04 10:54,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法
帖子发表于 : 2017-12-14 19:44 
头像

注册: 2008-12-16 14:01
帖子: 1135
地址: 漂在江湖
送出感谢: 14
接收感谢: 13
mark


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法
帖子发表于 : 2018-01-02 22:44 
头像

注册: 2008-12-16 14:01
帖子: 1135
地址: 漂在江湖
送出感谢: 14
接收感谢: 13
引用:
6. 然而因为ubuntu官方只对grubx64.efi做了安全签名,没有对(升级后的)Linux(压缩)内核,也就是/boot/vmlinuz-xyz做安全签名(xyz为内核版本号),导致在开启安全启动时无法通过UEFI直接加载内核。


好像现在已经对“Linux(压缩)内核”做了安全签名。
附件:
2018-01-02 22-40-39屏幕截图.png
2018-01-02 22-40-39屏幕截图.png [ 145.06 KiB | 被浏览 570 次 ]



页首
 用户资料  
 
4 楼 
 文章标题 : Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法
帖子发表于 : 2018-01-03 0:37 

注册: 2005-09-13 4:56
帖子: 1129
系统: Ubuntu QQ
送出感谢: 0 次
接收感谢: 47
那倒是挺好。

是否清楚这个签名是内核安装包里自带的,还是安装的过程中才做的签名?能贴一下/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一下,就可以直接用,是不是很方便?觉得方便就按个赞。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法
帖子发表于 : 2018-01-04 11:25 

注册: 2005-09-13 4:56
帖子: 1129
系统: Ubuntu QQ
送出感谢: 0 次
接收感谢: 47
明白了,你那里装了签名内核吧?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一下,就可以直接用,是不是很方便?觉得方便就按个赞。


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 安全启动模式下使用rEFInd跳过grub直接引导内核的方法
帖子发表于 : 2018-01-04 11:31 

注册: 2005-09-13 4:56
帖子: 1129
系统: Ubuntu QQ
送出感谢: 0 次
接收感谢: 47
明白了,你那里装了签名内核吧?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一下,就可以直接用,是不是很方便?觉得方便就按个赞。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译