[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 |
|
这表明,在切换至运行级别0时,系统将尝试首先终止updates服务,然后是openvpn服务。
默认运行级别可以在/etc/inittab
文件中查看或修改。
2 System V服务
在Sys V系统中,可以通过多种命令行工具来管理服务。以下是一些基本的操作示例:
列出所有服务状态
使用service --status-all
命令可以列出系统中所有服务的状态。此命令会显示每个服务的当前状态(运行中或已停止)。
1 |
|
启动服务
要启动一个特定的服务,例如网络服务,可以使用如下命令:
1 |
|
停止服务
若需要停止某个正在运行的服务,同样可以使用service
命令:
1 |
|
重启服务
为了重新加载配置或应用更改,通常需要重启服务。这可以通过执行以下命令完成:
1 |
|
这些命令不仅适用于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 |
|
示例输出可能包括:
acpid.conf
mountnfs.sh.conf
alsa-restore.conf
networking.conf
- …
在这些配置文件中,定义了如何以及何时启动作业。例如,在networking.conf
文件中,可能会有如下内容:
1 |
|
这意味着在网络运行级别2、3或5时启动网络设置,并在网络运行级别0时停止网络服务。配置文件的编写方式多样,具体取决于不同的作业需求。
Upstart工作原理
- 加载作业配置:首先,Upstart从
/etc/init
加载作业配置。 - 响应启动事件:一旦发生启动事件,与该事件相关的作业将被执行。
- 事件链式反应:执行的作业会产生新的事件,进而触发更多的作业。
- 循环直至完成:此过程持续进行直到所有必要的作业都已完成。
4 Upstart作业管理
尽管Upstart能够触发众多事件和作业的运行,但没有简便的方法可以直接查看某一事件或作业的来源。通常情况下,直接查阅/etc/init
中的作业配置文件并非必要,但在需要对特定作业进行更精细控制时,则需了解一些实用命令。
查看所有作业状态
使用initctl list
命令可以列出系统中所有Upstart作业及其当前状态:
1 |
|
输出示例:
1 |
|
每一行代表一个作业,其中第一值为作业名称,第二字段(斜杠前)表示作业的目标状态,第三值(斜杠后)则显示当前状态。
查看特定作业状态
要检查某个具体作业的状态,可以使用initctl status
命令:
1 |
|
示例输出:
1 |
|
作业的手动操作
- 启动作业:
1
sudo initctl start networking
- 停止作业:
1
sudo initctl stop networking
- 重启作业:
1
sudo initctl restart networking
手动发出事件
若要手动触发某一事件以启动其他作业,可使用如下命令:
1 |
|
5 Systemd概述
Systemd正逐渐成为init系统的新标准。若系统中存在/usr/lib/systemd
目录,则表明很可能正在使用Systemd。
工作机制与启动流程
Systemd通过设定目标来引导系统运行,每个目标都有其依赖项,这些依赖项也需要被激活。Systemd的灵活性和强大之处在于它不遵循严格的顺序来启动进程。典型的Systemd启动流程如下:
- 加载配置文件:通常位于
/etc/systemd/system
或/usr/lib/systemd/system
。 - 确定启动目标:默认为
default.target
。 - 解析并激活依赖: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.service
和crond.service
在内的多个单元。这意味着一旦激活一个特定单元,该单元下的所有相关联单元也会被激活。
6 Systemd目标
基本服务单元文件示例:foobar.service
1 |
|
这是一个简单的服务单元文件。在文件开头的[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 |
|
此命令将使系统停机(断电),并需要指定执行时间。您可以通过添加具体分钟数来设置系统在未来某个时间点自动关机。
例如,若要在两分钟后关机,可使用:
1 |
|
重启系统
使用shutdown
命令重启系统:
1 |
|
或者,直接使用reboot
命令进行重启:
1 |
|