我在使用 UEFI/安全启动在 Fedora 27 中签署我的 zfs 模块时遇到了一些问题,我希望这里有人能够提供帮助。
作为我通常如何执行此操作的快速说明,我使用已经生成并通过 efibootmgr 注册的密钥对 VirtualBox 模块进行签名,命令如下:
# /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./key.priv ./key.der $(modinfo -n vboxdrv)
它工作得很好,因为 vboxdrv 作为普通内核模块存在,并且我为每次内核更新成功地执行相同的操作,并且该过程足够通用,我应该能够使用 zfs 执行相同的操作。但尝试这样做失败了。检查# modinfo -n zfs
,我发现 zfs 内核模块似乎作为压缩文件存在 - /lib/modules/4.15.17-300.fc27.x86_64/extra/zfs.ko.xz
(这是正确的当前内核版本)。
为了查看其他地方是否存在另一个模块,我运行了# find / -name zfs.ko
它,但没有返回任何内容,因此这个 .xz 文件是唯一可用的 zfs 模块。好吧,所以我运行 # xz --decompress zfs.ko.xz
。这告诉我数据已损坏(xz 实用程序返回此错误,表明它不是 xz 压缩文件,或者至少以某种方式进行了修改,否则无法由内置 xz 处理) 。
# modinfo zfs
只返回 zfs.ko.xz 的路径和 modinfo 错误。
所以我现在很茫然。禁用安全启动并不是我真正想要考虑的选项。如果我无法先解压缩文件,我该如何签署压缩模块?或者它是否已经用可供我下载的密钥进行了签名,我应该注册?
答案1
您可以将压缩模块解压,签名,然后重新压缩
unxz zfs.ko.xz
sign-file sha1 "${key}" "${x509}" "zfs.ko"
xz -f zfs.ko
或者更通用一点(我将其用于 evdi,灵感来自https://gist.github.com/dop3j0e/2a9e2dddca982c4f679552fc1ebb18df)
for module in $(dirname $(modinfo -n evdi))/*.ko*; do
module_basename=${module:0:-3}
module_suffix=${module: -3}
if [[ "$module_suffix" == ".xz" ]]; then
unxz $module
echo sign-file sha1 "${key}" "${x509}" "${module_basename}"
sign-file sha1 "${key}" "${x509}" "${module_basename}"
xz -f ${module_basename}
elif [[ "$module_suffix" == ".gz" ]]; then
gunzip $module
sign-file sha1 "${key}" "${x509}" "${module_basename}"
gzip -9f $module_basename
else
sign-file sha1 "${key}" "${x509}" "${module_basename}"
fi
done
运行后就sudo depmod -a
modprobe evdi
可以了:)