在基于 systemd 的 initramfs 中执行交互式脚本

Execute an interactive script in systemd-based initramfs

我想在基于 systemd 的 initramfs 中启动交互式脚本。我使用带有 systemd-hook 的 mkinitcpio 来创建它。我的问题是,没有向作为服务启动的脚本提供输入。脚本启动,我看到他的输出,直到它等待输入。

my_service.service:

[Unit]
Requires=systemd-vconsole-setup.service
# Requires=getty@tty2.service
After=systemd-vconsole-setup.service
Before=initrd-switch-root.service
Conflicts=multi-user.target
DefaultDependencies=no

[Service]
Type=oneshot
# ExecStartPre=/usr/bin/chvt 2
ExecStart=/usr/bin/sh /myscript
# ExecStartPost=/usr/bin/chvt 1
# StandardInput=tty
StandardInput=tty-force
StandardOutput=tty
TTYPath=/dev/tty1
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes

[Install]
WantedBy=sysinit.target

我将 Requires=otpboot.service 附加到 initrd-switch-root.service,所以它会一直等到我的脚本完成(这不会发生,因为没有提供输入)。 我还尝试将我的脚本移动到 tty2(这对我的用例来说完全没问题),chvt 命令成功,但 my_service 的输出仍在 tty1 上。由于我无法使用 Ctrl+Alt+F2 更改为 tty2,我认为 tty 尚未设置。 所以我添加了 getty@ 服务和 agetty 二进制文件并需要它,但 tty2 仍然不起作用。

我很感激任何方向的提示。

好吧,我的错。我认为 sd-vconsole 钩子取代了 keyboard 钩子,但它没有。所以我的键盘驱动程序丢失了。 (这就是为什么手动更改为 tty2 不起作用的原因 - 应该给了我一个线索)。

如果有人遇到问题,删除 TTYVTDisallocate 会使调试更容易一些。