SysV init 与 rc 目录是什么
老式 SysV 体系用 /etc/init.d 下的 shell 脚本描述服务,再通过 /etc/rcN.d/ 里的符号链接决定各运行级别是否启动。现在的 systemd 发行版仍保留兼容层,会读取并执行这些脚本,所以「我用的是 systemd,机器上不会有 init 残留」这个假设并不成立。陌生脚本、指向它们的启动链接、脚本里出现网络下载,都值得逐一盘查。
基本信息
| 脚本位置 | /etc/init.d/ 或 /etc/rc.d/init.d/ |
|---|---|
| 链接位置 | /etc/rc0.d 到 rc6.d:S 开头启动,K 开头停止 |
| 权限要求 | root 可读写,普通用户只读 |
| 启用方式 | chkconfig、update-rc.d、systemctl enable(走兼容层) |
| 可疑判据 | 脚本内调用 curl、wget、/dev/tcp、base64 |
| 时间线索 | 脚本与链接的 mtime 与系统安装时间是否吻合 |
典型使用场景
- 排查开机自启的持久化位置,确认每个启动项都有明确归属
- 主机重启后出现不明进程,反查是哪个 init 脚本拉起的
- 清理老系统的遗留服务,降低资源占用与误判噪音
- 加固巡检:确认没有陌生脚本被 chkconfig on 打开
- 与 systemd 单元清单对照,找出只在 rc 链接里存在的启动项
排查 init 体系
排查 init 体系
ls -lt --time-style=long-iso /etc/init.d/ | head -n 20 # 按时间排序,新文件优先看
ls -la /etc/rc3.d/ /etc/rc5.d/ 2>/dev/null | head -n 30 # 启动链接清单
grep -rEn 'curl|wget|/dev/tcp|base64' /etc/init.d/ 2>/dev/null | head
chkconfig --list 2>/dev/null | grep ':on' | head -n 20 # RHEL 系启用状态
readlink -f /etc/rc3.d/S99weird 2>/dev/null # 链接真实指向
systemctl list-unit-files --type=service --no-pager | head -n 20 # 包装后的单元rc 目录命名读法
| 名称 | 含义 | 判读要点 |
|---|---|---|
| S99name | 该运行级别启动,序号越大越晚 | 序号靠后的自启项最容易被忽略 |
| K01name | 切换到该级别时按序停止 | K 链接异常增多要解释原因 |
| rc3.d / rc5.d | 多用户字符界面 / 图形界面 | 服务器上 rc5.d 出现启动项需核实 |
| rc0.d / rc6.d | 关机与重启级别 | 此处塞脚本属于异常手法 |
| chkconfig :on | 已在某运行级别启用 | 陌生服务处于 on 状态即为线索 |
systemd 系统上 init 脚本会被 systemd-sysv-generator 包装成同名 .service 单元:排查时先用 systemctl list-unit-files 看包装结果,再决定处理脚本还是链接。
删除脚本或链接前先确认服务状态与业务归属:老业务可能只靠 SysV 脚本启动,删掉会造成重启后服务消失且无人知晓。