linux systemd
什么是 systemd
Linux 系统在启动过程中,内核完成初始化以后,由内核第一个启动的程序便是 init 程序,路径为 /sbin/init(为一个软连接,链接到真实的 init 进程),其 PID 为1,它为系统里所有进程的“祖先”,Linux 中所有的进程都由 init 进程直接或间接进行创建并运行,init 进程以守护进程的方式存在,负责组织与运行系统的相关初始化工作,让系统进入定义好的运行模式,如命令行模式或图形界面模式。
Systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。如果你的Linux系统配置为使用Systemd引导程序,它取替传统的SysV init,启动过程将交给systemd处理。Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。
systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。所以从CentOS 7开始也由systemd取代了init作为默认的系统进程管理工具。
systemd 是内核启动后的第一个用户进程,PID 为1,是所有其它用户进程的父进程。
systemd 特点
- 最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu20.04…)
- CentOS7 支持开机并行启动服务,显著提高开机启动效率
- CentOS7关机只关闭正在运行的服务,而CentOS6,全部都关闭一次。
- CentOS7服务的启动与停止不再使用脚本进行管理,也就是/etc/init.d下不在有脚本。
- CentOS7使用systemd解决原有模式缺陷,比如原有service不会关闭程序产生的子进程
unit(单元)
系统初始化需要做的事情非常多。需要启动后台服务,比如启动 ssh 服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被 systemd 抽象为一个配置单元,即 unit。可以认为一个服务是一个配置单元,一个挂载点是一个配置单元,一个交换分区的配置是一个配置单元等等。
下面是一些常见的 unit 类型:
- service :代表一个后台服务进程,比如 MySQLd。这是最常用的一类。
- socket :此类配置单元封装系统和互联网中的一个套接字 。当下,systemd 支持流式、数据报和 连续包的 AF_INET、AF_INET6、AF_UNIX socket 。每一个套接字配置单元都有一个相应的服务配置单元 。相应的服务在第一个"连接"进入套接字时就会启动(例如:nscd.socket 在有新连接后便启动 nscd.service)。
- device :此类配置单元封装一个存在于 Linux 设备树中的设备。每一个使用 udev 规则标记的设备都将会在 systemd 中作为一个设备配置单元出现。
- mount :此类配置单元封装文件系统结构层次中的一个挂载点。Systemd 将对这个挂载点进行监控和管理。比如可以在启动时自动将其挂载;可以在某些条件下自动卸载。Systemd 会将 /etc/fstab 中的条目都转换为挂载点,并在开机时处理。
- automount :此类配置单元封装系统结构层次中的一个自挂载点。每一个自挂载配置单元对应一个挂载配置单元 ,当该自动挂载点被访问时,systemd 执行挂载点中定义的挂载行为。
- swap:和挂载配置单元类似,交换配置单元用来管理交换分区。用户可以用交换配置单元来定义系统中的交换分区,可以让这些交换分区在启动时被激活。
- target :此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已。这样便可以对配置单元做一个统一的控制。这样就可以实现大家都已经非常熟悉的运行级别概念。比如想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍以便进入目标所代表的系统运行状态。 (例如:multi-user.target 相当于在传统使用 SysV 的系统中运行级别 5)
- timer:定时器配置单元用来定时触发用户定义的操作,这类配置单元取代了 atd、crond 等传统的定时服务。
- snapshot :与 target 配置单元相似,快照是一组配置单元。它保存了系统当前的运行状态。
- path:文件系统中的一个文件或目录。
- scope:用于 cgroups,表示从 systemd 外部创建的进程。
- slice:用于 cgroups,表示一组按层级排列的单位。slice 并不包含进程,但会组建一个层级,并将 scope 和 service 都放置其中。
**每个配置单元都有一个对应的配置文件,系统管理员的任务就是编写和维护这些不同的配置文件,比如一个 MySQL 服务对应一个 mysql.service 文件。**
- .automount:用于控制自动挂载文件系统,相当于 SysV-init 的 autofs 服务
- .device:对于 /dev 目录下的设备,主要用于定义设备之间的依赖关系
- .mount:定义系统结构层次中的一个挂载点,可以替代过去的 /etc/fstab 配置文件
- .path:用于监控指定目录或文件的变化,并触发其它 Unit 运行
- .scope:这种 Unit 文件不是用户创建的,而是 Systemd 运行时产生的,描述一些系统服务的分组信息
- .service:封装守护进程的启动、停止、重启和重载操作,是最常见的一种 Unit 文件
- .slice:用于表示一个 CGroup 的树,通常用户不会自己创建这样的 Unit 文件
- .snapshot:用于表示一个由 systemctl snapshot 命令创建的 Systemd Units 运行状态快照
- .socket:监控来自于系统或网络的数据消息,用于实现基于数据自动触发服务启动
- .swap:定义一个用户做虚拟内存的交换分区
- .target:用于对 Unit 文件进行逻辑分组,引导其它 Unit 的执行。它替代了 SysV-init 运行级别的作用,并提供更灵活的基于特定设备事件的启动方式
- .timer:用于配置在特定时间触发的任务,替代了 Crontab 的功能
systemd unit目录
Unit 文件按照 Systemd 约定,应该被放置指定的三个系统目录之一中。这三个目录是有优先级的,如下所示,越靠上的优先级越高。因此,在三个目录中有同名文件的时候,只有优先级最高的目录里的那个文件会被使用。
/etc/systemd/system:系统或用户自定义的配置文件
/run/systemd/system:软件运行时生成的配置文件
/usr/lib/systemd/system:系统或**第三方软件安装时添加的配置文件**。
Systemd 默认从目录 /etc/systemd/system/ 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/,真正的配置文件存放在那个目录。
Unit 和 Target
Target 就是一个 Unit 组,包含许多相关的 Unit 。
Unit 是 Systemd 管理系统资源的基本单元,可以认为每个系统资源就是一个 Unit,并使用一个 Unit 文件定义。在 Unit 文件中需要包含相应服务的描述、属性以及需要运行的命令。
Unit 文件结构
systemd.service 中文手册
参考URL:
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
- [Unit]:记录unit文件的通用信息。
- [Service]:记录Service的信息
- [Install]:安装信息。
把自己的服务使用systemd管理需要书写*.service文件,如服务名xxx.service,下面我们介绍一下*.service文件里面具体的内容。
进入目录 cd /etc/systemd/system/
cat << EOF > /etc/systemd/system/xxx.service
[Unit]
Description=Xxx Service
Documentation=https://www.secureweb3.com/
After=network-online.target
Wants=network-online.target
[Service]
User=root
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=+$APPROOT/xxx
Restart=on-failure
RestartPreventExitStatus=23
[Install]
WantedBy=multi-user.target
EOF
- Description:描述这个 Unit 文件的信息
- Documentation:指定服务的文档,可以是一个或多个文档的 URL 路径
- Requires:依赖的其它 Unit 列表,列在其中的 Unit 模板会在这个服务启动时的同时被启动。并且,如果其中任意一个服务启动失败,这个服务也会被终止
- Wants:与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模板启动是否成功
- After:与 Requires 相似,但是在后面列出的所有模块全部启动完成以后,才会启动当前的服务
- network-online.target是主动等待直到网络“启动”的target,其中“启动”的定义
network.target代表有网路,network-online.target代表一个连通着的网络。
[service]
- User: 指定用户运行CapabilityBoundingSet: 能力边界设置,可以设置哪些能力
- capability
美: [ˌkeɪpəˈbɪləti]
英: [.keɪpə’bɪləti]
n. 能力;才能;(国家的)军事力量
网络 性能;容量;才干
bound
美: [baʊnd]
英: [baʊnd]
n. 边界;跳跃;范围;界限
v. 跳跃;邻接;“bind”的过去分词和过去式;限制
adj. 打算;要往(某处)去的;被束缚的;理应…的
网络 弹跳;边边界框;弹跳力
CAP_NET_ADMIN
执行各种与网络相关的操作:
* 接口配置;
* 管理 IP 防火墙、伪装和
会计;
* 修改路由表;
*绑定到任何地址以进行透明代理;
* 设置服务类型 (TOS);
* 清除驱动程序统计信息;
* 设置混杂模式;
*启用多播;
* 使用setsockopt(2)设置以下套接字选项:
SO_DEBUG、SO_MARK、SO_PRIORITY(对于优先级外
范围 0 到 6)、SO_RCVBUFFORCE和SO_SNDBUFFORCE。
CAP_NET_BIND_SERVICE
将套接字绑定到 Internet 域特权端口(端口
小于 1024 的数字)。
- NoNewPrivileges=true
- ExecStart: 定义启动进程时执行的命令
- Restart= 设为on-failure, on-watchdog, on-abnormal, always 之一, 可以实现在失败状态下的自动重启该服务。
- RestartPreventExitStatus中列出的退出码或者信号永远不会导致该服务被重启。
[Install]
- WantedBy字段:表示该服务所在的 Target。
Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target。
这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
一般来说,常用的 Target 有两个:一个是multi-user.target,表示多用户命令行状态;另一个是graphical.target,表示图形用户状态,它依赖于multi-user.target。
Linux命令——systemctl
Systemd 入门教程:实战篇
参考URL: https://www.jb51.net/article/269756.htm
Linux命令——systemctl
参考URL:https://www.jb51.net/article/269756.htm
systemd对应的进程管理命令就是systemctl。
systemctl [command] [unit](配置的应用名称)
command可选项·
start:启动指定的unit systemctl start nginx
stop:关闭指定的unit systemctl stop nginx
restart:重启指定unit systemctl restart nginx
reload:重载指定unit systemctl reload nginx
enable:系统开机时自动启动指定unit,前提是配置文件中有相关配置 systemctl enable nginx
disable:开机时不自动运行指定unit systemctl disable nginx
status:查看指定unit当前运行状态 systemctl status nginx
参考
Systemd 入门教程:实战篇
参考URL: https://www.jb51.net/article/269756.htm
到此这篇关于linux 系统进程管理工具systemd详解(systemctl命令、创建自己的systemd服务)的文章就介绍到这了,更多相关linux 进程管理工具systemd内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!