systemd有节省系统资源、能更快地启动系统等特点。

systemd 简介和特点

systemd提供了按需启动能力

在System V系统中,系统服务被赋予了不同的优先级
在系统启动的时候,System V 的主进程 init 会按照优先级依次启动服务,即按优先级排序,优先级高的先启动,启动完成后再启动优先级低的服务。类似于串行队列处理系统,排在队伍前面的额先启动,前面的启动完成再启动后面的服务。
优点:可以解决服务之间的依赖问题。
缺点:服务总是排队处理,效率太低。启动系统的时候,会将所有可能用到的服务(包括:打印服务CUPS、蓝牙服务bluetooth)都启动,会消耗系统资源。

为了解决这些问题,systemd采用了两种技术
1.并行启动技术。所有的服务都尽可能地并行启动,使用缓冲池的方式解决服务的依赖性,同时尽可能启动更少的进程,进一步提高启动速度。
2.按需启动技术。只有服务再被请求的时候才启动服务,当请求结束的时候,服务会被关闭,来达到节约系统资源的目的。

Cgroup特性跟踪

Cgroup是Linux内核的特性,主要用来实现系统资源配额管理。当进程创建子进程的时候,子进程会自动继承父进程的Cgroup。无论进程如何派生子进程,他们的Cgroup都是一样的。
systemd利用Linux内核的Cgroups特性来跟踪进程的,当服务停止的时候,systemd只需要遍历查询指定的Cgroup就可以找到所有子进程,然后一一结束就可以了。

启动挂载点和自动挂载管理

在RHEL老版本中,挂载信息保存在文件/etc/fstab中。系统启动的时候会根据文件的内容自动挂载文件系统,并且当系统启动完成后会确保文件中记录的挂载一直生效。这些挂载点由System V维护,由systemd接管。
systemd支持/etc/fstab文件,用户仍然可以通过此文件管理挂载点。
systemd内建了自动挂载功能,无须使用之前的autofs服务。自动挂载就是,没有访问挂载点的时候,挂载点处于未挂载状态,而当用户访问挂载点的时候,自动对其进行挂载。eg:光驱。自动挂载的目的就是为了节约资源。

实现事务性依赖关系管理

systemd的事务性主要是为了保证服务之间没有循环依赖的情况发生。
systemd解决循环依赖,将服务间的依赖分为两类:
1.强依赖:强依赖是必须满足的依赖条件
2.弱依赖:弱依赖的程度更弱一些,有时可以不必强制满足条件

日志服务

syslog日志的缺点:
1.日志不安全,进程在产生日志消息的时候,消息的内容均有进程自主产生,任何进程都可以互相冒充。因为syslog日志不会验证消息的来源是否属实
2.日志消息没有严格的格式,这使得自动化处理日志变得困难、低效

systemd重新设计了系统的日志系统journald。
不再使用文本格式存放日志内容,而使用二进制文件存放。
具有可移植性、资源消耗少、结构简单、可拓展、安全性高等优点。

unit的应用

systemd取消服务脚本的概念,用unit代替。
systemd将启动过程抽象为一个一个的unit。

  1. #查看系统中安装的单元
  2. [root@lhuan ~]# systemctl list-units
  3. UNIT LOAD ACTIVE SUB DESCRIPTION
  4. proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Fo
  5. sys-devices-pci0000:00-0000:00:01.1-ata1-host0-target0:0:1-0:0:1:0-block-sr0.device lo
  6. sys-devices-pci0000:00-0000:00:03.0-virtio0-net-eth0.device loaded active plugged Vi
  7. sys-devices-pci0000:00-0000:00:04.0-virtio1-block-vda-vda1.device loaded active plugge
  8. sys-devices-pci0000:00-0000:00:04.0-virtio1-block-vda.device loaded active plugged /
  9. sys-devices-platform-serial8250-tty-ttyS1.device loaded active plugged /sys/devices/
  10. sys-devices-platform-serial8250-tty-ttyS2.device loaded active plugged /sys/devices/
  11. sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged /sys/devices/
  12. sys-devices-pnp0-00:04-tty-ttyS0.device loaded active plugged /sys/devices/pnp0/00:0
  13. sys-devices-virtual-net-docker0.device loaded active plugged /sys/devices/virtual/ne
  14. sys-module-configfs.device loaded active plugged /sys/module/configfs
  15. sys-subsystem-net-devices-docker0.device loaded active plugged /sys/subsystem/net/de
  16. sys-subsystem-net-devices-eth0.device loaded active plugged Virtio network device
  17. -.mount loaded active mounted /
  18. dev-hugepages.mount loaded active mounted Huge Pages File System
  19. dev-mqueue.mount loaded active mounted POSIX Message Queue File System
  20. proc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Forma
  21. run-user-0.mount loaded active mounted /run/user/0
  22. sys-kernel-config.mount loaded active mounted Configuration File System
  23. sys-kernel-debug.mount loaded active mounted Debug File System
  24. systemd-ask-password-plymouth.path loaded active waiting Forward Password Requests t
  25. systemd-ask-password-wall.path loaded active waiting Forward Password Requests to Wa
  26. session-1.scope loaded active abandoned Session 1 of user root
  27. session-57363.scope loaded active running Session 57363 of user root
  28. acpid.service loaded active running ACPI Event Daemon
  29. atd.service loaded active running Job spooling tools
  30. auditd.service loaded active running Security Auditing Service
  31. cloud-config.service loaded active exited Apply the settings specified in
  32. cloud-final.service loaded active exited Execute cloud user/final script

