简介
在linux系统中主要使用SystemD执行初始化和管理系统服务。SystemD 是一个现代的初始化系统,在2018.3版本之后,通常使用SystemD来代替原有的SystemV方式了。它引入了一种更高级的方式来管理系统服务。它以守护进程的形式运行,通常由 PID 1 启动。SystemD 使用单元(unit)来描述和管理服务,这些单元可以是服务单元、目标单元、设备单元等。每个单元都有一个配置文件,通常位于 /etc/systemd/system/ 目录中。SystemD 支持并行启动和停止服务,提供更好的性能和并发性,同时还具有更丰富的功能,如自动重启、依赖关系管理等。
SystemD 管理运行级别(runlevel)的概念已被废弃,而由 "targets" 来代替,使系统的状态切换更加灵活和简单。不同的 target 表示系统的不同状态,例如多用户图形模式、单用户模式、网络服务启动等。每个 target 包含了一组单元(units)的信息,这些单元是系统服务和其他配置项。当你切换到特定的 target 时,SystemD 将启动或停止与该 target 相关的单元。常见的target如下:
| Target | 描述 | 对应旧 runlevel |
|---|---|---|
graphical.target |
完整图形界面环境 | 5 |
multi-user.target |
多用户命令行环境 | 3 |
rescue.target |
单用户救援模式 | 1 |
emergency.target |
紧急救援模式,只提供最小 shell | - |
default.target |
默认启动目标,通常是 graphical.target |
- |
SystemD targets 可以通过 "target units" 来定义,这些 units 通常存储在 /usr/lib/systemd/system/ 目录或 /etc/systemd/system/ 目录中。你可以使用 systemctl 命令切换到不同的 target。例如,要切换到多用户图形模式,可以运行:
sudo systemctl isolate graphical.target
在petalinux下新增自启动服务
使用petalinux 2022.2版本进行测试,用户可以通过以下几步轻松实现
- 使用命令创建一个应用框架
bash
petalinux-create -t apps --template install -n usr-init --enable
- 修改自启动脚本
在位置./project-spec/meta-user/recipes-apps/usr-init/files新增usr-init.service文件如下:
bash
[Unit]
Description=myapp-init
[Service]
ExecStart=/usr/bin/myapp-init
StandardOutput=journal+console
[Install]
WantedBy=multi-user.target
修改usr-init.bb文件如下:
bash
#
# This file is the usr-init recipe.
#
SUMMARY = "Simple usr-init application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
inherit systemd
SRC_URI = "file://usr-init \
file://usr-init.service \
"
do_install() {
bbplain "BPN = ${BPN}"
bbplain "PN = ${PN}"
bbplain "D = ${D}"
bbplain "WORKDIR = ${WORKDIR}"
bbplain "systemd_system_unitdir = ${systemd_system_unitdir}"
install -d ${D}${bindir}
install -m 0755 ${WORKDIR}/usr-init ${D}${bindir}/
install -d ${D}${systemd_system_unitdir}
install -m 0644 ${WORKDIR}/usr-init.service ${D}${systemd_system_unitdir}/
}
FILES_${PN} += "${bindir}/* \
${systemd_system_unitdir}/*"
SYSTEMD_SERVICE:${PN} = "usr-init.service"
SYSTEMD_AUTO_ENABLE:${PN} = "enable"
pkg_postinst_ontarget_${PN}() {
echo "usr-init postinstall executed on target"
}
修改完毕后执行petalinux-build编译即可