systemctl系统服务管理
systemctl简介
systemd 拥有丰富的文档。参考 http://0pointer.de/blog/projects/systemd-docs.html
https://lfzyx.org/linux/systemd.html#id3
RHEL6版本及以前,采用的第一个进程都是init.第一个进程非常重要,因为第一个进程要负责后面所有进程的启动,后面其他进程能否启动成功取决于系统能不能正常运行.
通过init进程启动的后续进程都是串行启动的,串行启动就意味着速度慢.
Centos7以后系统默认使用systemctl管理系统服务,采用第一个进程叫做systemd.
该进程相比init来说,采用并行启动后续进程,并行启动意味着速度快.
systemd是在Linux下,与SysV和LSB初始化脚本兼容的系统和服务管理器。systemd使用socket和D-Bus来开启服务,提供基于守护进程的按需启动策略,支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有更高的并行性能。

systemd可以提供按需启动的能力
当sysvinit系统初始化的时候,它会将所有可能用到的后台服务进程全部启动运行。并且系统必须等待所有的服务都启动就绪之后,才允许用户登录。这种做法有两个缺点:
- 首先是启动时间过长;
- 其次是系统资源浪费。
某些服务很可能在很长一段时间内,甚至整个服务器运行期间都没有被使用过。比如CUPS,打印服务在多数服务器上很少被真正使用到。您可能没有想到,在很多服务器上SSHD也是很少被真正访问到的。花费在启动这些服务上的时间是不必要的;同样,花费在这些服务上的系统资源也是一种浪费。
systemd可以提供按需启动的能力,只有在某个服务被真正请求的时候才启动它。当该服务结束,systemd可以关闭它,等待下次需要时再次启动它

systemd采用cgroup特性跟踪和管理进程的生命周期
init系统的一个重要职责就是负责跟踪和管理服务进程的生命周期。它不仅可以启动一个服务,也能够停止服务。这看上去没有什么特别的,然而在真正用代码实现的时候,您或许会发现停止服务比一开始想的要困难。
服务进程一般都会作为守护进程(daemon)在后台运行,为此服务程序有时候会派生(fork)两次。在 UpStart中,需要在配置文件中正确地配置expect小节。这样UpStart通过对fork系统调用进行计数,从而获知真正的精灵进程的PID号。cgroup已经出现了很久,它主要用来实现系统资源配额管理。cgroup提供了类似文件系统的接口,使用方便。当进程创建子进程时,子进程会继承父进程的cgroup。因此无论服务如何启动新的子进程,所有的这些相关进程都会属于同一个cgroup,systemd只需要简单地遍历指定的cgroup即可正确地找到所有的相关进程, 将它们逐一停止即可。
启动挂载点和自动挂载的管理
传统的Linux系统中,用户可以用/etc/fstab文件来维护固定的挂载点。这些挂载点在系统启动过程中被自动挂载,一旦启动过程结束,这些挂载点就会确保存在。这些挂载点都是对系统运行至关重要的 文件系统,比如HOME目录。和sysvinit一样,systemd管理这些挂载点,以便能够在系统启动时自动挂载它们。systemd还兼容/etc/fstab文件,您可以继续使用该文件管理挂载点。 有时候用户还需要动态挂载点,比如打算访问DVD内容时,才临时执行挂载以便访问其中的内容,而不访问光盘时该挂载点被取消(umount),以便节约资源。传统地,人们依赖autofs服务来实现这种功能。 systemd内建了自动挂载服务,无需另外安装autofs服务,可以直接使用systemd提供的自动挂载管理来实现autofs的功能。
实现事务性依赖关系管理
系统启动过程是由很多的独立工作共同组成的,这些工作之间可能存在依赖关系,比如挂载一个NFS 文件系统必须依赖网络能够正常工作。systemd虽然能够最大限度地并发执行很多有依赖关系的工作, 但是类似“挂载NFS”和“启动网络”这样的工作还是存在天生的先后依赖关系,无法并发执行。对 于这些任务,systemd维护一个“事务一致性”的概念,保证所有相关的服务都可以正常启动而不会 出现互相依赖,以至于死锁的情况。
与SysV初始化脚本兼容
和UpStart一样,systemd引入了新的配置方式,对应用程序的开发也有一些新的要求。如果systemd 想替代目前正在运行的初始化系统,就必须和现有程序兼容。任何一个Linux发行版都很难为了采用 systemd而在短时间内将所有的服务代码都修改一遍。systemd提供了和sysvinit以及LSB initscripts兼容的特性。系统中已经存在的服务和进程无需修改。这 降低了系统向systemd迁移的成本,使得systemd替换现有初始化系统成为可能。
能够对系统进行快照和恢复
systemd支持按需启动,因此系统的运行状态是动态变化的,人们无法准确地知道系统当前运行了哪些服务。systemd快照提供了一种将当前系统运行状态保存并恢复的能力。
比如系统当前正运行服务A和B,可以用systemd命令行对当前系统运行状况创建快照。然后将进程A停止,或者做其他的任意的对系统的改变,比如启动新的进程C。在这些改变之后,运行systemd的快照恢复命令,就可立即将系统恢复到快照时刻的状态,即只有服务A和B在运行。
一个可能的应用场景是调试:比如服务器出现一些异常,为了调试用户将当前状态保存为快照,然后可以进行任意的操作,比如停止服务等等。等调试结束,恢复快照即可。
systemctl的管理单位-unit
systemd管理的内容不仅有service,systemd管理的单位是unit,service只是unit的一种.
我们重点关注service和target这两种unit.
systemd开启和监督整个系统,是基于unit的概念。unit是由一个与配置文件对应的名字和类型组成的(例如:avahi.service unit有一个具有相同名字的配置文件,是守护进程Avahi的一个封装单元)。 unit有多重类型,如下表所示:
| 序号 | 后缀名 | 描述 |
|---|---|---|
| 1 | .service | 系统服务,封装守护进程的启动、停止、重启和重载操作,是最常见的一种 Unit 文件 |
| 2 | .automount | 用于控制自动挂载文件系统,相当于 SysV-init 的 autofs autofs服务 |
| 3 | .device | 内核识别的设备文件,对于 /dev 目录下的设备,主要用于定义设备之间的依赖关系 |
| 4 | .mount | 定义系统结构层次中的一个挂载点,可以替代过去的 /etc/fstab 配置文件 |
| 5 | .path | 在一个文件系统中的文件或目录。用于监控指定目录或文件的变化,并触发其它 Unit 运行 |
| 6 | .scope | 外部创建的进程。这种 Unit 文件不是用户创建的,而是 Systemd 运行时产生的,描述一些系统服务的分组信息 |
| 7 | .slice | 一组用于管理系统进程分层组织的units。用于表示一个 CGroup 的树,通常用户不会自己创建这样的 Unit 文件 |
| 8 | .snapshot | 用于表示一个由 systemctl snapshot 命令创建的 Systemd Units 运行状态快照 |
| 9 | .socket | 一个进程间通信的Socket。监控来自于系统或网络的数据消息,用于实现基于数据自动触发服务启动 |
| 10 | .swap | 定义swap设备或者swap文件。 |
| 11 | .target | 一组systemd units。用于对 Unit 文件进行逻辑分组,引导其它 Unit 的执行。它替代了 SysV-init 运行级别的作用,并提供更灵活的基于特定设备事件的启动方式 |
| 12 | .timer | systemd计时器。用于配置在特定时间触发的任务,替代了 Crontab 的功能 |
systemd unit存储路径
RHEL系列service服务文件存放在/usr/lib/systemd/system目录。Debian系列service服务文件存放在/lib/systemd/system/目录下,这个目录有系统自带的服务文件和安装的软件包提供的服务文件。管理员手工创建的单元文件(service文件)建议存放在/etc/systemd/system/目录下,这样可以避免系统升级时对服务文件所做的更改被覆盖。普通用户手工创建的单元文件(service文件)建议存放在/etc/lib/systemd/user/目录下
| 路径 | 描述 |
|---|---|
/usr/lib/systemd/system/ | 随安装的RPM产生的systemd units。 |
/run/systemd/system/ | 在运行时创建systemd units。 |
/etc/systemd/system/ | 由系统管理员创建和管理的systemd units。 |
查看systemd资源使用率
# 查看systemd资源使用率
systemd-cgtop

