寫在前面
為什么要回過頭來復習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/) |
功能范圍 | 廣泛(服務、設備、日志等) | 僅限服務啟動 |
復雜性 | 高 | 低 |