关于 Systemd

本文翻译自我的英文博客,最新修订内容可随时参考:关于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timerring

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值