linux运行级服务启动逻辑基于“运行级别+符号链接+执行顺序”协同工作:/etc/rc.d/init.d存服务脚本,/etc/rc.d/rcn.d用sxx/kxx链接控制启停,init通过rc.sysinit、rc $runlevel和rc.local按序调度。

Linux 系统运行级目录(/etc/rc.d)的服务启动逻辑,核心在于“运行级别 + 符号链接 + 执行顺序”三者协同工作,不是简单遍历执行,而是有明确规则的条件式调用。
/etc/rc.d/init.d 是服务脚本的实际存放地
所有可管理的服务(如 httpd、sshd、crond)的启动脚本都集中放在 /etc/rc.d/init.d/(或其软链接 /etc/init.d/)。这些是标准 Shell 脚本,至少支持 start 和 stop 参数,通常还支持 restart、status、reload 等。
它们本身不自动运行,只是“待命程序”,是否执行、何时执行、以什么参数执行,全由当前运行级别和对应目录下的链接决定。
/etc/rc.d/rcN.d 目录控制服务启停行为
每个运行级别 N(0–6)对应一个 /etc/rc.d/rcN.d/ 目录(例如 rc3.d 对应多用户文本模式,rc5.d 对应图形界面)。该目录下不存放真实脚本,只存放指向 init.d 中脚本的符号链接,命名格式统一为:
-
SxxServiceName:表示在进入该运行级别时启动服务,xx是两位数字(00–99),决定执行顺序(从小到大) -
KxxServiceName:表示在进入该运行级别前,若服务已在上一运行级别中运行,则先停止它,xx同样决定顺序 -
DxxServiceName:表示禁用,直接被忽略(较少见)
例如:/etc/rc.d/rc3.d/S22sshd → 进入 runlevel 3 时,按序执行 /etc/rc.d/init.d/sshd start;/etc/rc.d/rc3.d/K15network → 若上一运行级别中 network 已运行,则先执行 network stop。
init 按固定流程调用 rc 脚本驱动整个过程
系统启动后,init 进程读取 /etc/inittab(或 systemd 兼容层)获知默认运行级别(如 3 或 5),然后执行:
-
/etc/rc.d/rc.sysinit:完成基础环境初始化(挂载文件系统、设置主机名、启用 swap、校验磁盘等) -
/etc/rc.d/rc $RUNLEVEL:核心调度器。它进入对应rcN.d目录,先按数字升序执行所有Kxx*链接(传stop),再按数字升序执行所有Sxx*链接(传start) -
/etc/rc.d/rc.local:作为最后一步,在所有服务启动完毕、登录提示出现前执行,适合放自定义命令(需确保有执行权限:chmod +x /etc/rc.d/rc.local)
运行级别切换时服务状态会动态调整
运行级别不是静态快照,而是动态状态机。比如从图形界面(runlevel 5)切回文本模式(runlevel 3)时:
- init 先调用
/etc/rc.d/rc 3 - 它对比 runlevel 5 和 runlevel 3 的
rcN.d内容,发现 GDM/KDE 等图形相关服务在rc3.d中只有K链接、没有S链接,就会执行其stop - 同时,
sshd、crond等在两个级别中都有S链接,通常不会重复启动(脚本内部会判断当前状态)
这种机制保证了服务随运行环境精准启停,避免资源浪费或冲突。











