新闻详情

新闻详情

首页 / 资讯中心 / 详情

yocto: 13-systemd Service

发布时间:2026/9/30 2:25:36来源:尧图网络
yocto: 13-systemd Service
第3课自己写 systemd Service —— 掌握开机服务摘要本教程详细介绍了如何在 Raspberry Pi 上创建自定义 systemd 服务实现开机自动运行程序。内容包括systemd 基本概念、service 文件结构解析、Yocto 集成方法、recipe 编写要点以及完整的构建、部署和验证流程。通过 hello.service 示例展示了从编写服务文件到系统集成的完整实践过程。自己写一个 service让 Raspberry Pi 开机自动运行自己的程序。学习完成后你就会理解什么是 systemd什么是 serviceservice 文件长什么样Yocto 如何安装 serviceYocto 如何自动 enable service最终效果Pi 开机 ↓ systemd ↓ 启动 hello.service ↓ 执行 /usr/bin/hello这就是现代 Linux 的标准启动方式。所以要做两件事1.增加systemd serice 服务2.增加hello-systemd 服务一、什么是 systemd以前 Linux 使用init后来使用SysV init现在几乎所有 Linux 都使用systemd可以理解成systemd 所有程序几乎都是它启动。例如- network -ssh- dbus - bluetooth - nginx -docker- 自己的程序全部都是 systemd 管理。二、什么是 service例如SSH 服务 sshd.service网络 NetworkManager.service时间同步 systemd-timesyncd.service我们也可以写hello.service开机执行/usr/bin/hello三、service 文件在哪里一般放/lib/systemd/system/或者 /usr/lib/systemd/system/Yocto 使用变量${systemd_system_unitdir}例如${systemd_system_unitdir}/hello.service四、service 文件格式建立 hello.service内容[Unit]DescriptionHello Demo ServiceAfternetwork.target[Service]TypesimpleExecStart/usr/bin/helloRestartalways[Install]WantedBymulti-user.target这是最经典的 service。五、逐行解释[Unit]DescriptionHello Demo Service # 描述这个服务。AfterAfternetwork.target # 网络启动完成以后 再启动 hello 不是依赖只是启动顺序。[Service]真正运行程序。Typesimple最常见。simple意思ExecStart 启动以后 程序一直运行ExecStart真正执行ExecStart/usr/bin/hello # systemd 会执行/usr/bin/helloRestartRestartalways程序退出重新启动 非常适合 daemon。[Install]WantedBymulti-user.target意思进入正常多用户模式时启动。可以理解成开机以后自动启动六、把 service 放进 recipe目录hello-systemd/ ├── hello-systemd.bb ├── hello └── hello.servicehello.service[Unit]DescriptionHello Demo ServiceAfternetwork.target[Service]TypesimpleExecStart/usr/bin/helloRestartalways[Install]WantedBymulti-user.targethello脚本#!/bin/shwhiletruedoechoHello Systemdsleep5done七、Recipe – hello-systemd.bbSUMMARYHello systemd demoLICENSEMITLIC_FILES_CHKSUMfile://LICENSE;md5f4fa7fd56aac72279ad21a112915ca87inherit systemd SRC_URI\ file://hello \ file://hello.service \ file://LICENSES${WORKDIR}do_install(){install-d${D}${bindir}install-m0755${WORKDIR}/hello${D}${bindir}/helloinstall-d${D}${systemd_system_unitdir}install-m0644${WORKDIR}/hello.service\${D}${systemd_system_unitdir}/hello.service}SYSTEMD_SERVICE:${PN}hello.serviceSYSTEMD_AUTO_ENABLEenableFILES:${PN}\${bindir}/hello \${systemd_system_unitdir}/hello.service \ 八、重点解释 Recipeinherit systemd告诉 BitBake我要安装 systemd service。 它会引入处理 systemd 服务所需的类和打包逻辑。SYSTEMD_SERVICE:${PN}告诉 Yocto这个 package 的 service 是hello.service如果一个包有多个服务也可以写SYSTEMD_SERVICE:${PN} “hello.servicemonitor.service”SYSTEMD_AUTO_ENABLE “enable”构建镜像时systemctl enable hello.service会自动完成实际上是在 rootfs 中创建相应的符号链接因此系统首次启动时服务就是启用状态。如果改成SYSTEMD_AUTO_ENABLE “disable”则安装了 service 文件但不会自动启用。九、添加systemd usrmerge 特性推荐在 local.conf 中同时添加 usrmergevi ~/yocto/build-rpi2/conf/local.confbash修改为bitbake# # 切换到 systemd 作为 init 管理器# DISTRO_FEATURES:append systemd usrmergeVIRTUAL-RUNTIME_init_managersystemdVIRTUAL-RUNTIME_initscriptssystemd-compat-unitsDISTRO_FEATURES_BACKFILL_CONSIDEREDsysvinitVIRTUAL-RUNTIME_syslogsystemd-journaldbitbake core-image-minimal-ccleansstate# seemd clean tmp, so need long time to rebuildbitbake core-image-minimal十构建并加入镜像编译bitbake hello-systemd加入镜像IMAGE_INSTALL:append hello-systemd位置1core-image-minimal.bbappend最佳实践 ✅IMAGE_INSTALL:append network-config hello-script mypackage mypackage-config hello-systemd位置2local.conf快速测试位置3自定义 Image Recipe最灵活重新生成镜像bitbake core-image-minimal写入 SD 卡并启动 Raspberry Pi。十一、验证服务查看是否已启用systemctl is-enabled hello.service期望输出enabled查看状态systemctl status hello.service可能看到● hello.service Loaded: loaded Active: active(running)查看日志journalctl-uhello.service如果脚本每 5 秒输出一次 Hello Systemd日志中就会看到相应内容。May2918:48:29 raspberrypi2 systemd[1]: Started Hello Demo Service. May2918:48:29 raspberrypi2 hello[219]: Hello Systemd ├── hello-systemd │ ├── files │ │ ├── hello │ │ ├── hello.service │ │ └── LICENSE │ └── hello-systemd.bb十二、常见问题本课实验推荐为了真正掌握 systemd建议按下面顺序完成三个小实验1.基础服务编写 hello.service每 5 秒打印一条日志确认开机自动启动。2.故障恢复将脚本改为运行 10 秒后退出观察 Restartalways 是否自动拉起服务。3.启动顺序修改 After如 network.target结合 systemctl list-dependencies 和日志观察服务启动顺序。完成这三步后你不仅会知道如何在 Yocto 中安装和启用一个 systemd 服务还会理解 Linux 开机服务管理的基本工作方式。这也是后续开发网络服务、守护进程daemon和后台应用的基础。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

