我正在使用 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