Linux基础(61)之systemd服务管理

Linux基础(61)之systemd服务管理

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

回顾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 额外提供了一些新特性:

  1. 系统引导时实现服务并行启动;
  2. 按需激活进程(懒激活);
  3. 支持系统状态快照;
  4. 基于依赖关系定义服务控制逻辑;

在 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 支持的子命令是固定不变的,如原有的 startstoprestartstatus,但 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 6CentOS 7
启动service <name> startsystemctl start <name>.service
停止service <name> stopsystemctl stop <name>.service
重启service <name> restartsystemctl restart <name>.service
查看状态service <name> statussystemctl status <name>.service
条件式重启service <name> condrestartsystemctl 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> onsystemctl enable <name>.service
禁止某服务开机自启chkconfig <name> offsystemctl disable <name>.service
检查所有服务的开机自启状态chkconfig --listsystemctl 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 中的文件名
0runlevel0.target, poweroff.target
1runlevel1.target, rescue.target
2runlevel2.target, multi-user.target
3runlevel3.target, multi-user.target
4runlevel4.target, multi-user.target
5runlevel5.target, graphical.target
6runlevel6.target, reboot.target

这些 target 文件也在 /usr/lib/systemd/system 下。

相应的,关于运行级别的操作也有了变化,如下表:

操作CentOS 5 或 6CentOS 7
切换级别init <level>systemctl isolate <name>.target
查看级别runlevelsystemctl list-units --type target
获取默认级别/etc/inittabsystemctl get-default
修改默认级别/etc/inittabsystemctl set-default <name>.target
切换到紧急救援模式-systemctl rescue
切换到 emergency 模式-systemctl emergency

rescue 模式下只是大部分服务没有启动,但是驱动可以加载;
emergency 模式驱动不加载,系统不初始化,服务也不启动;

systemctl的其它子命令

  • 关机:systemctl haltsystemctl poweroff
  • 重启:systemctl reboot
  • 挂起:systemctl suspend;
  • 快照:systemctl hibernate
  • 快照并挂起:systemctl hybrid-sleep

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/linux-base-61.html

Buy me a cup of coffee ☕.