Ubuntu 下 systemd 介绍
Ubuntu 下 systemd 介绍
系统启动方式
在Linux系统中,进程启动后,负责初始化用户空间的系统服务和应用程序:
SysV init(传统方式):从
/etc/inittab
文件读取配置,确定默认运行级别(如多用户模式或图形界面模式)。启动基本系统服务,如网络服务、系统日志、用户登录服务(getty等)。systemd(现代主流方式):Ubuntu从15.04开始默认使用。系统大部分组件被建模为systemd服务。通过目标单元(如multi-user.target或graphical.target)协调服务启动顺序。自动优化启动流程,减少依赖和启动时间。
相关目录介绍
以下是systemd功能相关的目录介绍:
/usr/lib/systemd/system
:
- 用途:存放由软件包安装的systemd单元文件,包括各种服务(.service)、目标(.target)、挂载(.mount)等单元文件。
- 特点:该目录下的配置文件是由软件包管理器(如apt、rpm等)安装软件时自动放置的,通常不需要用户手动修改。它为系统提供了各种预定义的服务和功能配置。
/run/systemd/system
:
- 用途:存放系统运行时动态生成的单元文件。这些文件通常是在系统运行过程中,由各种服务或进程根据需要创建的。
- 特点:该目录下的配置文件具有中等优先级,一般很少被手动修改,除非需要调整程序运行时的一些参数,即Session级别的参数。
/etc/systemd/system
:
- 用途:存放系统管理员自定义的systemd单元文件,或者通过
systemctl enable
命令创建的开机启动服务的符号链接。 - 特点:该目录下的配置文件优先级最高,如果同一选项在多个目录中都配置了,这里的配置会覆盖其他目录的配置。系统管理员可以在此目录中创建自己的单元文件,或者通过符号链接的方式启用或禁用服务。
/lib/systemd/system
:
- 用途:与
/usr/lib/systemd/system
目录相同,用于存放软件包安装的systemd单元文件。 - 特点:在许多Linux系统中,/lib目录实际上是/usr/lib的符号链接,因此这两个目录在实际使用中是等价的。
systemd工作流程
systemd是现代Linux系统中广泛使用的初始化系统和服务管理器,负责在系统启动时管理和启动各种服务、资源和进程。以下是systemd的工作流程:
1. 启动阶段
- 内核启动systemd:
- 内核加载完成后,会启动第一个用户空间进程systemd(PID=1)。systemd是现代Linux系统的初始化进程,取代了传统的init进程。
- systemd会读取配置文件(如
/etc/systemd/system/default.target
),确定系统的默认运行模式(如多用户模式或多用户图形界面模式)。
2. 加载配置文件
系统初始化配置
systemd从
/etc/systemd/system.conf
文件中加载系统初始化配置,包括系统的运行模式、默认的依赖关系模式等。单元文件查找
系统启动时,systemd首先会读取
/etc/systemd/system
、/usr/lib/systemd/system
和/run/systemd/system
目录中的单元文件(例如.service、.target、.socket等)。其中:/etc/systemd/system
:优先级最高,存放系统管理员自定义或使用systemctl enable
启用的单元文件。/usr/lib/systemd/system
:存放软件包安装的默认单元文件。/run/systemd/system
:存放系统运行时生成的临时单元文件。
3. 确定运行模式
- 运行模式(Target):
- systemd使用target来定义系统的运行模式。常见的target包括:
multi-user.target
:多用户命令行模式。graphical.target
:图形化多用户模式。- 默认运行模式由
/etc/systemd/system/default.target
文件指定。
4. 启动基础服务
- 基础服务启动:
- systemd会启动一些基础服务,如:
- udev:管理设备节点。
- systemd-logind:管理用户会话。
- systemd-journald:管理日志系统。
- 这些服务是系统运行的基础设施,必须优先启动。
5. 启动目标服务
- 根据target启动服务:
- systemd会根据目标target文件(如multi-user.target或graphical.target)启动相关服务。
- 服务的配置文件通常位于
/etc/systemd/system/<target>.wants/
目录下。 - 服务启动时,systemd会自动解析服务之间的依赖关系,并按需并行启动服务。
6. 服务管理
- 服务生命周期管理:
- systemd提供了systemctl命令来管理服务,例如:
systemctl start <service>
:启动服务。systemctl stop <service>
:停止服务。systemctl restart <service>
:重启服务。systemctl status <service>
:查看服务状态。- 开机自启管理:
- 通过
systemctl enable <service>
和systemctl disable <service>
命令,可以启用或禁用服务的开机自启动。
7. 日志管理
- 日志记录:
- systemd-journald负责记录系统日志,日志存储在内存和磁盘中,便于快速查询。
- 日志查询:
- 使用journalctl命令可以查看日志,例如:
journalctl -u <service>
:查看指定服务的日志。journalctl -b
:查看本次启动的日志。journalctl -f
:实时查看最新日志。
8. 资源控制
- 资源隔离:
- systemd使用控制组(cgroups)来隔离和限制服务的资源使用,例如内存、CPU等。
- 沙盒运行:
- 可以通过配置文件中的选项(如ProtectSystem=strict和PrivateTmp=true)增强服务的安全性。
9. 故障恢复
- 自动重启服务:
- 在服务配置文件中设置Restart=on-failure,当服务崩溃时,systemd会自动重启服务。
总结
systemd的工作流程包括从系统启动到服务管理的全过程,其核心特点是:
- 并行启动:通过并行启动服务,显著缩短系统启动时间。
- 依赖管理:自动解析服务之间的依赖关系,确保服务按正确顺序启动。
- 统一管理:通过systemctl和journalctl命令,提供了一致的服务和日志管理接口。
编写systemd配置文件
systemd使用单元文件(unit files)来管理各种系统资源。以下是一个简单的自定义服务配置示例,我们将创建一个名为my-custom-service.service
的服务。
1. 创建服务单元文件
在/etc/systemd/system/
目录下创建一个新的单元文件,例如:/etc/systemd/system/my-custom-service.service
。
2. 编写服务配置
打开文件并添加以下内容:
[Unit]
Description=My Custom Service
After=network.target
[Service]
Type=simple
User=myuser
ExecStart=/path/to/my/script.sh
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill $MAINPID
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
3. 配置文件解析
[Unit]
节Description
:服务的简短描述。After
:指定该服务在network.target后启动,表示该服务依赖于网络服务。[Service]
节Type
:定义服务类型,simple表示服务启动后立即进入主进程。User
:指定服务运行的用户。ExecStart
:启动服务时执行的命令。ExecReload
:重新加载服务时执行的命令(此处示例为发送HUP信号)。ExecStop
:停止服务时执行的命令。Restart
:指定服务在失败时的重启策略,on-failure表示服务失败时自动重启。RestartSec
:设置重启服务前的等待时间。[Install]
节WantedBy
:指定该服务对应的目标(target),multi-user.target表示在多用户模式下启动。
4. 加载并启动服务
- 重新加载systemd配置:
sudo systemctl daemon-reload
- 启动服务:
sudo systemctl start my-custom-service
- 设置开机自启:
sudo systemctl enable my-custom-service
- 检查服务状态:
sudo systemctl status my-custom-service
5. 注意事项
- 路径和权限:确保ExecStart指定的脚本路径正确,并且脚本具有可执行权限。
- 日志查看:使用
journalctl -u my-custom-service
查看服务日志,便于排查问题。 - 调试:如果服务启动失败,可以查看
/var/log/journal
中的系统日志。
通过以上步骤,你可以创建并配置一个自定义的systemd服务。