什么是Linux中的systemd?
写在前面
为什么要回过头来复习linux的system的,最近在研究DELL EMC的PowerStore存储系统,其底层是基于CoreOS开发的,这套操作系统是基于Systemd来设计的。所以要深入了解PowerStore就必须对systemd做详细了解。
systemd 是一个用于 Linux 系统的初始化系统(init system)和服务管理器,旨在取代传统的 System V init 系统。它不仅负责启动操作系统,还管理服务、日志、设备、挂载点等系统资源。systemd 由 Lennart Poettering 和 Kay Sievers 等人开发,自 2010 年左右开始被广泛采用,现已成为许多主流 Linux 发行版(如 RHEL、Ubuntu、Debian、Fedora、Arch Linux 等)的默认初始化系统。
以下是对 systemd 的详细解释,包括其概念、功能、组件以及在 Linux 生态中的作用。
1. systemd 的核心概念
定义
- 初始化系统:systemd 是 Linux 内核启动后运行的第一个用户空间进程(PID 1),负责初始化系统、启动服务并管理整个系统的运行。
- 服务管理器:它管理系统服务的启动、停止、重启、状态检查等操作。
- 系统管理工具:systemd 提供了一套工具,用于管理日志、设备、定时任务、网络配置等。
设计目标
- 并行化:加速系统启动,通过并行启动服务减少启动时间。
- 统一管理:为各种系统资源(如服务、设备、挂载点)提供一致的管理接口。
- 依赖管理:自动处理服务之间的依赖关系。
- 现代化:支持现代 Linux 特性,如 cgroups、namespace、容器化等。在PowerStore中大量使用docker。
- 日志集成:通过 systemd-journald 提供结构化的日志管理。所有PowerStore的日志管理都是通过journald来管理的,这个和以前的存储管理方式是不同的。
核心理念
- 单元(Units):systemd 将所有管理的资源抽象为“单元”,如服务(.service)、挂载点(.mount)、定时器(.timer)等。
- 声明式配置:通过配置文件(通常在 /etc/systemd/ 或 /lib/systemd/)定义单元的行为,而不是传统的 shell 脚本。
- 事件驱动:systemd 监控系统事件(如设备插入、服务启动),动态响应。
2. systemd 的主要功能
- 系统初始化:
- 启动内核后,systemd 作为 PID 1 接管系统,加载必要的服务、文件系统、网络等。
- 支持并行启动服务,优化启动速度。
- 示例:启动后加载 sshd.service、network.target 等。
- 服务管理:
- 管理服务的生命周期(启动、停止、重启、启用、禁用)。
- 使用 systemctl 命令控制服务。
- 示例:
systemctl start docker
systemctl enable sshd
systemctl status network
- 依赖管理:
- 自动解析服务之间的依赖关系(如 docker.service 依赖 network-online.target)。
- 通过 Wants、Requires、After 等关键字定义依赖。
- 日志管理:
- 通过 systemd-journald 收集和存储系统日志,存储在 /var/log/journal/(持久化)或 /run/log/journal/(内存)。
- 使用 journalctl 查询日志。
- 示例:
journalctl --unit docker
journalctl -p err
- 设备管理:
- 管理硬件设备(如 USB、磁盘)的挂载和卸载。
- 使用 .device 和 .mount 单元。
- 示例:
systemctl status dev-sda1.device
- 定时任务:
- 使用 .timer 单元替代传统的 cron,提供更灵活的定时任务管理。
- 示例:
systemctl list-timers
- 资源控制:
- 利用 cgroups 限制服务的 CPU、内存、IO 等资源。
- 示例:
systemctl set-property docker.service MemoryLimit=2G
- 网络管理:
- 通过 systemd-networkd 和 systemd-resolved 管理网络配置和 DNS 解析。
- 示例:
networkctl status
- 容器和虚拟化支持:
- 通过 systemd-nspawn 提供轻量级容器管理。
- 支持与 Docker、Podman 等容器技术集成。
3. systemd 的核心组件
systemd 不仅仅是一个单一的程序,而是一套工具和守护进程的集合。主要组件包括:
- systemd(主进程):
- 作为 PID 1 运行,负责初始化和管理单元。
- 解析 /etc/systemd/system/ 和 /lib/systemd/system/ 中的单元文件。
- systemctl:
- 用户命令行工具,用于管理服务、单元和系统状态。
- 示例:
systemctl restart sshd
systemctl list-units
- journald:
- 日志管理守护进程,收集系统和服务的日志。
- 存储结构化日志,支持通过 journalctl 查询。
- 示例:
journalctl -f
- logind:
- 管理用户登录会话,处理多用户、多座位环境。
- 示例:
loginctl list-sessions
- networkd:
- 管理网络接口和配置。
- 示例:
networkctl list
- resolved:
- 提供 DNS 解析服务。
- 示例:
resolvectl status
- timedated:
- 管理系统时间和时区。
- 示例:
timedatectl set-timezone Asia/Shanghai
- udevd:
- 管理设备事件(如插入 USB 设备)。
- 示例:
udevadm monitor
4. systemd 的单元类型
systemd 管理的所有资源都被抽象为“单元”(Units),每种单元有特定的文件后缀。常见单元类型包括:
单元类型 | 后缀 | 用途 |
Service | .service | 管理服务(如 sshd、docker) |
Target | .target | 定义一组单元的集合(如 multi-user.target) |
Mount | .mount | 管理文件系统挂载点 |
Device | .device | 管理硬件设备 |
Socket | .socket | 管理套接字(如网络连接) |
Timer | .timer | 管理定时任务 |
Path | .path | 基于文件系统路径的触发器 |
Slice | .slice | 资源控制分组(基于 cgroups) |
5. systemd 在 Linux 生态中的地位
普及程度
- 主流发行版:RHEL(7+)、CentOS(7+)、Ubuntu(16.04+)、Debian(8+)、Fedora、Arch Linux 等默认使用 systemd。
- 非 systemd 发行版:一些发行版(如 Alpine Linux、Devuan、Void Linux)选择不使用 systemd,而是使用其他初始化系统(如 OpenRC、runit)。
优势
- 性能:并行启动和依赖管理显著提高启动速度。
- 一致性:为服务、设备、日志等提供统一的接口。
- 现代化:支持 cgroups、容器、复杂依赖关系。
- 生态整合:与 journald、networkd 等组件无缝集成。
争议
- 复杂性:systemd 功能庞大,被批评为“过于复杂”,违背 Unix 哲学(单一职责)。
- 兼容性:替换传统工具(如 cron、inetd),可能导致脚本不兼容。
- 依赖性:许多软件开始依赖 systemd,限制了非 systemd 系统的选择。
与传统 init 系统的对比
特性 | systemd | System V Init |
启动方式 | 并行启动 | 串行启动 |
依赖管理 | 自动解析 | 手动配置(脚本顺序) |
日志管理 | 集成 journald | 依赖 syslog(rsyslog 等) |
配置方式 | 声明式(单元文件) | 脚本式(/etc/init.d/) |
功能范围 | 广泛(服务、设备、日志等) | 仅限服务启动 |
复杂性 | 高 | 低 |