vDisk虚拟磁盘全解析:云桌面镜像批量部署与性能优化实战 2026/9/30 3:26:24

vDisk虚拟磁盘全解析:云桌面镜像批量部署与性能优化实战

这两年做云桌面项目,被问得最多的一个问题就是:五十台终端要统一装系统、统一装软件,能不能别一台一台去折腾?我的回答通常很简单——如果你的诉求是“让所有机器保持一致、更新一次全部生效”,那 vDisk(虚…

阅读更多 →
Unreal多线程实战:为什么不用std::thread及替代方案解析 2026/9/30 3:26:23

Unreal多线程实战:为什么不用std::thread及替代方案解析

说实话,我刚从普通 C 项目转到 Unreal 开发那阵子,手特别“痒”。写了几年服务端代码,多线程早就习惯了,打开 UE 工程第一反应就是:直接std::thread拉起来一个线程干活不就行了?结果就是被现实狠狠教育了一…

阅读更多 →
vDisk虚拟磁盘实战:PXE引导与50台云桌面终端部署全解析 2026/9/30 3:26:23

vDisk虚拟磁盘实战:PXE引导与50台云桌面终端部署全解析

最近接了个云桌面项目,客户要求一台物理主机带 50 个桌面终端,系统还得分 Windows 和 Linux 两拨。刚开始头也大,不过理顺之后发现核心就一句话:用好 vDisk(虚拟磁盘)这套方案,部署效率和后期维…

阅读更多 →
基于SpringBoot2与Vue3的课程答疑系统前后端分离实战 2026/9/30 3:26:23

基于SpringBoot2与Vue3的课程答疑系统前后端分离实战

做课程答疑系统这件事,听起来不算新鲜,但真要把它做扎实,技术点一点都不少。我最近完成的一套 Java Web 课程答疑系统源码,选型是 SpringBoot2 Vue3 MyBatis-Plus MySQL8.0,前后端分离,带完整文档。这套…

阅读更多 →
基于PHP的GEO排名优化系统:架构设计、多城市分站与Schema标记实战 2026/9/30 3:26:23

基于PHP的GEO排名优化系统:架构设计、多城市分站与Schema标记实战

GEO这个词最近在国内技术圈和营销圈刷屏的频率实在太高了。我做PHP开发十多年,从最早的SEO关键词堆砌,到后来AEO(Answer Engine Optimization,答案引擎优化)里围着结构化数据打转,再到现在的GEO&#xff08…

阅读更多 →
C++继承方式本质:访问控制契约而非语法选择 2026/9/30 3:26:17

C++继承方式本质:访问控制契约而非语法选择

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