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、内存等资源使用。
(四)对比总结
特性 | SysVinit | Upstart | Systemd |
---|---|---|---|
启动速度 | 串行启动,较慢 | 事件驱动,较快 | 并行启动,最快 |
配置文件 | /etc/inittab 和脚本 | /etc/init/ 下的 INI 文件 | /etc/systemd/system/ 下的 .service 文件 |
日志管理 | 依赖 syslog 等外部工具 | 依赖 syslog 等外部工具 | 内置 journald |
依赖关系管理 | 手动配置 | 事件驱动的依赖管理 | 自动处理依赖关系 |
资源控制 | 无 | 无 | 支持 cgroups |
兼容性 | 传统系统,兼容性好 | 兼容 SysVinit 脚本 | 兼容 SysVinit 脚本 |
复杂性 | 简单 | 中等 | 复杂,学习曲线陡峭 |
四、Systemd 的优缺点
(一)优点
Systemd 的优点很明显。它的启动速度很快,因为支持并行启动服务。它还能自动处理服务的依赖关系,管理员不用手动配置,很方便。它的日志系统很强大,查询起来很方便。而且,它还能通过 cgroups 精细控制服务的资源使用,提高了系统的可管理性。
(二)缺点
Systemd 也有一些缺点。它的配置文件和功能比较复杂,学习曲线比较陡峭,新手可能需要花点时间来掌握。而且,尽管它兼容 SysVinit 的脚本,但在某些情况下可能会出现兼容性问题,特别是在一些老旧的系统或软件中。另外,Systemd 本身占用的系统资源相对较多,可能会对资源受限的系统产生一定影响。