目录
1:什么是systemd守护进程
2:Systemd参与的系统的初始化是怎么样的?
3:systemd的单元类型
4:具体的单元配置文件解析
systemd 是现代 Linux 系统中的一个系统和服务管理器,用于初始化系统、管理系统服务、维护系统状态、控制系统资源,并提供一系列其他功能来简化系统管理。
systemd 的主要作用和功能
-系统初始化:
systemd 是 Linux 系统的第一个进程(PID 1),负责在系统启动时初始化其他系统组件和服务。它取代了传统的 SysVinit 和 Upstart,成为大多数 Linux 发行版的标准初始化系统。
并行启动服务:
-与传统的串行启动方式不同,systemd 支持并行启动服务,显著缩短了系统启动时间。
它通过管理服务之间的依赖关系,确保必要的服务按正确的顺序启动。
服务管理:
-systemd 使用 systemctl 命令统一管理服务的启动、停止、重启和状态查询。它支持服务的自动重启、监控和日志记录。
-资源管理:
systemd 利用 Linux 内核的 cgroups(控制组)功能,限制和监控服务的资源使用,如 CPU、内存和 I/O。
-日志管理:
systemd 集成了 journald,用于统一收集和管理系统日志。它支持日志的持久化存储、过滤和查询。
-挂载点管理:
systemd 自动管理文件系统的挂载点,支持动态挂载点的自动挂载。
-目标(Target)管理:
systemd 使用目标(Target)替代传统的运行级别,灵活控制系统状态。
-按需启动(Socket 激活):
systemd 支持按需启动服务,仅在需要时激活相关服务,减少资源消耗。
加载配置文件:
Systemd 在启动时会加载 /etc/systemd/system/ 和 /usr/lib/systemd/system/ 目录中的单元文件。
这些文件定义了系统服务、挂载点、套接字等资源的配置。
挂载文件系统:
Systemd 会根据配置文件(如 /etc/fstab)和挂载单元文件(.mount)挂载文件系统。
特殊目标单元(如 local-fs.target 和 swap.target)用于管理本地文件系统和交换空间。
启动目标单元:
Systemd 会根据默认目标(如 graphical.target 或 multi-user.target)启动相关服务。
目标单元是多个单元的组合,用于定义系统启动时的状态。
服务启动:
Systemd 根据服务单元文件(.service)的配置启动服务。
服务之间的依赖关系通过 Requires=、Wants=、Before= 和 After= 等指令定义。
套接字激活:
对于基于套接字激活的服务,systemd 会监听指定的套接字,当有连接请求时,自动启动相关服务
在 systemd 中,单元(Unit)是系统和服务管理的基本对象。每种单元类型都有其特定的用途和配置文件格式。以下是一些常见的单元类型及其用途:
1. 服务单元(service)
服务单元是最常见的单元类型,用于管理后台服务(如 HTTPD、MySQL 等)。
用途:启动、停止、重启服务。
配置文件:*.service
示例:
[Unit]
Description=Apache HTTP Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/sbin/httpd -k start
ExecStop=/usr/sbin/httpd -k stop
User=apache
Group=apache
[Install]
WantedBy=multi-user.target
2. 套接字单元(socket)
套接字单元用于基于套接字激活的服务。它允许在有连接请求时自动启动服务。
用途:监听网络或 Unix 套接字,按需启动服务。
配置文件:*.socket
示例:
[Unit]
Description=Apache HTTPD Server Socket
After=network.target
[Socket]
ListenStream=80
Accept=no
Service=httpd.service
[Install]
WantedBy=sockets.target
3. 目标单元(target)
目标单元用于定义系统的运行级别或状态(如图形界面、多用户模式等)。
用途:定义系统的运行目标。
配置文件:*.target
示例:
[Unit]
Description=Multi-User Graphical Target
Wants=graphical.target
4. 挂载单元(mount)
挂载单元用于管理文件系统的挂载点。
用途:挂载文件系统。
配置文件:*.mount
示例:
[Unit]
Description=Mount NFS Share
After=network.target
[Mount]
What=192.168.1.100:/nfs/share
Where=/mnt/nfs
Type=nfs
Options=defaults,_netdev
[Install]
WantedBy=multi-user.target
5. 自动挂载单元(automount)
自动挂载单元用于定义自动挂载点,当访问挂载点时自动挂载文件系统。
用途:按需挂载文件系统。
配置文件:*.automount
示例:
[Unit]
Description=Automount NFS Share
After=network.target
[Mount]
What=192.168.1.100:/nfs/share
Where=/mnt/nfs
Type=nfs
Options=defaults,_netdev
[Automount]
Where=/mnt/nfs
TimeoutIdleSec=30
[Install]
WantedBy=multi-user.target
6. 设备单元(device)
设备单元用于管理硬件设备。
用途:管理硬件设备的初始化和状态。
配置文件:*.device
示例:
[Unit]
Description=USB Storage Device
7. 快照单元(snapshot)
快照单元用于创建和恢复系统的快照状态。
用途:管理系统的快照状态。
配置文件:*.snapshot
示例:
[Unit]
Description=System Snapshot
8. 路径单元(path)
路径单元用于监控文件系统路径的变化,并触发操作。
用途:监控文件系统路径的变化。
配置文件:*.path
示例:
[Unit]
Description=Watch for File Changes
[Path]
PathExists=/var/log/myapp.log
Unit=myapp.service
[Install]
WantedBy=multi-user.target
9. 交换单元(swap)
交换单元用于管理交换空间(如交换文件或交换分区)。
用途:管理交换空间。
配置文件:*.swap
示例:
[Unit]
Description=Swap File
Before=local-fs.target
[Swap]
What=/swapfile
Priority=10
[Install]
WantedBy=multi-user.target
10. 时间单元(timer)
时间单元用于定义定时任务,类似于传统的 cron 作业。
用途:定义定时任务。
配置文件:*.timer
示例:
[Unit]
Description=Run myapp every day
[Timer]
OnCalendar=daily
Unit=myapp.service
[Install]
WantedBy=timers.target
总结
systemd 提供了多种单元类型,每种单元类型都有其特定的用途和配置文件格式。通过合理使用这些单元类型,可以灵活地管理系统服务、设备、挂载点、定时任务等资源。
以下以httpd.Service为例来解析单元文件中的各个关键词作用
-unit部分定义了描述,和启动顺序,依赖关系等等
-service部分定义了服务的具体行为,包括启动,重启,停止以及重启策略,间隔时间
-install部分定义了安装的目标和依赖关系,
[Unit] 部分定义了单元的基本属性,包括描述、依赖关系和启动顺序等。
主要关键词及其作用
Description=
作用:提供单元的简短描述。
示例:Description=The Apache HTTP Server
Documentation=
作用:指定与单元相关的文档路径或链接。
示例:Documentation=man:httpd(8)
After=
作用:指定当前单元在哪些单元启动之后启动。
示例:After=network.target
解释:httpd.service 会在 network.target 启动之后启动。
Before=
作用:指定当前单元在哪些单元启动之前启动。
示例:Before=multi-user.target
解释:httpd.service 会在 multi-user.target 启动之前启动。
Requires=
作用:指定当前单元依赖的其他单元。如果这些单元失败,当前单元也会失败。
示例:Requires=network.target
Wants=
作用:指定当前单元希望启动的其他单元,但这些单元的失败不会影响当前单元。
示例:Wants=mysqld.service
Conflicts=
作用:指定当前单元与其他单元的冲突关系。如果冲突的单元正在运行,当前单元无法启动。
示例:Conflicts=apache2.service
Condition...=
作用:定义当前单元启动的条件。只有在满足这些条件时,单元才会启动。
示例:ConditionPathExists=/etc/httpd/conf/httpd.conf
[Service] 部分定义了服务的具体行为,包括启动、停止、重启等操作。
主要关键词及其作用
Type=
作用:定义服务的启动类型。
常见值:
simple:默认值,适用于前台运行的服务。
forking:适用于通过 fork() 创建子进程的服务。
oneshot:适用于只运行一次的命令。
notify:适用于支持 systemd 通知机制的服务。
示例:Type=forking
ExecStart=
作用:定义启动服务时执行的命令。
示例:ExecStart=/usr/sbin/httpd -k start
ExecStop=
作用:定义停止服务时执行的命令。
示例:ExecStop=/usr/sbin/httpd -k stop
ExecReload=
作用:定义重新加载服务配置时执行的命令。
示例:ExecReload=/usr/sbin/httpd -k graceful
Restart=
作用:定义服务失败时的重启策略。
常见值:
no:不自动重启。
on-failure:仅在服务失败时重启。
always:无论成功或失败,总是重启。
示例:Restart=on-failure
RestartSec=
作用:定义服务重启的间隔时间(单位为秒)。
示例:RestartSec=5
User= 和 Group=
作用:定义服务运行时的用户和组。
示例:User=apache
Group=apache
WorkingDirectory=
作用:定义服务的工作目录。
示例:WorkingDirectory=/var/www/html
PrivateTmp=
作用:是否为服务创建独立的临时目录。
示例:PrivateTmp=true
Limit...=
作用:定义服务的资源限制,如 CPU 时间、内存使用量等。
示例:LimitNOFILE=65536
PIDFile=
作用:定义服务的 PID 文件路径。
示例:PIDFile=/var/run/httpd.pid
[Install] 部分定义了单元的安装目标和依赖关系,通常用于控制单元的自动启动行为。
主要关键词及其作用
WantedBy=
作用:指定当前单元被哪些目标需要。当目标启动时,当前单元会自动启动。
示例:WantedBy=multi-user.target
解释:httpd.service 会在系统进入 multi-user.target 时自动启动。
RequiredBy=
作用:指定当前单元被哪些目标需要,且这些目标的启动依赖于当前单元。
示例:RequiredBy=multi-user.target
Alias=
作用:为单元文件提供别名。
示例:Alias=httpd
Also=
作用:指定与当前单元一起安装的其他单元。
示例:Also=httpd.socket
如果你看到了这里,说明你已经看懂了systemd守护进程是如何通过单元去控制和管理系统服务和资源的,你的实力更进了一步,距离你跨入云原生linux基础境中期巅峰,加油啊少年。(温馨提示:成为我的粉丝吧,给我点个赞,收藏个博客什么的)