Linux第一个用户空间进程init进程的演进过程

核心概念

init 进程 (初始化进程的简称)是 Linux 内核启动后创建的第一个用户空间进程(PID 1)。它具有几个不可替代的核心作用:

  1. 祖先进程 :它是系统中所有其他用户进程的最终祖先。所有进程都是通过 fork() 的方式从它衍生出来的。
  2. 守护进程管理器:负责启动、管理和维护系统的各种关键守护进程(daemons)和服务(如网络、日志、调度等)。
  3. 初始化脚本执行者:运行一系列初始化脚本,来挂载文件系统、配置网络、设置硬件等,从而将系统带入一个可用的状态。
  4. 运行级别管理器:定义和管理不同的系统状态(如单用户模式、多用户图形界面模式等)。
  5. 孤儿进程收养者 :当一个子进程的父进程先于其终止时,这个子进程会成为"孤儿进程"。init 进程会自动收养所有孤儿进程,并负责清理它们的退出状态,防止它们成为无法管理的僵尸进程。

历史演变与不同的实现

init 的概念是必须的,但其具体实现技术却经历了演进。主要有以下三种:

1. SysVinit (System V Init)

这是最经典、传统的 init 系统,源于 UNIX System V。

  • 工作原理

    • 基于运行级别(Runlevels) 。运行级别是一个数字(0-6),代表不同的系统状态:
      • 0:停机(Halt)
      • 1:单用户模式/救援模式(Single-User Mode)
      • 3:多用户文本模式(Multi-User, no GUI)
      • 5:多用户图形界面模式(Multi-User with GUI)
      • 6:重启(Reboot)
    • 每个运行级别在 /etc/rc.d/ 目录下都有对应的子目录(如 rc3.d/, rc5.d/)。
    • 这些目录里存放着指向 /etc/init.d/ 目录中服务脚本的符号链接 。链接名以 S(Start)开头的服务会在进入该运行级别时启动 ,以 K(Kill)开头的服务则会停止
    • 启动过程是同步阻塞式的,即脚本按顺序一个一个地执行,一个没启动完就不会启动下一个。
  • 优缺点

    • 优点:简单、直观、稳定。
    • 缺点:启动慢(无法并行启动服务)、依赖关系处理复杂、无法动态响应硬件事件(如插拔U盘)。
2. Upstart

由 Ubuntu 开发,旨在解决 SysVinit 的启动速度问题,曾用于 Ubuntu 和早期版本的 RHEL/CentOS。

  • 工作原理

    • 事件驱动(Event-Based)。Upstart 的核心思想是"响应事件"。
    • 服务的启动和停止不再仅仅由运行级别决定,而是由各种事件 触发,例如:
      • "文件系统已挂载"
      • "网络设备已就绪"
      • "另一个服务已启动"
    • 这种方式允许服务在条件满足时并行启动,大大加快了系统启动速度。
    • 配置文件位于 /etc/init/ 目录下,后缀为 .conf
  • 地位 :可以看作是 SysVinit 和 Systemd 之间的一个过渡方案

3. Systemd

现代绝大多数主流 Linux 发行版的默认 init 系统 (如 RHEL/CentOS 7+, Ubuntu 16.04+, Debian 8+, Arch Linux 等)。它不仅仅是一个 init 程序,更是一个庞大的系统和服务管理器套件

  • 工作原理与核心特性

    • 并行化启动 :通过套接字激活(Socket Activation)D-Bus 激活等技术,极大地加快了启动速度。服务可以按需启动,而不是全部预先启动。
    • 依赖管理:明确定义服务之间的依赖关系,Systemd 会智能地解决并满足这些依赖。
    • 基于单元(Unit) :Systemd 使用单元文件(.service, .socket, .mount 等) 来管理各种对象,而不仅仅是服务。配置文件通常位于 /usr/lib/systemd/system/(系统默认)和 /etc/systemd/system/(管理员自定义)。
    • 日志整合 :提供 journald 服务,用于收集和管理所有内核和用户进程的日志,取代传统的 syslog
    • 快照与状态保存:可以保存系统当前状态,并在之后恢复。
    • 资源管理:可以对进程进行资源限制(CPU, 内存等)。
  • 命令示例

    systemctl start nginx.service # 启动一个服务

    systemctl stop nginx.service # 停止一个服务

    systemctl status nginx.service # 查看服务状态

    systemctl enable nginx.service # 设置服务开机自启

    systemctl disable nginx.service # 禁用服务开机自启

    systemctl reboot # 重启系统(由systemd处理)

    systemctl poweroff # 关机(由systemd处理)

    journalctl -xe # 查看系统日志

  • 争议与批评

    • "背离Unix哲学":批评者认为 Systemd 过于庞大、复杂,"不仅做一件事,而且要做好一件事",它试图接管系统管理的方方面面。
    • 单点故障:如果 Systemd 崩溃,整个系统会受到影响。

总结对比

特性 SysVinit Upstart Systemd
启动方式 顺序、同步 事件驱动、并行 并行、按需激活
配置方式 Shell 脚本 配置文件 (.conf) 单元文件 (.service等)
核心概念 运行级别 (Runlevels) 事件 (Events) 单元 (Units)
复杂性 简单 中等 高度复杂且功能强大
现状 基本淘汰 过渡方案,已淘汰 现代标准

结论 :当你今天谈论 Linux 的 init 进程时,绝大多数情况下指的就是 Systemd 。它是当前 Linux 生态系统的基石,虽然存在争议,但其性能和功能优势使其成为了不可动摇的事实标准。理解 Systemd 的基本操作(使用 systemctljournalctl)是管理现代 Linux 服务器的必备技能。

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式