回顾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;
评论区