got*_*uru 14 boot administration systemd
默认情况下,systemd 会在出现最轻微的错误时进入紧急 shell。例如,如果 fstab 中的一个挂载由于某种原因失败,系统将立即无法启动。我管理着数十个不同的生产系统,我发现这种行为非常具有破坏性。(实际上我认为这是一个重大的设计失败,但这是个人意见)。
我想增加系统启动弹性。最佳情况下,系统应该始终启动,缺少驱动程序、安装等不应该丢弃紧急外壳(只显示警告),除非给定的错误会使控制台登录绝对不可能。能跑的,应该跑的。
我知道 systemd 会自动从 /etc/fstab 生成 *.mount 文件,我可以使用 nofail 选项和小 x-systemd.device 超时(或自己定义相关的 .mount 文件)。但是它不能解决我的问题,我想让系统更有弹性,每次“修补”fstab 不是很方便,我不确定还有多少其他可能的“问题”会导致我的系统无法启动,因为某个地方的一些开发人员认为它足够重要。
总之,我想重新控制我的机器,而不是让 systemd 决定什么问题严重到足以破坏启动过程。是否可以?
这实际上只是挂载失败,这就是您需要更改的全部内容。
所以你的请求信很容易回答。创建一个插入文件:
# /etc/systemd/system/local-fs.target.d/nofail.conf
# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=
Run Code Online (Sandbox Code Playgroud)
我相信这不会增加新的问题,除了 linux sysvinit 已经因为允许这种部分故障场景而遭受的问题。
但是,您还指出了systemd 应等待指定块设备可用多长时间的问题。如果不提供整个 fstab 生成器的替代品,我看不出有什么方法可以配置它。https://www.freedesktop.org/software/systemd/man/systemd.generator.html
如果您在此处转储大量不太广泛使用的代码,似乎不太可能提高系统弹性。我认为最接近的解决方案是修补现有的 fstab 生成器。它不是非常复杂,我怀疑你可以逃脱它/跟上任何重大变化。
从技术上讲,如果您的发行版有一个自包含的mountallsysvinit 脚本,您可以尝试将其挂钩。但这将显着改变启动过程 - 它实际上更像是一个分支。我不会推荐这种方法。
https://unix.stackexchange.com/a/393711/29483
如果您搜索单元文件,则引导回退到
emergency.target. 通常是当.mount本地文件系统的一个 单元出现故障时,导致local-fs.target失败。或者当您的 initramfs 无法挂载根文件系统时,如果您的 initramfs 使用 systemd。
local-fs.target有OnFailure=emergency.target. 它会失败,因为本地文件系统的单元会自动添加到 local-fs.target 的 Requires 列表中(除非它们有DefaultDependencies=no)。Run Code Online (Sandbox Code Playgroud)$ systemctl show --property Requires local-fs.target Requires=-.mount home.mount boot.mount boot-efi.mount