[Linux]Init

Init

1 System V概述

在Linux系统中,init的主要职责是启动和停止必要的进程。存在三种主要的init实现:System V、Upstart和systemd。

如何确认使用的是Sys V

如果系统包含/etc/inittab文件,则很可能正在运行Sys V init。

Sys V的工作原理

Sys V通过顺序执行脚本来启动或停止服务。例如,若要启动名为foo-a的服务,必须确保在此之前foo-b未被激活,因为foo-b依赖于foo-a的运行状态。Sys V利用预先编写好的脚本完成这些操作,用户可以自定义脚本,但大多数情况下会使用操作系统自带的脚本以加载关键服务。

Sys V的优势在于解决依赖关系相对简单,由于明确知道foo-a应在foo-b之前启动。然而,其缺点是性能不佳,因为通常只能顺序地启动或停止单个服务。

运行级别

Sys V使用从0到6的运行级别来定义系统的状态,具体含义如下:

  • 0: 关机
  • 1: 单用户模式
  • 2: 多用户模式,无网络连接
  • 3: 多用户模式,有网络连接
  • 4: 未使用
  • 5: 多用户模式,有网络连接及图形界面
  • 6: 重启

系统启动时,根据设定的运行级别执行相应的配置脚本。这些脚本存放在/etc/rc.d/rc[运行级别编号].d//etc/init.d目录下。以S(Start)或K(Kill)开头的脚本分别在系统启动或关闭时执行,随后的数字表示执行顺序。

例如,在查看运行级别0(关机模式)下的脚本列表时:

1
2
pete@icebox:/etc/rc.d/rc0.d$ ls
K10updates K80openvpn

这表明,在切换至运行级别0时,系统将尝试首先终止updates服务,然后是openvpn服务。

默认运行级别可以在/etc/inittab文件中查看或修改。

2 System V服务

在Sys V系统中,可以通过多种命令行工具来管理服务。以下是一些基本的操作示例:

列出所有服务状态

使用service --status-all命令可以列出系统中所有服务的状态。此命令会显示每个服务的当前状态(运行中或已停止)。

1
$ service --status-all

启动服务

要启动一个特定的服务,例如网络服务,可以使用如下命令:

1
$ sudo service networking start

停止服务

若需要停止某个正在运行的服务,同样可以使用service命令:

1
$ sudo service networking stop

重启服务

为了重新加载配置或应用更改,通常需要重启服务。这可以通过执行以下命令完成:

1
$ sudo service networking restart

这些命令不仅适用于Sys V init系统,也兼容Upstart服务管理系统。尽管Linux正逐步淘汰传统的Sys V初始化脚本,但为了平滑过渡,目前仍保留了对这些命令的支持。

3 Upstart概述

Upstart由Canonical公司开发,曾经是Ubuntu上的初始化实现。然而,在现代的Ubuntu安装中,systemd已经取代了它。Upstart旨在解决Sys V存在的问题,如严格的启动流程、任务阻塞等,其事件和作业驱动模型使其能够实时响应发生的事件。

若系统包含/usr/share/upstart目录,则很可能是使用Upstart的系统。

在Upstart中,作业是指执行的动作,而事件则是从其他进程接收的消息,用以触发这些作业。要查看作业列表及其配置文件,可以查阅/etc/init目录:

1
pete@icebox:~$ ls /etc/init

示例输出可能包括:

  • acpid.conf
  • mountnfs.sh.conf
  • alsa-restore.conf
  • networking.conf

在这些配置文件中,定义了如何以及何时启动作业。例如,在networking.conf文件中,可能会有如下内容:

1
2
start on runlevel [235]
stop on runlevel [0]

这意味着在网络运行级别2、3或5时启动网络设置,并在网络运行级别0时停止网络服务。配置文件的编写方式多样,具体取决于不同的作业需求。

Upstart工作原理

  1. 加载作业配置:首先,Upstart从/etc/init加载作业配置。
  2. 响应启动事件:一旦发生启动事件,与该事件相关的作业将被执行。
  3. 事件链式反应:执行的作业会产生新的事件,进而触发更多的作业。
  4. 循环直至完成:此过程持续进行直到所有必要的作业都已完成。

4 Upstart作业管理

尽管Upstart能够触发众多事件和作业的运行,但没有简便的方法可以直接查看某一事件或作业的来源。通常情况下,直接查阅/etc/init中的作业配置文件并非必要,但在需要对特定作业进行更精细控制时,则需了解一些实用命令。

