前言

Linux 传统上使用 init 进程启动系统,采用串行启动方式,导致启动时间长且脚本复杂。为解决这些问题,Systemd 应运而生,提供了一套完整的系统启动和管理解决,现在已成为大多数发行版的标准配置。由于其在Linux中十分常用,特此写一篇教程以方便自己在未来查阅。

1. Systemd 概述

Systemd 是一个守护进程,用于启动和管理系统的各项服务。它取代了 init 进程,成为系统的第一个进程(PID 为 1),其他进程都是它的子进程。

$ systemctl --version # 查看 Systemd 版本

2. 系统管理命令

  • systemctl :Systemd 的主命令
$ sudo systemctl reboot           # 重启系统
$ sudo systemctl poweroff         # 关闭系统
$ sudo systemctl halt             # 停止 CPU 工作
$ sudo systemctl suspend          # 暂停系统
$ sudo systemctl hibernate        # 系统进入冬眠
$ sudo systemctl hybrid-sleep     # 交互式休眠
$ sudo systemctl rescue           # 进入救援状态
  • systemd-analyze :查看启动耗时
$ systemd-analyze                 # 查看启动耗时
$ systemd-analyze blame           # 每个服务启动耗时
$ systemd-analyze critical-chain  # 瀑布状启动过程流
  • hostnamectl :查看和设置主机名
$ hostnamectl                     # 查看当前主机信息
$ sudo hostnamectl set-hostname rhel7  # 设置主机名
  • localectl :查看和设置本地化参数
$ localectl                       # 查看本地化设置
$ sudo localectl set-locale LANG=en_GB.utf8  # 设置本地化参数
  • timedatectl :查看和设置时区
$ timedatectl                     # 查看当前时区设置
$ sudo timedatectl set-timezone America/New_York  # 设置时区
  • loginctl :查看当前登录用户
$ loginctl list-sessions          # 列出当前 session
$ loginctl list-users             # 列出当前登录用户

3. Unit

3.1 Unit含义

Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。

Unit 一共分成12种。

  • Service unit:系统服务
  • Target unit:多个 Unit 构成的一个组
  • Device Unit:硬件设备
  • Mount Unit:文件系统的挂载点
  • Automount Unit:自动挂载点
  • Path Unit:文件或路径
  • Scope Unit:不是由 Systemd 启动的外部进程
  • Slice Unit:进程组
  • Snapshot Unit:Systemd 快照,可以切回某个快照
  • Socket Unit:进程间通信的 socket
  • Swap Unit:swap 文件
  • Timer Unit:定时器

3.2 用户级unit的启动方式

用户级unit不像系统级unit那样随系统启动,而是与用户的会话关联,只有在用户登录时才会启动。用户级unit通常挂载在default.target下,这与系统级unit通常挂载在multi-user.target或其他target上形成对比。

3.3 用户级unit的存储位置

用户自定义的unit文件可以放置在以下几个位置:

  1. /usr/lib/systemd/user:系统为用户提供的默认服务文件,优先级最低。
  2. ~/.local/share/systemd/user:用户级服务的一般存放位置。
  3. /etc/systemd/user:为所有用户提供服务的全局位置。
  4. ~/.config/systemd/user:用户个人配置的服务文件,优先级最高。

3.4 Unit 管理

Unit 是 Systemd 管理的基本单位,包括服务、挂载点、定时器等。

  • 查看 Unit
$ systemctl list-units            # 列出正在运行的 Unit
  • 查看 Unit 状态
$ systemctl status                # 查看系统状态
$ systemctl status nginx.service  # 查看 nginx 服务状态
  • 管理 Unit
$ sudo systemctl start nginx      # 启动 nginx 服务
$ sudo systemctl stop nginx       # 停止 nginx 服务
  $ sudo systemctl restart nginx    # 重启 nginx 服务
  • 查看 Unit 依赖
$ systemctl list-dependencies nginx.service  # 查看 nginx 依赖

3.5 Unit 配置文件

每个 Unit 都有配置文件,通常位于 /etc/systemd/system//usr/lib/systemd/system/

  • 查看和修改配置文件
$ systemctl cat nginx.service     # 查看配置文件内容
$ sudo systemctl daemon-reload    # 重新加载配置文件
$ sudo systemctl restart nginx    # 重新启动服务

配置文件包含多个区块(如 [Unit][Service]),定义了 Unit 的元数据和启动参数。

4. Target

Target 是一组 Unit,用于定义系统的运行级别。通过 target,可以方便地启动或切换系统状态。

  • 管理 Target
$ systemctl list-unit-files --type=target  # 列出所有 Target
$ sudo systemctl set-default multi-user.target  # 设置默认 Target

5. 日志管理

Systemd 统一管理所有 Unit 的日志,通过 journalctl 命令查看。

  • 查看日志
$ sudo journalctl                 # 查看所有日志
$ sudo journalctl -u nginx.service  # 查看 nginx 服务日志
$ sudo journalctl -b              # 查看本次启动日志
最后修改:2024 年 06 月 24 日
你的支持是我最大的动力