对于某些错误,initramfs 将进入恢复控制台,以允许用户在启动之前修复问题。
这对于安全性(例如面向客户的信息亭)和恢复系统的能力(例如无人值守系统和物联网设备)来说可能都是一个问题
有没有办法重新配置它以便它重新启动?
我可以配置 grub,以便当系统未达到稳定状态时它会尝试不同的启动选项,但如果它只是坐在那里等待永远不会到来的用户输入,我就无能为力。
请注意,系统并非完全不可恢复,通常可以通过回滚到之前正常工作的配置来解决引导加载程序中的引导失败问题。这种技术在物联网中非常常见。然而,它可能在物联网设备上发生故障时自行重启。
答案1
您可以禁用 initramfs 调试 shell 并使用内核参数立即重新启动,panic=<seconds>
例如:panic=10
。
panic 设置 panic 的超时时间。panic=sec 是一个已记录的安全功能:它禁用调试 shell。
警告
不要使用panic=0
。这会产生相反的效果,禁用重启功能而不是启用它。initramfs 遵循与内核相同的语义。
来自内核管理指南:
panic= [KNL] Kernel behaviour on panic: delay <timeout> timeout > 0: seconds before rebooting timeout = 0: wait forever timeout < 0: reboot immediately Format: <timeout>
链接
答案2
如果启动过程中出现故障(例如安装设备),系统将进入“emergency.target”并启动“emergency.service”。
此时会显示消息“(或键入 Control-D 以进行正常启动)”。
# systemctl status emergency.service
○ emergency.service - Emergency Shell
Loaded: loaded (/lib/systemd/system/emergency.service; static)
Active: inactive (dead)
Docs: man:sulogin(8)
这将启动 root-login shell 并要求输入 root 密码(请参阅man 8 sulogin
)。
只需屏蔽服务和目标,它就无法启动。但是我没有经验,如果发生系统无法启动的严重错误会发生什么。小心点,最好以某种方式测试它。
sudo systemctl mask emergency.service
sudo systemctl mask emergency.target