我最近将运行 Linux 2.6 的 ARM 机器上的 init 系统从 sysvinit 切换到 runit,取得了巨大成功。但是,我正在尝试微调初始化例程。我想要一个类似于“oneshot”systemd 服务的东西。
初始化例程的一部分是磁盘可能必须被格式化,然后必须被安装。其中一项 runit 服务依赖于正在安装的此磁盘。但是,其余服务(例如 sshd)则不然。因此,如果我可以在系统其余部分初始化时在后台启动磁盘格式化过程,那就太好了。磁盘格式相当慢,因此如果可以在后台完成,可能会对总启动时间产生重大影响。
我有一个磁盘格式化脚本/usr/local/bin/format_disk.sh
,如果磁盘尚未格式化,它可以可靠地格式化磁盘(如果已经格式化,则它是无操作)。这些是我目前正在考虑的选项:
- 手动运行
sudo /usr/local/bin/format_disk.sh
:这就是我现在正在做的事情,但我想自动化该过程,以便我可以期望我的系统在没有用户干预的情况下完全初始化。 /usr/local/bin/format_disk.sh
在脚本中运行/etc/runit/1
:这并不理想,因为它会阻止服务启动直到磁盘格式化。- 创建一个运行然后终止/循环/等的 runit 服务
/usr/local/bin/format_disk.sh
:这并不理想,因为它不是一个真正的守护进程,必须在系统正常运行时间内保持运行。也许我可以让它sv stop
自行运行?
如果我能做类似/usr/local/bin/format_disk.sh &
in 的事情那就太好了/etc/runit/1
,但我怀疑 runit 在终止之前仍然不会启动服务format_disk.sh
。这个怀疑正确吗?是否有其他方式启动后台进程以/etc/runit/1
允许服务启动?
在 runit 系统的后台运行初始化步骤的最佳方法是什么?
答案1
两种选择:
- 从依赖服务的运行脚本中调用该脚本。这将确保脚本在服务运行之前返回。
- 从 后台运行脚本
/etc/rc.local
,并让脚本在运行完成后接触 tmpfs 文件。然后在依赖服务的运行脚本中,检查该文件是否存在。