查看所有作业状态

使用initctl list命令可以列出系统中所有Upstart作业及其当前状态:

1
initctl list

输出示例:

1
2
3
shutdown stop/waiting
console stop/waiting
...

每一行代表一个作业,其中第一值为作业名称,第二字段(斜杠前)表示作业的目标状态,第三值(斜杠后)则显示当前状态。

查看特定作业状态

要检查某个具体作业的状态,可以使用initctl status命令:

1
initctl status networking

示例输出:

1
networking start/running

作业的手动操作

  • 启动作业
    1
    sudo initctl start networking
  • 停止作业
    1
    sudo initctl stop networking
  • 重启作业
    1
    sudo initctl restart networking

手动发出事件

若要手动触发某一事件以启动其他作业,可使用如下命令:

1
sudo initctl emit some_event

5 Systemd概述

Systemd正逐渐成为init系统的新标准。若系统中存在/usr/lib/systemd目录,则表明很可能正在使用Systemd。

工作机制与启动流程

Systemd通过设定目标来引导系统运行,每个目标都有其依赖项,这些依赖项也需要被激活。Systemd的灵活性和强大之处在于它不遵循严格的顺序来启动进程。典型的Systemd启动流程如下:

  1. 加载配置文件:通常位于/etc/systemd/system/usr/lib/systemd/system
  2. 确定启动目标:默认为default.target
  3. 解析并激活依赖:Systemd识别启动目标的依赖关系,并激活它们。

类似于Sys V的运行级别,Systemd可以引导进入不同的目标:

  • poweroff.target:关闭系统
  • rescue.target:单用户模式
  • multi-user.target:多用户模式(带网络)
  • graphical.target:图形界面(基于多用户模式)
  • reboot.target:重启

其中,默认启动目标default.target通常指向graphical.target

Units

Systemd操作的核心对象称为“units”。除了服务的启动和停止外,Systemd还能够挂载文件系统、监控网络套接字等,因此它支持多种类型的单元:

  • 服务单元(Service units):用于启动和停止服务,文件扩展名为.service
  • 挂载单元(Mount units):用于挂载文件系统,文件扩展名为.mount
  • 目标单元(Target units):用于组织其他单元,文件扩展名为.target

例如,当我们启动至default.target时,该目标会组合包括networking.servicecrond.service在内的多个单元。这意味着一旦激活一个特定单元,该单元下的所有相关联单元也会被激活。

6 Systemd目标

基本服务单元文件示例:foobar.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=My Foobar Service
Before=bar.target

[Service]
ExecStart=/usr/bin/foobar

[Install]
WantedBy=multi-user.target

这是一个简单的服务单元文件。在文件开头的[Unit]部分,可以为单元文件添加描述,并控制该单元相对于其他单元的激活顺序。接下来的[Service]部分定义了启动、停止或重新加载服务的具体命令。最后,[Install]部分用于指定依赖关系,决定在哪些目标下自动启用此单元。

常用Systemd命令

以下是与Systemd单元交互时常用的一些命令:

  • 列出所有单元

    1
    $ systemctl list-units
  • 查看单元状态

    1
    $ systemctl status networking.service
  • 启动服务

    1
    $ sudo systemctl start networking.service
  • 停止服务

    1
    $ sudo systemctl stop networking.service
  • 重启服务

    1
    $ sudo systemctl restart networking.service
  • 启用单元(设置为开机自启)

    1
    $ sudo systemctl enable networking.service
  • 禁用单元(取消开机自启)

    1
    $ sudo systemctl disable networking.service

7 系统电源状态管理

关闭系统

要立即关闭系统,可以使用以下命令:

1
$ sudo shutdown -h now

此命令将使系统停机(断电),并需要指定执行时间。您可以通过添加具体分钟数来设置系统在未来某个时间点自动关机。

例如,若要在两分钟后关机,可使用:

1
$ sudo shutdown -h +2

重启系统

使用shutdown命令重启系统:

1
$ sudo shutdown -r now

或者,直接使用reboot命令进行重启:

1
$ sudo reboot

[Linux]Init
https://erlsrnby04.github.io/2025/03/22/Linux-Init/
作者
ErlsrnBy04
发布于
2025年3月22日
许可协议