我有一个 systemd 服务,它使用“ExecStart”指令运行一次性脚本。该脚本在加载 ZFS 加密密钥时在引导过程的早期运行(在文件系统挂载之前)。
由于我执行此操作的方式(从 TPM 解密密钥而不是存储在磁盘上),我必须将一个命令的输出通过管道传输到另一个命令。我试图找出失败的原因,我可以看到,当我运行一个应该写入 /dev/stdout 的命令时,我收到“无法打开输出文件”错误。
如果我在机器启动后使用“systemd start <servicename>”运行相同的服务,它将成功且不会出现错误。因此我认为这是一个单位依赖性问题。我不知道我可能会错过哪个单位。
(我没有使用加密的根文件系统,因此这不是根文件系统引导问题。)
答案1
事实证明,这是 tpm_unsealdata 引发的误导性错误消息。实际问题是 tcsd 未加载。原来在单元文件中
Requires=trousers
在运行单元脚本之前不会加载先决条件
After=trousers
也是必需的。
(是的,TPM1 tcsd 守护程序是名为“trousers”的程序包的一部分。)