# Systemd 基本控制命令 ## 1.systemctl systemctl 可用于 检查和控制 systemd(1) 系统与服务管理器的状态: ```bash systemctl [OPTIONS...] COMMAND [UNIT...] ``` 常用 Options 如下: | Options | Description | |---------------------------------|-------------| | --system | Connect to system manager | | --user | Connect to user service manager | 常用 Command 如下: | Command | Description | |---------------------------------|-------------| | start PATTERN… | 启动(activate)指定的已加载单元 (无法启动未加载的单元) | | stop PATTERN… | 停止(deactivate) 指定的单元 | | reload PATTERN… | 要求指定的单元重新加载它们的配置 | | restart PATTERN… | 重新启动(先停止再启动)指定的单元。 若指定的单元尚未启动,则启动它们 | | kill PATTERN… | 向指定单元的 --kill-who= 进程发送 --signal= 信号 | | status [PATTERN…|PID…] | 如果指定了单元, 那么显示指定单元的运行时状态信息,以及这些单元最近的日志数据。 如果指定了PID,那么显示指定PID所属单元的运行时状态信息,以及这些单元最近的日志数据。 如果未指定任何单元或PID,那么显示整个系统的状态信息 | | reset-failed [PATTERN…] | 重置指定单元的失败(failed)状态 | | enable UNIT…, enable PATH… | 启用指定的单元或单元实例(多数时候相当于将这些单元设为"开机时自动启动"或"插入某个硬件时自动启动") | | disable UNIT… | 停用指定的单元或单元实例(多数时候相当于撤销这些单元的"开机时自动启动"以及"插入某个硬件时自动启动") | | reenable UNIT… | 重新启用指定的单元或单元实例 | | show-environment | 显示所有 systemd 环境变量及其值 | | set-environment VARIABLE=VALUE… | 设置指定的 systemd 环境变量 | | unset-environment VARIABLE… | 撤消指定的 systemd 环境变量 | | import-environment [VARIABLE…] | 导入 指定的客户端 环境变量 | | daemon-reload | 重新加载 systemd 守护进程的配置 | ## 2.systemd-cgls systemd-cgls 以树的形式递归显示 指定的 Linux control group 内容的层次结构。 如果指定了 [CGROUP...] 参数, 那么仅递归的显示指定的控制组(cgroup)及其子控制组内的进程。 [CGROUP...] 参数可以指定为 完整的文件路径,也可以指定为 systemd 控制组层次的名称。 如果未指定 [CGROUP...] 参数, 并且当前的工作目录位于 /sys/fs/cgroup 之中, 那么将显示当前目录所对应的控制组中的内容, 否则,显示完整的 systemd 控制组层次结构: ```bash systemd-cgls [OPTIONS...] [CGROUP...] systemd-cgls [OPTIONS...] --unit|--user-unit [UNIT...] ``` 默认不显示内容为空的控制组。能够识别的命令行选项如下: | Options | Description | |-------------------------------|-------------| | --all | 不隐藏 内容为空的控制组 | | -l, --full | 在显示进程树时不对超长行进行截断 | | -u, --unit | 为指定的单元显示 cgroup 子树 | | --user-unit | 为指定的用户单元显示 cgroup 子树 | | -k | 在输出中包括内核线程 | | -M MACHINE, --machine=MACHINE | 仅显示对应于 MACHINE 容器的控制组 | | -h, --help | 显示简短的帮助信息并退出 | | --version | 显示简短的版本信息并退出 | | --no-pager | 不将程序的输出内容管道(pipe)给分页程序 | ## 3.systemd-analyze 分析与调试 systemd 系统管理器: ```bash # 可以显示系统启动过程中的性能统计数据、 获取 systemd 系统管理器的状态与跟踪信息、校验单元文件的正确性。 systemd-analyze [OPTIONS...] [time] # 按照每个单元花费的启动时间从多到少的顺序,列出所有当前正处于活动(active)状态的单元。 # 这些信息有助于用户优化系统启动速度。 systemd-analyze [OPTIONS...] blame # 为指定的单元(省略参数表示默认启动目标单元)以树状形式显示时间关键链(time-critical chain)。 # "@"后面的时刻表示该单元的启动时刻; "+"后面的时长表示该单元总计花了多长时间才完成启动。 # 不过需要注意的是, 这些信息也可能具有误导性, 因为花费较长时间启动的单元, 有可能只是在 等待另一个依赖单元完成启动。 systemd-analyze [OPTIONS...] critical-chain [UNIT...] # 输出一个 SVG 图像,详细显示每个单元的启动时刻, 并高亮显示每个单元总计花了多长时间才完成启动。 systemd-analyze [OPTIONS...] plot [> file.svg] # 按照 GraphViz dot(1) 格式输出单元间的依赖关系图。 # 在实践中,通常使用 systemd-analyze dot | dot -Tsvg > systemd.svg 命令来最终生成描述单元间依赖关系的 SVG 图像。 # 除非使用了 --order 或 --require 选项限定仅显示特定类型的依赖关系, 否则将会显示所有的依赖关系。 # 如果指定了至少一个 PATTERN 参数(例如 *.target 这样的 shell 匹配模式), 那么将会仅显示所有匹配这些模式的单元的直接依赖关系。 systemd-analyze [OPTIONS...] dot [PATTERN...] [> file.dot] # 按照人类易读的格式输出全部单元的状态(一般都有几千数万行)。 # 因为它的输出格式经常在未通知的情况下发生变化, 所以切勿将此输出用于程序分析。 systemd-analyze [OPTIONS...] dump # 类似于 systemctl cat ,但用于显示配置文件。 # 此命令将会把配置文件与配置片段的内容显示在标准输出上, 并且遵守 systemd 配置目录与配置文件的优先级规则。 # 参数要么是 绝对路径(例如 /etc/systemd/logind.conf 或 /usr/lib/systemd/logind.conf)、 要么是相对于前缀的相对路径(例如 systemd/logind.conf)。 systemd-analyze [OPTIONS...] cat-config NAME|PATH... # 列出与单元相关的全部目录, 包括:单元文件目录、配置片段目录(.d)、 依赖关系目录(.wants 与 .requires)。 # 与 --user 一起使用时表示针对 systemd 用户实例。 # 与 --global 一起使用时表示针对 systemd 用户实例的全局配置。 # 注意,此命令输出的列表仅为编译在 systemd-analyze 中的路径, 它实际上并不与运行中的 systemd 进程通信。 systemd-analyze [OPTIONS...] unit-paths # 打印出 systemd 守护进程当前的日志等级。 # 如果提供了可选的 LEVEL 参数, 那么表示将 systemd 守护进程的日志等级更改为 LEVEL (可使用的值参见 --log-level= 选项(参见 systemd(1)))。 systemd-analyze [OPTIONS...] log-level [LEVEL] # 打印出 systemd 守护进程当前的日志目标。 # 如果提供了可选的 TARGET 参数,那么表示将 systemd 守护进程的日志目标更改为 TARGET (可使用的值参见 --log-target= 选项(参见 systemd(1)))。 systemd-analyze [OPTIONS...] log-target [TARGET] # 如果指定了至少一个 SET 参数,那么仅显示指定的集合所包含的系统调用列表;否则显示全部系统调用集合的详情。 # 注意,必须在 SET 参数中包含 "@" 前缀。 systemd-analyze [OPTIONS...] syscall-filter [SET…] # 校验指定的单元文件以及被指定的单元文件引用的其他单元文件的正确性,并显示发现的错误。 # FILES 参数可以是单元文件的精确路径(带有上级目录),也可以仅仅是单元文件的名称(没有目录前缀)。 # 对于那些仅给出了文件名(没有目录前缀)的单元,将会优先在其他已经给出精确路径的单元文件的所在目录中搜索,如果没有找到,将会继续在常规的单元目录中搜索(详见 systemd.unit(5) 手册)。 # 可以使用 $SYSTEMD_UNIT_PATH 环境变量来更改默认的单元搜索目录。 systemd-analyze [OPTIONS...] verify [FILES...] # 解析并标准化"日历事件",计算出下一个过期时间。 # 接受的参数与 OnCalendar= 选项(参见 systemd.timer(5) 手册)相同,表达式语法遵守 systemd.time(7) 规范。 systemd-analyze [OPTIONS...] calendar SPECS... # 显示 systemd 守护进程的服务单元运行时看门狗的当前状态。 # 如果提供了可选的布尔值参数,那么表示全局启用或禁用服务单元运行时看门狗(WatchdogSec=)与紧急操作(例如 OnFailure= 或 StartLimitAction=)。 # 参见 systemd.service(5) 手册。 # 注意,硬件看门狗不受该命令的影响。 systemd-analyze [OPTIONS...] service-watchdogs [BOOL] # 解析一个"时长",并以微秒为单位输出规格化后的等效值。 # 接受的参数表达式语法遵守 systemd.time(7) 规范。有单位的值将被解析为秒。 systemd-analyze [OPTIONS...] timespan SPAN... # 分析一个或多个指定服务单元的安全性和沙箱设置。 # 如果指定了至少一个单元名称,那么将检查指定服务单元的安全设置并显示详细分析。 # 如果未指定单元名称,那么将检查所有当前已加载的长时间运行的服务单元,并显示一个简洁的结果表格。 # 该命令检查各种安全相关的设置,根据每个设置的重要性分配一个"暴露级别"数值。 # 然后,为整个单元计算出一个总体暴露级别数值,这是一个 0.0…10.0 之间的估计值,表示该服务的暴露程度。 # 数值越大表示沙箱应用的越少(安全性越低)、数值越小表示沙箱应用的越多(安全性越高)。 # 注意,该命令只分析 systemd 本身实现的针对每个服务的安全特性,并不会考虑服务代码本身应用的任何附加安全机制。 # 不要误解这种方式计算的"暴露级别": 高"暴露级别"既不意味着服务代码本身没有有效的沙箱机制,也不意味着服务实际上易受远程或本地攻击的影响。 # 但是,高"暴露级别"的服务确实有可能需要加强额外的安全与沙箱限制。 # 注意,许多单独的安全和沙箱设置是可以规避绕过的(除非与其他结合使用)。 # 例如,如果服务保留了创建或撤消挂载点的特权, 那么许多沙箱选项就可以由服务代码本身取消。 # 所以,每个服务应该尽可能使用最全面和最严格的沙箱与安全设置。 # 该工具会考虑某些设置组合之间的关系,但不是全部。 # 还要注意,这里分析的安全性和沙箱设置仅适用于服务代码本身执行的操作。 # 如果一个服务可以访问IPC系统(例如 D-Bus),那么它可能会请求其他不受相同限制的服务进行操作。 # 如果没有验证IPC访问策略,那么任何全面的安全性和沙箱分析都是不完整的。 # 如果没指定任何命令,那么等价于使用 systemd-analyze time 命令。 systemd-analyze [OPTIONS...] security UNIT... ``` ## 4.配置 journal 的配置在 /etc/systemd/journald.conf 中,主要配置项如下: ```ini # /etc/systemd/journald.conf # Storage: 在哪里存储日志文件: "volatile" 表示仅保存在内存中, 也就是仅保存在 /run/log/journal 目录中(将会被自动按需创建)。 "persistent" 表示优先保存在磁盘上, 也就优先保存在 /var/log/journal 目录中(将会被自动按需创建), 但若失败(例如在系统启动早期"/var"尚未挂载), 则转而保存在 /run/log/journal 目录中(将会被自动按需创建)。 "auto"(默认值) 与 "persistent" 类似, 但不自动创建 /var/log/journal 目录, 因此可以根据该目录的存在与否决定日志的保存位置。 "none" 表示不保存任何日志(直接丢弃所有收集到的日志), 但日志转发(见下文)不受影响。 默认值是 "auto" Storage=auto ``` system 和 user 的配置在 /etc/systemd/system.conf 和 /etc/systemd/user.conf 中,主要配置项如下: ```ini # /etc/systemd/system.conf # /etc/systemd/user.conf # LogLevel: Set log level. As argument this accepts a numerical log level or the well-known syslog(3) symbolic names (lowercase): emerg, alert, crit, err, warning, notice, info, debug. LogLevel=info # LogTarget: Set log target. Argument must be one of console, journal, kmsg, journal-or-kmsg, null. LogTarget=journal-or-kmsg ```