回顾init初始化程序
init 程序指的是内核加载到内存中后执行的第一个初始化程序,后续进程的创建与管理都是由 init 程序完成。
- 在 CentOS 5 中使用的 init 程序是 SysV,程序文件为
/sbin/init
,这是真正意义上的 init 程序,进程名称也叫init
,它的所有配置都存放在/etc/inittab
中; - 在 CentOS 6 中使用的 init 程序是 Upstart(由 Ubuntu 研发),被重命名为
init
了,程序文件也为/sbin/init
,它的配置文件存放在/etc/inittab
和/etc/init/*.conf
中; - 在 CentOS 7 中使用的 init 程序是 Systemd,程序文件为
/usr/lib/systemd/systemd
,进程名称为systemd
,它的配置文件存放在/usr/lib/systemd/system
和/etc/systemd/system
中;
今天的主角就是 CentOS 7 中的 Systemd 了。
Systemd的新特性
Systemd 与传统的 init 程序有着很大的区别,比如原来的 0~6 运行级别在 Systemd 中已不再存在,不过它仍然选择了一种方式来兼容运行级别的概念。
Systemd 是 Linux 系统的系统级服务管理工具,它的设计兼容了 SysV 的 init 脚本,也就意味着对于原来的 /etc/rc.d/init.d
下的服务脚本 Systemd 依然支持的,但是 Systemd 的并不依赖于这种脚本来启动诸多服务,它有自己的方式来启动和管理服务,且效率比原来的脚本方式要高得多。
Systemd 额外提供了一些新特性:
- 系统引导时实现服务并行启动;
- 按需激活进程(懒激活);
- 支持系统状态快照;
- 基于依赖关系定义服务控制逻辑;
在 CentOS 7 上,Systemd 已经完全取代了 CentOS 5 上的 SysV 和 CentOS 6 上的 Upstart init 程序。
关键特性
- 基于 socket 的激活机制,实现了 socket 与服务分离;
- 基于 bus 的激活机制;
- 基于 device 的激活机制;
- 基于 path 的激活机制;
- 系统快照,能够保存各 unit 的当前状态信息于持久存储设备中;
- 向后兼容 SysV init 脚本;
不兼容特性
Systemd 的各种服务控制是使用 systemctl
命令来控制的,而 systemctl
所支持的一些子命令或参数在原来 SysV 中是不一定兼容的。
如下是 Systemd 与原来 init 程序的一些不兼容特性:
systemctl
支持的子命令是固定不变的,如原有的start
、stop
、restart
、status
,但 SysV 的脚本是可以随意定义接收的参数的;systemctl
无法与那些非由systemd
启动的服务相通信;
Systemd的核心概念Unit
对于 Systemd 来讲它有一个核心组件及概念——Unit(单元),而 Unit 本身的配置是通过其配置文件进行标识,配置文件中主要包含了系统服务、监听 Socket、保存的系统快照以及其它与 Unit 相关的信息。
Unit 的配置文件通常在如下位置:
/usr/lib/systemd/system
;/run/systemd/system
;/etc/systemd/system
;
Unit 是 Systemd 实现系统服务管理最核心的概念,可以把每一个 Unit 想象成此前使用的每一个服务脚本,但是 Unit 除了能够实现原有服务脚本的启动、停止、重启、查看服务状态等功能,还有其它功能的 Unit。
Unit 可分为如下几类,每一类的 Unit 是通过其文件的扩展名来识别的:
Service unit
:用于定义系统服务,其文件扩展名为.service
,原来/etc/rc.d/init.d
下的服务脚本对应的 Service unit 文件位于/usr/lib/systemd/system
中,即原来每一个服务脚本对应其中的一个扩展名为.service
的 Unit 文件,而这些 Unit 文件是没有执行权限的,仅起到配置作用;Target unit
:用于模拟实现 CentOS 5 和 6 上的运行级别(并未做到完全兼容),其文件扩展名为.target
;Device unit
:用于定义内核识别的设备,其文件扩展名为.device
;Mount unit
:用于定义文件系统挂载点,其文件扩展名为.mount
;Socket unit
:用于标识进程间通信用的 socket 文件,其文件扩展名为.socket
;Snapshot unit
:用于管理系统快照,其文件扩展名为.snapshot
;Swap unit
:用于表示 swap 设备,其文件扩展名为.swap
;Automount unit
:用于实现文件系统的自动挂载点,其文件扩展名为.autoamount
;Path unit
:用于定义文件系统中的一个文件或目录;
每个 Unit 的操作均受 Systemd 的 5 分钟超时限制,即 5 分钟内 Unit 的操作如果没有正常执行,那么将会终止这个 Unit 的操作。
管理系统服务
在 CentOS 7 上所有的服务都是通过 Service unit
来进行管理的,要注意的,该 Service unit
的方式能兼容早起的服务类脚本。
虽然说起来是使用 Service unit
来进行服务管理,但实际上是我们是通过 systemctl
命令来进行交互控制的,systemctl
命令语法格式如下:
systemctl <COMMAND> <name>.service
COMMAND:子命令,如 start、stop、restart、status;
name:服务名称;
CentOS 6 和 7 服务管理命令对比:
操作 | CentOS 6 | CentOS 7 |
---|---|---|
启动 | service <name> start | systemctl start <name>.service |
停止 | service <name> stop | systemctl stop <name>.service |
重启 | service <name> restart | systemctl restart <name>.service |
查看状态 | service <name> status | systemctl status <name>.service |
条件式重启 | service <name> condrestart | systemctl try-restart <name>.service |
查看服务是否开机自启 | chkconfig --list <name> | systemctl is-enabled <name>.service |
查看服务是否激活 | - | systemctl is-active <name>.service |
查看所有已经激活的服务 | - | systemctl list-units --type service |
查看所有服务 | - | systemctl list-units --type service --all |
设定某服务开机自启 | chkconfig <name> on | systemctl enable <name>.service |
禁止某服务开机自启 | chkconfig <name> off | systemctl disable <name>.service |
检查所有服务的开机自启状态 | chkconfig --list | systemctl list-unit-files --type service |
查看服务的依赖关系 | - | systemctl list-dependencies <name>.service |
重载或重启服务 | - | systemctl reload-or-restart <name>.service |
重载或条件式重启 | - | systemctl reload-or-restart <name>.service |
禁止设定为开机自启 | - | systemctl mask <name>.service |
取消禁止开机自启 | - | systemctl unmask <name>.service |
上述
systemctl
命令中.service
可以省略。
模拟运行级别
上面有说过,Target unit
是用来模拟实现 CentOS 5 和 6 上的运行级别的,该功能是通过扩展名为 .target
的 Unit 的配置文件来实现,这个文件的主要目的就是将那些需要同时启动的服务组织在一起。
各运行级别对应的文件如下:
运行级别 | CentOS 7 中的文件名 |
---|---|
0 | runlevel0.target, poweroff.target |
1 | runlevel1.target, rescue.target |
2 | runlevel2.target, multi-user.target |
3 | runlevel3.target, multi-user.target |
4 | runlevel4.target, multi-user.target |
5 | runlevel5.target, graphical.target |
6 | runlevel6.target, reboot.target |
这些 target 文件也在
/usr/lib/systemd/system
下。
相应的,关于运行级别的操作也有了变化,如下表:
操作 | CentOS 5 或 6 | CentOS 7 |
---|---|---|
切换级别 | init <level> | systemctl isolate <name>.target |
查看级别 | runlevel | systemctl list-units --type target |
获取默认级别 | /etc/inittab | systemctl get-default |
修改默认级别 | /etc/inittab | systemctl set-default <name>.target |
切换到紧急救援模式 | - | systemctl rescue |
切换到 emergency 模式 | - | systemctl emergency |
rescue 模式下只是大部分服务没有启动,但是驱动可以加载;
emergency 模式驱动不加载,系统不初始化,服务也不启动;
systemctl的其它子命令
- 关机:
systemctl halt
、systemctl poweroff
; - 重启:
systemctl reboot
; - 挂起:
systemctl suspend
; - 快照:
systemctl hibernate
; - 快照并挂起:
systemctl hybrid-sleep
;
评论区