关于 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

目录
相关文章
|
算法 开发者
【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义
【Makefile 相关 】Makefile中patsubst(扩展通配符)的含义
604 0
|
Web App开发 网络协议 缓存
DNS简明教程
在我看来,DNS(域名系统)是互联网的核心。我始终认为,控制了DNS就等于控制了网络世界。下面我们就来深入了解DNS。
699 83
DNS简明教程
|
Python API 监控
将Python CLI工具发布为pip模块的完整指南
注册PyPI账户 访问PyPI官网注册账户 推荐使用双因素认证增强安全性 生成API令牌 访问PyPI账户管理 生成具有"Upload packages"权限的令牌,妥善保存 确保模块名唯一性 在PyPI搜索页面验证模块名未被使用 建议使用小写字母和连字符的组合(如my-cli-tool)
361 9
|
传感器 网络协议 Linux
DPDK如何赋能EtherCAT
DPDK如何赋能EtherCAT
|
JavaScript Docker Python
下个时代的开发工具-Nix:声明式的运行环境构建器、简单场景下的docker替身
Nix 是一个独特的包管理工具和构建系统,采用声明式方法管理软件包和运行环境。它通过精确控制依赖关系和环境配置,确保软件的可重复性、隔离性和可追溯性。Nix 支持多语言开发环境,提供声明式配置、环境隔离、回滚与版本控制等核心功能,适用于复杂开发场景,有效解决依赖冲突和环境不一致问题。
2141 5
|
存储 缓存 Linux
Ramfs、rootfs和initramfs【ChatGPT】
Ramfs、rootfs和initramfs【ChatGPT】
1007 2
|
机器学习/深度学习 算法 数据建模
【机器学习】类别不平衡数据的处理
【机器学习】类别不平衡数据的处理
|
监控 算法 Linux
探索Linux中的lz4命令:高效的数据压缩工具
**探索Linux中的LZ4工具:快速数据压缩。LZ4算法提供高速压缩与解压缩,适合实时数据处理。命令行工具如`lz4c`用于文件压缩(`lz4c file.txt compressed.lz4`)和解压缩(`lz4c -d compressed.lz4 decompressed.txt`)。特点是速度快、低内存占用,可选压缩级别。注意命令的实际形式取决于安装的实现,使用前应查阅文档。**
|
缓存 网络协议 前端开发
CDN最佳实践之访问慢的分析思路和优化方案
使用CDN加速以后还是存在访问慢的情况,如何去分析定位问题、优化网站速度、解决用户问题是一个十分重要的课题。本文介绍了CDN加速访问慢的分析思路,通过归纳的一些原因结合搜集的信息去进一步判断定位问题,帮助用户在遇到问题时有一个更清晰的思考方法论。同时介绍了一些典型的问题场景,结合这些问题场景可以更快速的去发现问题并优化。
3084 1
CDN最佳实践之访问慢的分析思路和优化方案
|
网络协议 Docker 容器
Docker——如何修改运行中容器的映射端口
Docker——如何修改运行中容器的映射端口
861 0