每个单元都有用于标识类型的后缀。
常见的类型及其作用

类型 作用
device 此单元封装了一个设备,eg:网卡、终端等
mount 挂载点。
systemd会自动对此挂载点进行监控和管理。
通常此类挂载点都是systemd通过检测/etc/fstab文件后自动配置的
automounto 自动挂载点。
通常每一个单元对用一个配置单元。当挂载点被访问的时候,systemd自动执行挂载行为
swap 管理交换分区的挂载
service 此类单元用于封装一个后台服务进程。
eg:httpd,mysqld等
socket 此类配置单元用于封装一个系统和服务的套接字,当连接到来的时候,systemd会启动与此套接字对应的服务
target 对其他单元的逻辑分组,便于对单元进行统一的控制。
eg:每一个运行级别都是一个target分组单元,包含了进入该运行级别需要运行的单元
timer 定时器配置单元用来定时执行任务。
可用来代替cron和at计划任务

systemd的使用

unit文件的编写

用户所编写的unit文件通常为服务类型,文件名后缀为service。
此类文件通常保存在/etc/systemd/system和/usr/lib/systemd/system两个目录中
/etc/systemd/system供系统管理员使用,/usr/lib/systemd/system通常是安装程序使用。

#sshd服务的unit文件
[root@lhuan ~]# cat /usr/lib/systemd/system/sshd.service 
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

unit文件分为Unit、Service、Install三个部分,分别用于定义通用信息、服务信息和安装信息。

Unit 部分常见的配置项

  • Description:对本unit的描述信息
  • Documentation:与本unit单元相关的文档描述
  • After和Before:定义启动顺序。

Before = xx.service 表示本服务在xx.service之前启动
After = xx.service 表示本服务在xx.service之后启动

  • Requires:本单元启动了,它需要的单元也会随之启动。

由于systemd是并行启动的,有可能本单元先启动,需要的单元后启动,从而导致本单元启动不成功,所有不建议使用此配置项

  • Requisite:强势的Requires,若需要的单元启动不成功,本单元将会直接启动不成功
  • RequiresOverridable:与Requires相同,若是手动启动本单元,那么即使RequiresOverridable单元启动不成功,也不会报错
  • Conflicts:一个单元的启动会导致与之相冲突的单元停止

    Service 部分常见的配置项

  • Type service的各类

常见的类型:
simple:表示最简单的服务类型,启动的是主进程,主进程一旦结束,所有进程都将结束
forking:最标准的守护进程,启动后主进程调用fork()函数,设置完成后父进程退出,留下守护子进程
oneshot:启动完成后就没有进程了

  • ExecStart 服务启动时使用的命令,如果类型不是oneshot,则只能使用一个命令及其若干参数。如果使用多个命令则可以用分号隔开,多行则用“\”隔开
  • ExecStartPre ExecStartPost 使用ExecStart前后使用的命令
  • ExecStop 定义停止服务时使用的命令
  • Restart 定义服务在哪种情况下重启,eg:启动失败、启动超时、进程被终止等

    Install 部分常见的配置项

  • WantedBy 什么情况下服务被启动。

WantedBy=multi-user.target 表示多用户环境服务启动

  • Alias 别名

    创建自己的systemd服务

    ```bash [root@lhuan ~]# cat /usr/lib/systemd/system/lhuan.service [Unit] Description=lhuan.service

[Service] Type=onshot ExecStart=/bin/bash /root/date.sh

[Install] WantedBy=multi-user.target

[root@lhuan ~]# cat date.sh

/bin/bash

date >> /root/1.sh

 将lhuan.service复制到目录/usr/lib/systemd/system/,就完成unit的编写。<br /> 接下来使用systemctl enable lhuan.service将服务启动,重启系统查看1.sh文件中的内容进行验证,
```bash
[root@lhuan ~]# systemctl enable lhuan.service
Created symlink from /etc/systemd/system/multi-user.target.wants/lhuan.service to /usr/lib/systemd/system/lhuan.service.
## 重启服务,查看1.sh文件中的内容进行验证,有最近的时间追加到文件的后面
[root@lhuan ~]# systemctl restart lhuan.service
[root@lhuan ~]# cat 1.sh
Sun Oct 11 10:50:00 CST 2020
Mon Oct 12 19:27:15 CST 2020
[root@lhuan ~]# systemctl stop  lhuan.service
[root@lhuan ~]# systemctl enable lhuan.service
[root@lhuan ~]# systemctl start lhuan.service
[root@lhuan ~]# cat 1.sh
Sun Oct 11 10:50:00 CST 2020
Mon Oct 12 19:27:15 CST 2020
Mon Oct 12 19:27:48 CST 2020

System V和systemd 的命令对比

System V命令 systemd命令 命令功能
chkconfig httpd on systemd enable httpd.service 启用服务
chkconfig httpd off systemd disable httpd.service 禁用服务
chkconfig —list systemctl list-unit-files —type service 列出所有服务
chkconfig —list httpd systemctl is-enabled atd.service 列出单个服务
chkconfig httpd stop systemctl stop httpd.service 停止服务
chkconfig httpd start systemctl start httpd.service 启动服务
chkconfig httpd restart systemctl restart httpd.service 重启服务
chkconfig httpd reload systemctl reload httpd.service 重新载入配置文件
chkconfig httpd status systemctl status http.service 查看服务当前状态

常见命令

#将系统默认运行级别设置为完全多用户模式
systemctl set-default multi-user.target
#将系统默认运行级别设置为图形模式
systemctl set-default graphical.target