/etc/init/和/etc/init.d/之间有什么区别?

/etc/init/和/etc/init.d/之间有什么区别?
更一般地说,目录中的.d后缀表示什么意思?
3个回答

/etc/init.d 包含了 System V init 工具(SysVinit)使用的脚本。这是 Linux 的传统服务管理包,其中包含了 init 程序(在内核完成初始化后运行的第一个进程¹),以及一些用于启动、停止服务和配置服务的基础设施。具体来说,/etc/init.d 目录中的文件是 shell 脚本,用于响应 startstoprestart 和(如果支持的话)reload 命令来管理特定的服务。这些脚本可以直接调用,或者(最常见的情况)通过其他触发器(通常是在 /etc/rc?.d/ 目录中存在符号链接)来调用。

/etc/init 包含了 Upstart 使用的配置文件。Upstart 是由 Ubuntu 支持的一个年轻的服务管理包。在 /etc/init 目录中的配置文件告诉 Upstart 如何以及何时 启动停止重新加载 配置或查询服务的 状态。自 lucid 版本以来,Ubuntu 正在从 SysVinit 迁移到 Upstart,这就解释了为什么许多服务即使有 SysVinit 脚本也更倾向于使用 Upstart 配置文件。事实上,SysVinit 脚本是由 Upstart 中的兼容层处理的。

.d在目录名称中通常表示包含许多配置文件或脚本的目录,用于特定情况(例如,/etc/apt/sources.list.d包含被连接起来形成虚拟sources.list的文件;/etc/network/if-up.d包含在网络接口激活时执行的脚本)。这种结构通常在目录中的每个条目由不同来源提供的情况下使用,以便每个软件包都可以存放自己的插件,而无需解析单个配置文件来引用自身。在这种情况下,“init”只是一个逻辑上的目录名称,SysVinit首先使用了init.d,而Upstart则使用了纯粹的init作为具有类似目的的目录名称(如果他们使用/etc/upstart.d代替,可能会更“主流”,也许不那么傲慢)。

¹ 不包括initrd


31深奥的历史注释:.d目录是在System V中引入的。当时它是一个令人困惑的标记,最终可能只是一个人的想法进入了代码库,并且无法离开。例如,如果你认为cat是一个不好的任务名称,想象一下要更改它需要触及系统中多少个文件。 - msw
1在同时拥有Upstart和SysVinit两个目录的系统上,使用哪个?有没有办法进行检查? - asheeshr
5请检查是否有一个名为upstartsysvinit的软件包。在最新版本中,也可能是systemd(在我回答时Ubuntu还不存在这个)。它是提供/sbin/init的软件包(dpkg -S /sbin/init)。 - Gilles 'SO- stop being evil'
在我使用的AWS Ubuntu实例(来自Bitnami)上,是upstart软件包提供了/sbin/init(运行dpkg -S /sbin/init)。但是Bitnami将其脚本放置在/etc/init.d目录中。这与您对@AsheeshR的回答是否有冲突?谢谢。 - Sabuncu
1@Sabuncu 这是一个“SysVinit脚本通过Upstart中的兼容性层进行处理”的示例。 - Gilles 'SO- stop being evil'
非常感谢Gilles指引我朝着正确的方向前进。我现在正在研究你提到的兼容层。 - Sabuncu
@Gilles 所以那只是一个例子,但通常 /etc/init.d/* 不会被 systemd 或 upstart 使用,对吗?(只是为了确保)。我的意思是,即使在 /etc/rc?.d/* 中存在链接,是吗? - Palo
@Palo Upstart本身不使用/etc/init.d/*/etc/rc*.d/*,但有一个Upstart任务/etc/init/rc.conf/etc/init/rcS.conf会加载它们。 - Gilles 'SO- stop being evil'
更新:16.04 使用了新系统。如果您需要切换回 upstart,请参阅 http://notesofaprogrammer.blogspot.com/2016/09/running-upstart-on-ubuntu-1604-lts.html - woodvi
现在在Xenial(16.04)中,已经开始使用systemd了。 - ryeager

".d"通常添加到目录名后,表示原来(或可能)由单个脚本或单个配置文件处理的内容已经拆分为多个文件,以方便使用,但这些文件应该一起包含或执行。
例如:/etc/apache/conf.d//etc/apt/sources.d/ 在需要按顺序包含/执行它们的情况下,这些目录中的文件有时以数字开头,比如“00-default”或“80-user”,以确保它们按正确的顺序执行。
/etc/init.d/的情况下,它有点表示应该执行“init.d”中的所有脚本。然而,现代操作系统的初始化系统比这复杂得多,但目录名仍然存在。

也许.d表示它与一个通常在启动时启动的“守护进程”相关。 - user157299
25.d绝对是指目录,而不是守护进程。 - Martin

正如你所指出的,".d" 的命名方式令人困惑和奇怪,在任何现代系统中都没有任何实际意义 - 你会注意到大多数现代服务已经倾向于放弃它。
目录之所以是 "/etc/init" 而不是 "/etc/upstart" 是因为 Upstart 是项目名称,实际安装的二进制文件仍然是 "/sbin/init",因此它的配置名称与二进制文件不匹配是没有意义的。

8这是错误的,例如请查看udev的rules.d,Xorg相对较新的xorg.conf.d,还有不太旧的/etc/profile.d等等。 - Ruslan