Linux的多种init进程实现

在内核启动时,内核会创建第一个进程(称为init进程,initialization)来启动系统中所有其他进程,它会将init进程载入虚拟内存。init的进程标识符PID通常为1。

在Linux中,有多种init进程实现,目前最流行的是以下两种。

SysVinit

Linux最初使用的是SysVinit(SysV)初始化方法,该方法基于Unix System V初始化方法。SysVinit初始化方法使用运行级(runlevel)的概念来决定启动哪个进程,不同的运行级定义了Linux系统的运行状态以及每种状态下应该运行的进程。

/etc/inittab文件定义了系统的默认运行级。特定运行级下启动的进程是在/etc/rc.d目录下的各个子目录中定义的。可以使用runlevel命令随时查看当前运行级。

(base) yushu@fedora:~$ runlevel 
N 5
(base) yushu@fedora:~$ 

systemd

systemd初始化方法诞生于2010年,现在已经成为Linux发行版中最流行的初始化和进程管理系统,该初始化方法能够根据不同的事件启动进程。

  • 系统启动时

  • 连接到特定的硬件设备时

  • 服务启动时

  • 建立好网络连接时

  • 计时器到期时

systemd这一名字源于Unix中的一个惯例:在Unix中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识。除此以外,systemd亦是借代英文术语D体系,而这一术语即是用于描述一个人具有快速地适应环境并解决困难的能力。

systemd方法通过将事件与单元文件(unit file)链接来决定运行哪些进程。每个单元文件定义了特定事件发生时要启动的程序。systemctl程序允许启动、停止和列出系统中当前运行的单元文件。

systemd方法将单元文件划归为目标(target)。目标定义了Linux系统的特定运行状态,这和SysVinit运行级的概念类似。在系统启动时,default.target单元定义了要启动的所有单元文件。可以使用systemctl命令查看当前默认目标:

(base) yushu@fedora:~$ systemctl get-default 
graphical.target
(base) yushu@fedora:~$ 

target

以下是 systemd 中一些常见的目标:

  1. multi-user.target:

    • 这是默认的系统目标。它定义了多用户模式,用于正常的多用户运行。在这个目标下,会启动一组基本的服务,包括登录服务等。
  2. graphical.target:

    • 这个目标定义了图形用户界面(GUI)模式。在这个目标下,会启动 GUI 相关的服务,通常用于桌面环境。
  3. rescue.target:

    • rescue.target 是单用户模式(救援模式)。在这个目标下,只有最小的服务集会被启动,用于系统故障排除和修复。
  4. emergency.target:

    • emergency.target 是紧急模式。在这个目标下,只有一个最小的 shell 会被启动,用于紧急维护。
  5. poweroff.target, reboot.target, halt.target:

    • 这些目标用于关机、重启和停机。它们分别表示系统将要关机、重启和停机。
  6. network.target:

    • 这个目标表示网络已经启动。在这个目标下,会启动网络相关的服务,确保网络连接已经建立。
  7. default.target:

    • default.target 是一个符号链接,指向默认的目标。在许多系统中,它通常链接到 multi-user.target 或 graphical.target。

示例

在 systemd 中,配置文件是单元文件(unit file),通常存放在 /etc/systemd/system/ 目录下。以下是一个简单的示例:

  1. 创建一个单元文件,例如 /etc/systemd/system/myprocess.service
[Unit]
Description=My Process

[Service]
ExecStart=/path/to/your/process
Restart=always

[Install]
WantedBy=multi-user.target
  1. 使用systemctl命令启用服务:
systemctl enable myprocess.service
  1. 启动服务:
systemctl start myprocess.service
  1. 停止服务:
systemctl stop myprocess.service
  1. 查询服务状态
systemctl status myprocess.service

分享

systemd Unit File Generator LinuxBabe 提供了一个简单的在线模板生成器,可以帮助你生成基本的 systemd 单元文件。

posted @ 2024-01-25 17:07  yushucs  阅读(121)  评论(0编辑  收藏  举报