关于 Systemd

简介: Linux 系统使用 init 管理启动进程的历史已久(例如通过 sudo /etc/init.d/apache2 start 或 service apache2 start 启动服务),但传统 init 采用串行启动方式,效率较低。为解决这一问题, systemd 应运而生(名称中的d是 daemon 的缩写,表明其守护进程管理器的定位)。如今,systemd 已取代 initd,成为主流 Linux 发行版的默认主进程(PID 1)。

本文翻译自我的英文博客,最新修订内容可随时参考:关于Systemd

Linux 系统使用 init 管理启动进程的历史已久(例如通过 sudo /etc/init.d/apache2 startservice apache2 start 启动服务),但传统 init 采用串行启动方式,效率较低。为解决这一问题,systemd 应运而生(名称中的 ddaemon 的缩写,表明其守护进程管理器的定位)。如今,systemd 已取代 initd,成为主流 Linux 发行版的默认主进程(PID 1)。

一、核心组件与基本命令

1. systemctl:系统控制核心工具

sudo systemctl reboot       # 重启系统  
sudo systemctl poweroff     # 关机  
sudo systemctl suspend      # 挂起(睡眠)

2. 系统信息查询

  • hostnamectl:查看主机信息(架构、硬件、内核、操作系统等)
    hostnamectl  
    # 等价于 uname -a
    
  • timedatectl:管理时区设置
    timedatectl set-timezone Asia/Shanghai  # 设置时区为上海
    
  • loginctl:管理用户会话
    loginctl list-sessions  # 列出所有登录会话  
    loginctl list-users     # 列出所有用户
    

二、Unit(单元):systemd 的管理核心

systemd 通过 Unit 管理系统资源,共有 12 种单元类型,常见类型包括:

  • Service Unit:服务单元(如 httpd.service
  • Target Unit:目标单元(用于分组管理,如 multi-user.target
  • Socket Unit:套接字单元(如 ssh.socket
  • Timer Unit:定时器单元(类似 cron 任务)

1. 单元状态管理

systemctl status bluetooth.service  # 查看服务状态  
systemctl start/stop/restart httpd.service  # 启停/重启服务  
systemctl enable/disable httpd.service  # 设置开机自启/禁用  
systemctl reload httpd.service  # 重新加载服务配置(不重启进程)

2. 单元配置文件

  • 存储路径
    • 系统默认配置:/usr/lib/systemd/system/
    • 用户自定义配置:/etc/systemd/system/(优先级高于系统默认)
  • 符号链接机制
    systemctl enable clamd@scan.service  # 启用服务时创建符号链接  
    # 等价于手动创建链接  
    sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
    
  • 单元状态
    • enabled:已启用(开机自启)
    • disabled:已禁用
    • static:静态单元(仅作为依赖,不能直接启动)
    • masked:被屏蔽(禁止启动)

3. 自定义单元配置

修改单元文件后需重新加载配置:

systemctl daemon-reload  # 重新加载 systemd 配置  
systemctl restart httpd.service  # 重启服务使配置生效

三、Target(目标):单元分组管理

Target 本质是一组单元的集合,用于实现特定系统状态(如多用户模式、图形界面模式)。常见 Target 包括:

  • default.target:默认目标(通常指向 graphical.targetmulti-user.target
  • multi-user.target:多用户文本模式(无图形界面)
  • graphical.target:图形界面模式
  • rescue.target:救援模式(单用户修复环境)

切换 Target

sudo systemctl isolate multi-user.target  # 切换至多用户模式  
sudo systemctl reboot --target=rescue.target  # 重启并进入救援模式

四、日志管理:journalctl

systemd 通过 journalctl 统一管理系统日志(包括内核日志和服务日志),日志配置文件为 /etc/systemd/journald.conf

常用命令

journalctl -k                      # 查看内核日志  
journalctl --since "2023-10-01"    # 查看从指定日期开始的日志  
journalctl -f                      # 实时追踪日志(类似 tail -f)  
journalctl _PID=1                  # 查看 PID 为 1 的进程(systemd 自身)日志  
journalctl -u httpd.service        # 查看指定服务的日志

五、systemd 与传统 init 的关键区别

特性 systemd 传统 init(如 SysVinit)
启动方式 并行启动多个服务,提升启动速度 串行启动,效率较低
进程管理 基于 PID 1 统一管理所有进程 依赖 init 进程逐个管理
单元类型 支持服务、套接字、定时器等 12 种单元 仅支持服务和运行级别(runlevel)
日志系统 集成 journalctl,统一日志管理 依赖第三方工具(如 syslog
配置文件 使用 .service 等标准化文件格式 脚本存放在 /etc/init.d/ 目录

六、最佳实践建议

  1. 服务管理最佳实践

    • 优先使用 systemctl enable/disable 管理开机自启,避免手动修改符号链接。
    • 自定义服务配置时,将文件放置于 /etc/systemd/system/ 目录,避免覆盖系统默认文件。
  2. 日志分析技巧

    • 结合 journalctlsystemctl status 定位服务故障(如 systemctl status httpd.service 查看状态,journalctl -u httpd.service 查看详细日志)。
    • 使用过滤条件快速定位问题:
      journalctl "MESSAGE=error" --since today  # 查看今日包含"error"的日志
      
  3. 性能优化

    • 通过 systemd-analyze 分析启动耗时:
      systemd-analyze blame  # 按耗时排序启动单元  
      systemd-analyze critical-chain  # 查看启动依赖链
      

总结

systemd 通过单元化管理、并行启动和统一日志系统,彻底改变了 Linux 系统的初始化方式。掌握 systemctljournalctl 等核心工具及单元配置方法,是高效管理 Linux 系统的关键。如需深入学习 systemd 定时器(Timer Unit)或自定义服务开发,欢迎访问博客获取更多资源:关于Systemd

目录
相关文章
|
Web App开发 网络协议 缓存
DNS简明教程
在我看来,DNS(域名系统)是互联网的核心。我始终认为,控制了DNS就等于控制了网络世界。下面我们就来深入了解DNS。
791 83
DNS简明教程
|
算法 开发者
【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义
【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义
640 0
|
Python API 监控
将Python CLI工具发布为pip模块的完整指南
注册PyPI账户 访问PyPI官网注册账户 推荐使用双因素认证增强安全性 生成API令牌 访问PyPI账户管理 生成具有"Upload packages"权限的令牌,妥善保存 确保模块名唯一性 在PyPI搜索页面验证模块名未被使用 建议使用小写字母和连字符的组合(如my-cli-tool)
384 9
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
1479 2
|
存储 缓存 Linux
Ramfs、rootfs和initramfs【ChatGPT】
Ramfs、rootfs和initramfs【ChatGPT】
1078 2
|
传感器 网络协议 Linux
DPDK如何赋能EtherCAT
DPDK如何赋能EtherCAT
|
机器学习/深度学习 算法 数据建模
【机器学习】类别不平衡数据的处理
【机器学习】类别不平衡数据的处理
|
Java Apache 项目管理
走进ASF系列 - 初识ASF组织架构及治理
# 费曼技巧(The Feynman Technique) 费曼技巧是一种 “以教为学” 的学习方式,源于诺贝尔物理奖获得者,理查德·费曼(Richard Feynman)。这个学习方法的秘诀是尝试用最简单的语言说清楚你要表达的内容,哪怕是一个深奥的科学理论,你也能用简单的表达方式让5岁的孩子或者60岁的老人很容易的理解和熟记。由于我也是在上周(2020.04.03)刚刚收到的成为ASF Mem
1586 0

热门文章

最新文章