systemd配置文件
# 修改systemd配置文件
vim /etc/systemd/system.conf
# 修改完systemd配置文件后,需要重启systemd进程
# 重新执行systemd守护进程
systemctl daemon-reexec
loginctl—systemd登录控制管理器
systemd登录控制管理器
查看当前用户是否拥有执行systemd的权限
# 查看当前用户是否允许执行systemd
[cesu-c8 devops ~]$ loginctl
SESSION UID USER SEAT TTY
9 0 root
# 查看哪些用户可以执行systemd
[cesu-c8 devops ~]$ loginctl list-users
UID USER
0 root
1001 devops
2 users listed.
查看当前用户的systemd配置信息
# 查看当前用户的systemd配置信息
[cesu-c8 devops ~]$ loginctl show-user
查看用户的systemd的权限
# 查看devops用户的systemd权限
[cesu-c8 devops ~]$ loginctl user-status devops
devops (1001)
Since: Tue 2021-11-02 19:58:07 CST; 1h 37min ago
State: active
Sessions: *7
开启普通用户的systemd权限
如果普通用户没有systemd权限,需要执行这个命令开启systemd权限,否则普通用户做的systemd操作是不会生效的
# 开启用户的systemd权限
loginctl enable-linger
以普通用户执行systemd
# 创建普通用户的systemd目录来存放service文件
mkdir ~/.config/systemd/user -p
将service文件拷贝到普通用户的~/.config/systemd/user目录下
# 普通用户执行systemd重新加载systemd配置
systemctl --user daemon-reload
# 普通用户设置service文件开机自启
systemctl --user enable --now 服务名.service
systemctl调试debug
vim /etc/systemd/system.conf
配置debug
LogLevel=debug
https://developer.aliyun.com/article/875436
# 查看卡住的system服务
systemctl list-jobs

systemd是Linux系统的一种服务管理工具,提供按需启动能力,使用cgroup跟踪进程,管理挂载点和自动挂载,实现依赖关系管理,并与SysV初始化脚本兼容。它支持多种unit类型,如service、target等,能进行系统快照和恢复。此外,systemctl用于控制target,如multi-user.target(文本界面)和graphical.target(图形化界面),并可通过loginctl管理用户权限。systemd还能进行系统状态的快照和恢复,实现高效、灵活的系统管理。

1万+

被折叠的 条评论
为什么被折叠?



