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。
#查看系统中安装的单元[root@lhuan ~]# systemctl list-unitsUNIT LOAD ACTIVE SUB DESCRIPTIONproc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Fosys-devices-pci0000:00-0000:00:01.1-ata1-host0-target0:0:1-0:0:1:0-block-sr0.device losys-devices-pci0000:00-0000:00:03.0-virtio0-net-eth0.device loaded active plugged Visys-devices-pci0000:00-0000:00:04.0-virtio1-block-vda-vda1.device loaded active pluggesys-devices-pci0000:00-0000:00:04.0-virtio1-block-vda.device loaded active plugged /sys-devices-platform-serial8250-tty-ttyS1.device loaded active plugged /sys/devices/sys-devices-platform-serial8250-tty-ttyS2.device loaded active plugged /sys/devices/sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged /sys/devices/sys-devices-pnp0-00:04-tty-ttyS0.device loaded active plugged /sys/devices/pnp0/00:0sys-devices-virtual-net-docker0.device loaded active plugged /sys/devices/virtual/nesys-module-configfs.device loaded active plugged /sys/module/configfssys-subsystem-net-devices-docker0.device loaded active plugged /sys/subsystem/net/desys-subsystem-net-devices-eth0.device loaded active plugged Virtio network device-.mount loaded active mounted /dev-hugepages.mount loaded active mounted Huge Pages File Systemdev-mqueue.mount loaded active mounted POSIX Message Queue File Systemproc-sys-fs-binfmt_misc.mount loaded active mounted Arbitrary Executable File Formarun-user-0.mount loaded active mounted /run/user/0sys-kernel-config.mount loaded active mounted Configuration File Systemsys-kernel-debug.mount loaded active mounted Debug File Systemsystemd-ask-password-plymouth.path loaded active waiting Forward Password Requests tsystemd-ask-password-wall.path loaded active waiting Forward Password Requests to Wasession-1.scope loaded active abandoned Session 1 of user rootsession-57363.scope loaded active running Session 57363 of user rootacpid.service loaded active running ACPI Event Daemonatd.service loaded active running Job spooling toolsauditd.service loaded active running Security Auditing Servicecloud-config.service loaded active exited Apply the settings specified incloud-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
