如何使用 dracut 将脚本包含在 initramfs 中?

如何使用 dracut 将脚本包含在 initramfs 中?

我正在使用 dracut 创建 initramfs 来测试在 TPM 芯片中创建密钥的脚本。目前,此脚本只是一个虚拟脚本,因此我可以查看是否正确创建了 initramfs:

#!/usr/bin/env bash
#
read -p 'This file will run to initialize the TPM'
exit 0

我想将此脚本包含在预安装启动阶段。我按照问题“如何编写预安装启动脚本?”的答案进行操作。在这个论坛中,根据需要修改它,但是当我列出图像文件的内容时,我的脚本不存在。我还尝试使用 --include 和 --install dracut 选项,但我要么收到错误,要么如果没有收到错误,则脚本不在 initramfs 中。我将文件命名为 tpm.img,并将其放置在 /boot 目录中。启动计算机时,我按“e”修改 grub 行,并将 initdefi 命令更改为指向我的 tpm.img。当然,我的脚本不会运行,因为它不存在于 initramfs 中。我不确定我是否理解 dracut 手册的“注入自定义文件”部分:

https://mirrors.edge.kernel.org/pub/linux/utils/boot/dracut/dracut.html

我无法找到 dracut 配置文件或 dracut 命令行文件的任何示例来显示要包含的模块的完整路径。请帮助我理解为什么我的脚本没有包含在 initramfs 中。

谢谢!杰夫

答案1

我取得了成功--include。假设您将自定义脚本放入 中/etc/dracut.conf.d/tpm.sh,您可以执行以下操作:

sudo dracut --include /etc/dracut.conf.d/tpm.sh /usr/lib/dracut/hooks/pre-mount/tpm.sh tpm.img

该文件在那里:

$ sudo lsinitrd tpm.img | grep -F tpm.sh
Arguments: --include '/etc/dracut.conf.d/tpm.sh' '/usr/lib/dracut/hooks/pre-mount/tpm.sh'
-rw-rw-r--   1 root     root           80 Apr  5 17:22 usr/lib/dracut/hooks/pre-mount/tpm.sh

不幸的是,据我所知,没有与--include命令行选项等效的配置文件。有install_items,相当于--install。此选项仅采用一个路径,因为 initramfs 中的路径与主 FS 中的路径相同。所以你需要把你的脚本放在/usr/lib/dracut/hooks/pre-mount/tpm.sh.然后你可以创建/etc/dracut.conf.d/tpm.conf

install_items+=" /usr/lib/dracut/hooks/pre-mount/tpm.sh "

这将导致所有将来自动生成的 initramfs 映像包含该脚本,例如在升级内核时。

答案2

另一种选择是在/usr/lib/dracut/modules.d.在该目录中,您可以创建一个专用90tpm目录并将其放入tpm.sh其中。您还需要放入一个名为 的特殊脚本module-setup.sh,其函数在构建时install调用。dracut一个简单的module-setup.sh可以是这样的:

#! /bin/bash

install () { inst_hook pre-mount 50 "$moddir/tpm.sh"; }

然后你就可以调用dracut而无需任何额外的参数或配置文件:

[~]$ ls -l /usr/lib/dracut/modules.d/90tpm
total 8
-rwxr-xr-x. 1 root root 70 Jun  4 01:57 module-setup.sh
-rwxr-xr-x. 1 root root 80 Jun  4 01:46 tpm.sh
[~]$ sudo dracut test.img
[~]$ sudo lsinitrd test.img | grep tpm
tpm
-rwxr-xr-x   1 root     root           80 Apr  5 17:22 usr/lib/dracut/hooks/pre-mount/50-tpm.sh

相关内容