赞
踩
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
来开启服务,提供基于守护进程
的按需启动
策略,支持快照
和系统状态恢复
,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有更高的并行性能
。
当sysvinit
系统初始化的时候,它会将所有可能用到的后台服务进程全部启动运行。并且系统必须等待所有的服务都启动就绪之后,才允许用户登录。这种做法有两个缺点:
某些服务很可能在很长一段时间内,甚至整个服务器运行期间都没有被使用过。比如CUPS,打印服务在多数服务器上很少被真正使用到。您可能没有想到,在很多服务器上SSHD也是很少被真正访问到的。花费在启动这些服务上的时间是不必要的;同样,花费在这些服务上的系统资源也是一种浪费。
systemd可以提供按需启动的能力,只有在某个服务被真正请求的时候才启动它。当该服务结束,systemd可以关闭它,等待下次需要时再次启动它
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维护一个“事务一致性”的概念,保证所有相关的服务都可以正常启动而不会 出现互相依赖,以至于死锁的情况。
和UpStart
一样,systemd
引入了新的配置方式,对应用程序的开发也有一些新的要求。如果systemd
想替代目前正在运行的初始化系统,就必须和现有程序兼容。任何一个Linux发行版都很难为了采用 systemd而在短时间内将所有的服务代码都修改一遍。systemd
提供了和sysvinit
以及LSB initscripts
兼容的特性。系统中已经存在的服务和进程无需修改。这 降低了系统向systemd迁移的成本,使得systemd替换现有初始化系统成为可能。
systemd
支持按需启动,因此系统的运行状态是动态变化的,人们无法准确地知道系统当前运行了哪些服务。systemd快照提供了一种将当前系统运行状态保存并恢复的能力。
比如系统当前正运行服务A
和B
,可以用systemd
命令行对当前系统运行状况创建快照
。然后将进程A停止,或者做其他的任意的对系统的改变,比如启动新的进程C。在这些改变之后,运行systemd
的快照恢复
命令,就可立即将系统恢复到快照时刻
的状态,即只有服务A
和B
在运行。
一个可能的应用场景
是调试
:比如服务器出现一些异常,为了调试用户将当前状态保存为快照,然后可以进行任意的操作,比如停止服务等等。等调试结束,恢复快照即可。
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 的功能 |
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-cgtop
# 修改systemd配置文件
vim /etc/systemd/system.conf
# 修改完systemd配置文件后,需要重启systemd进程
# 重新执行systemd守护进程
systemctl daemon-reexec
systemd
用目标(target)
替代了运行级别
的概念,提供了更大的灵活性,如您可以继承一个已有的目标, 并添加其他服务,来创建自己的目标。下表列举了systemd
下的目标(target)
和常见runlevel
的对应关系。
运行级别 | systemd目标(target) | 描述 |
---|---|---|
0 | runlevel0.target, poweroff.target | 关闭系统。 |
1, s, single | runlevel1.target,rescue.target | 单用户模式。 |
2, 4 | runlevel2.target, runlevel4.target,multi- user.target | 用户定义/域特定运行级别。默认等同于3。 |
3 | runlevel3.target,multi- user.target | 多用户,非图形化。用户可以通过多个控制台或网络登录。 |
5 | runlevel5.target, graphical.target | 多用户,图形化。通常为所有运行级别3的服务外加图形化登录。 |
6 | runlevel6.target,reboot.target | 重启系统。 |
emergency | emergency.target | 紧急Shell。 |
# 改变当前系统为救援模式
systemctl rescue
这条命令和“systemctl isolate rescue.target
”类似。命令执行后会在串口
有如下打印信息
:
> You are in rescue mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
> Give root password for maintenance
> (or press Control-D to continue):
# 改变当前系统为紧急模式
systemctl emergency
这条命令和“systemctl isolate emergency.target
”类似。命令执行后会在串口
有如下打印信息
:
> You are in emergency mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
> Give root password for maintenance
> (or press Control-D to continue):
用户需要重启系统
,才能从救援模式
或者紧急模式
进入正常模式
。
systemd
通过systemctl
命令可以对系统进行关机
、重启
、休眠
等一系列操作。当前仍兼容部分Linux常用管理命令
,对应关系如下表。建议用户使用systemctl
命令进行操作。
Linux常用管理命令 | systemctl命令 | 描述 |
---|---|---|
halt | systemctl halt | 关闭系统但不关闭电源 ) |
poweroff | systemctl poweroff | 关闭系统并关闭电源 |
reboot | systemctl reboot | 重启 |
执行上述命令会给当前所有的登录用户
发送一条提示消息。
# --no-wall 执行关机命令时,禁止systemd通知用户
systemctl --no-wall poweroff
待机
和休眠
# 使系统待机
systemctl suspend
# 使系统休眠
systemctl hibernate
# 使系统待机且处于休眠状态
systemctl hybrid-sleep
target
target
是一个box(盒子)
,装了很多service(服务)
,也可以理解为target
是一组service(服务)
.
tartget
是由服务组成的一类启动目标,systemd可以设置启动目标.
如果systemd指定了一个target
作为启动目标,那么下次启动的时候就会启动target
里面的所有服务
.
multi-user.target
–文本界面的Linux系统tty0
和 tty1
默认是图形界面
,临时切换文本界面
后,tty0
和tty1
变成文本界面了
# 改变当前系统的目标,重启不保存
# 临时切换到`文本界面`
systemctl isolate multi-user.target
# 需要等待几分钟
graphical.target
–图形化界面的Linux系统# 改变当前系统的目标,重启不保存
# 临时切换到`图形化界面`
systemctl isolate graphical.target
# 需要等待几分钟
下次启动时
加载文本界面还是图形界面# 查看默认启动的启动目标
# 查看`下次启动时`加载的默认Linux界面`target`
systemctl get-default
# 查看当前系统所有的启动目标
systemctl list-units --type=target
下次启动时
加载的默认target
# 改变系统默认的启动目标,重启保存
# 永久设置图形化界面启动
systemctl set-default graphical.target
# 永久设置文本界面启动
systemctl set-default multi-user.target
loginctl
—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配置信息
[cesu-c8 devops ~]$ loginctl show-user
# 查看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权限
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
https://developer.aliyun.com/article/875436
# 查看卡住的system服务
systemctl list-jobs
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。