博主头像
mxd's Blog

"The quieter you become,the more you are able to hear."

Linux 初始化系统 Systemd 用法与工作原理详解

Linux 初始化系统:Systemd 用法与工作原理详解

一、Systemd 工作原理

(一)核心概念

Systemd 是 Linux 系统中的初始化系统,它用 “单元”(unit)来管理各种系统资源和服务。比如,service unit 管理服务,target unit 表示系统的不同状态,还有 mount unit 管理挂载点等。这些单元之间有明确的依赖关系,Systemd 会根据这些关系来决定服务的启动顺序。

Systemd 还能并行启动服务,只要服务之间没有依赖关系,它就会同时启动它们,这样就能大大加快系统的启动速度。它还支持 socket 激活机制,简单来说,就是系统在后台监听网络连接或其他信号,当有请求时才启动相应的服务,这样就能节省系统资源。

Systemd 自己有一套日志管理系统,叫 journald,它把日志以二进制格式存储起来,查询起来很方便。而且,Systemd 还会监控服务进程,如果服务崩溃了,它会根据设置自动重启,保证系统的稳定运行。

(二)服务类型(Type)详解

Systemd 有几种不同类型的服务启动方式,比如:

  • simple:这是默认类型,服务启动后就直接运行。
  • forking:服务会先创建一个子进程,然后父进程退出,Systemd 通过 PIDFile 来跟踪子进程。
  • oneshot:这种类型的服务只运行一次,运行完成后就退出了。如果想让服务在退出后还保留状态,需要设置 RemainAfterExit=yes
  • notify:服务启动后会通过 sd_notify 发送一个就绪信号给 Systemd,Systemd 收到信号后才认为服务已经启动完成。

(三)目标(Target)

target 是 Systemd 的逻辑分组单位,用来定义系统的不同运行状态,有点像传统运行级别。比如:

  • multi-user.target:多用户命令行模式,没有图形界面。
  • graphical.target:图形界面模式。
  • rescue.target:单用户救援模式,用于系统修复。
  • timers.target:和定时任务相关的。

如果想让某个服务在进入某个目标时自动启动,可以在服务的配置文件的 [Install] 部分设置 WantedBy=multi-user.target

二、Systemd 的使用

(一)服务管理

操作服务挺简单的,比如:

  • 启动服务:systemctl start nginx
  • 停止服务:systemctl stop nginx
  • 重启服务:systemctl restart nginx
  • 设置开机自启:systemctl enable nginx
  • 取消开机自启:systemctl disable nginx
  • 查看服务状态:systemctl status nginx
  • 列出所有运行的服务:systemctl list-units --type=service

(二)配置文件

Systemd 的配置文件通常放在 /etc/systemd/system/ 目录下,文件后缀是 .service。比如,一个 NGINX 服务的配置文件可能长这样:

[Unit]
Description=NGINX Web Server
After=network.target

[Service]
ExecStart=/usr/sbin/nginx -g "daemon off;"
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

如果修改了配置文件,需要重新加载配置:systemctl daemon-reload,然后重启服务:systemctl restart nginx

三、Linux 常见初始化系统对比

(一)SysVinit

SysVinit 是 Linux 系统中最传统的初始化系统,历史悠久,最早源于 System V 系列 UNIX。它通过 /etc/inittab 文件和 /etc/rc.d/init.d/ 目录下的脚本来管理服务。

它的特点是配置简单,用简单的脚本文件就能搞定。但它有个缺点,就是服务是按顺序启动的,速度比较慢,尤其是处理复杂的服务依赖关系时。

而且,SysVinit 的日志管理比较弱,通常要依赖 syslog 或其他外部日志工具。

(二)Upstart

Upstart 是 Ubuntu 和 RHEL 曾经采用的初始化系统,它是为了弥补 SysVinit 的一些不足而诞生的。它引入了事件驱动的启动机制,服务可以根据事件来启动,速度比 SysVinit 快一些。

它的配置文件通常放在 /etc/init/ 目录下,格式是 INI 风格的。Upstart 也兼容 SysVinit 的脚本,所以从 SysVinit 过渡到 Upstart 比较方便。

(三)Systemd

Systemd 是一个比较新的初始化系统,由 Lennart Poettering 在 2010 年开发的。它现在被广泛应用于现代 Linux 发行版,因为它有很多优点。

Systemd 的启动速度很快,因为它支持并行启动服务。它还能自动处理服务的依赖关系,管理员不用手动配置。它用 systemctl 命令统一管理服务、挂载点、目标等,很方便。

Systemd 自己有一套强大的日志系统,叫 journald,它把日志以二进制格式存储起来,查询起来很方便。而且,Systemd 还能通过 cgroups 精细控制服务的 CPU、内存等资源使用。

(四)对比总结

特性SysVinitUpstartSystemd
启动速度串行启动,较慢事件驱动,较快并行启动,最快
配置文件/etc/inittab 和脚本/etc/init/ 下的 INI 文件/etc/systemd/system/ 下的 .service 文件
日志管理依赖 syslog 等外部工具依赖 syslog 等外部工具内置 journald
依赖关系管理手动配置事件驱动的依赖管理自动处理依赖关系
资源控制支持 cgroups
兼容性传统系统,兼容性好兼容 SysVinit 脚本兼容 SysVinit 脚本
复杂性简单中等复杂,学习曲线陡峭

四、Systemd 的优缺点

(一)优点

Systemd 的优点很明显。它的启动速度很快,因为支持并行启动服务。它还能自动处理服务的依赖关系,管理员不用手动配置,很方便。它的日志系统很强大,查询起来很方便。而且,它还能通过 cgroups 精细控制服务的资源使用,提高了系统的可管理性。

(二)缺点

Systemd 也有一些缺点。它的配置文件和功能比较复杂,学习曲线比较陡峭,新手可能需要花点时间来掌握。而且,尽管它兼容 SysVinit 的脚本,但在某些情况下可能会出现兼容性问题,特别是在一些老旧的系统或软件中。另外,Systemd 本身占用的系统资源相对较多,可能会对资源受限的系统产生一定影响。

Linux 初始化系统 Systemd 用法与工作原理详解
https://blog.mxdyeah.top/mxdyeah_blog_post/systemd_usage.html
本文作者 mxdyeah
发布时间 2025-04-11
许可协议 CC BY-NC-SA 4.0
发表新评论
Vaptcha Initializing...