了解 /etc/init.d 中的 linux 启动顺序

Nit*_*tay 5 debian sysvinit init.d

这个问题是关于 Debian 的,但我想在许多 linux 环境中都是一样的。

/etc/init.d目录定义了在启动时运行的服务。在我看来,有两种机制可以定义谁运行以及何时运行:

  • 运行级别目录 -/etc/rcN.d/目录,其中有脚本的符号链接,init.d其中包含定义运行顺序的数字。这些符号链接是通过运行生成的update-rc.d
  • insserv 文件 -.depend.start/stop/boot从实用程序生成的文件insserv。在这些文件中,您会在 下看到正在运行的脚本TARGETS,它们出现的顺序就是运行顺序(请参阅此帖子

那么第一个问题 - 这些中的哪一个决定了启动顺序?


为了更改引导顺序,我想您可以编辑rc.N目录中的符号链接名称,或者更改.depend.start. 但是这两个更改都将被对insserv或的调用覆盖update-rc.d

那么第二个问题 - 你如何控制启动顺序 init.d 脚本,以在调用insservor后持续update-rc.d

Ste*_*itt 5

对于sysvinit(systemd 是不同的,但您可以在那里使用单元,而不是 initscripts),引导顺序在引导期间由/etc/rc?.d. 那里的符号链接是在update-rc.d的帮助下生成的insserv,这实际上是一个实现细节(与.depend.boot等文件一样)。您需要关心的只是 initscripts 之间的依赖关系,在它们的 LSB 标头中声明;例如

### BEGIN INIT INFO
# Provides:          unbound
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
Run Code Online (Sandbox Code Playgroud)

如果要更改启动顺序,则需要向相关的initscripts添加依赖项。最安全的方法是添加覆盖/etc/insserv/overrides:在那里创建一个与您希望覆盖的脚本同名的新文件,并将新标头写入该文件。然后运行update-rc.d yourscript defaults重新计算符号链接。

insserv您可以在和 的联机帮助页中找到更多信息update-rc.d