在 systemd 中使用管道/stdin/stdout

在 systemd 中使用管道/stdin/stdout

我有一个 systemd 服务,它使用“ExecStart”指令运行一次性脚本。该脚本在加载 ZFS 加密密钥时在引导过程的早期运行(在文件系统挂载之前)。

由于我执行此操作的方式(从 TPM 解密密钥而不是存储在磁盘上),我必须将一个命令的输出通过管道传输到另一个命令。我试图找出失败的原因,我可以看到,当我运行一个应该写入 /dev/stdout 的命令时,我收到“无法打开输出文件”错误。

如果我在机器启动后使用“systemd start <servicename>”运行相同的服务,它将成功且不会出现错误。因此我认为这是一个单位依赖性问题。我不知道我可能会错过哪个单位。

(我没有使用加密的根文件系统,因此这不是根文件系统引导问题。)

答案1

事实证明,这是 tpm_unsealdata 引发的误导性错误消息。实际问题是 tcsd 未加载。原来在单元文件中

Requires=trousers

在运行单元脚本之前不会加载先决条件

After=trousers

也是必需的。

(是的,TPM1 tcsd 守护程序是名为“trousers”的程序包的一部分。)

相关内容