OpenHarmony中的环境服务管理配置讲解

news/2025/10/13 22:25:19/文章来源:https://www.cnblogs.com/wzzkaifa/p/19139564

一、服务管理概述

OpenHarmony 的服务管理核心由 init 进程负责。init 进程在系统启动时,通过解析特定格式的服务进程配置文件(.cfg 文件),来管理系统服务的启动、生命周期和权限控制。这种设计允许根据不同的业务场景灵活配置服务行为。

文档中提到的增值服务功能包括:

  • 启动控制:控制服务在哪个阶段启动。
  • 按需启动:服务在真正被需要时才拉起,节省系统资源。
  • 命令执行:在服务生命周期的特定节点(如启动、停止、重启时)执行自定义命令。
  • 定时启动:在指定时间后拉起服务。
  • fd代持:init 进程可以为服务预先创建并管理文件描述符。
  • 沙盒:为服务提供隔离的运行环境。

二、服务配置文件详解

服务配置文件是管理服务的核心,通常命名为 服务名.cfg(例如 appspawn.cfg),并遵循 JSON 格式。

1. 配置文件的位置与加载

配置文件通常放置在 /system/etc/init//vendor/etc/init/ 目录下。init 进程在启动时会扫描并解析这些目录下的所有 .cfg 文件。

2. 核心配置字段说明

配置文件主要包含 servicesjobs 等 JSON 对象。下表详细说明了 services 字段下各关键配置项的含义和用法:

字段名是否必选说明与示例适用系统
name必选服务名称,需唯一且非空,长度≤32字节。例:"name": "myservice"小型、标准
path必选执行文件路径和参数。第一个元素必须是路径。例:"path": ["/system/bin/myservice", "--arg1"]小型、标准
uid, gid必选进程运行的用户ID和组ID。例:"uid": 1000, "gid": 1000小型、标准
once可选是否为一次性进程。0:常驻(退出后自动重启);1:一次性(退出后不重启)。例:"once": 0小型、标准
importance可选标准系统:进程优先级(-20到19,值越小优先级越高)。小型系统:标记重要性(非0:重要进程,退出会触发系统重启)。例:"importance": -5小型、标准
start-mode可选服务的启动模式。boot:在 “init” 阶段启动;normal:在 “post-init” 阶段启动(默认);condition:按条件启动。例:"start-mode": "boot"标准系统
ondemand可选是否按需启动。设为 true 后,init 不会主动启动该服务,而是在特定条件满足时(如 socket 有请求)才拉起。例:"ondemand": true小型、标准
critical可选服务抑制机制。配置为数组 [M, N, T],其中 M=使能标志(1/0),N=时间段T秒内最大重启次数,T=时间窗口(秒)。超过限制则会重启系统。例:"critical": [1, 5, 60]小型、标准
secon可选设置服务的 SELinux 安全上下文(标签)。需要在 SELinux 策略中预先定义。例:"secon": "u:r:my_service:s0"标准系统
3. 生命周期命令执行 (jobs)

服务可以在其生命周期的不同阶段执行特定的命令序列(jobs)。

"services": [{
"name": "my_service",
"path": ["/system/bin/my_service"],
"jobs": {
"on-start": "services:my_service_start",   // 服务进程fork后执行
"on-stop": "services:my_service_stop",     // 服务停止时执行
"on-restart": "services:my_service_restart" // 服务重启时执行
}
}]

这些 jobs 需要在配置文件的 "jobs" 部分具体定义。

三、服务管理实用教程

1. 如何新增一个系统服务

以下是为系统新增一个名为 my_daemon 的常驻系统服务的标准流程:

a. 创建配置文件 (my_daemon.cfg)
将配置文件放在代码仓的合适位置,例如 vendor/your_company/your_product/init_configs/base/startup/init/services/etc/

// my_daemon.cfg
{
"jobs": [{
"name": "init",
"cmds": [
"start my_daemon"  // 在init阶段启动该服务
]
}],
"services": [{
"name": "my_daemon",
"path": ["/system/bin/my_daemon", "--config=/data/my_daemon.conf"],
"uid": 1000,
"gid": 1000,
"once": 0,
"importance": 0,
"ondemand": false,
"sandbox": 1
}]
}

b. 修改编译脚本
确保你的服务可执行文件和配置文件能被编译系统打包到镜像中。通常需要在对应的 bundle.jsonBUILD.gn 文件中添加构建目标。

c. 验证服务

  1. 编译并烧写系统镜像。
  2. 使用 ps 命令查看服务进程是否已启动:ps -ef | grep my_daemon
  3. 测试服务韧性:使用 kill 命令终止该进程,观察 init 进程是否会将其重新拉起(因为 "once": 0)。
2. 服务权限配置(DAC)

服务的 uidgid 需要在系统的用户和组数据库中定义。

  • 添加新用户/组:如果服务使用了新的 uid/gid,需要在 init 模块的 /etc/passwd/etc/group 文件中添加相应条目。
  • 高权限进程白名单:如果服务的 uidgidrootsystem,必须在产品目录下的 security_config/high_privilege_process_list.json 文件中将其加入白名单。
3. 服务权限配置(SELinux)

如果系统开启了 SELinux(通常处于 Enforcing 强制模式或 Permissive 宽容模式),需要为服务配置安全策略。

  1. 临时设置为宽容模式(用于调试):在 shell 中执行 setenforce 0。此时违反策略只会记录日志而不会阻止操作。
  2. 为服务定义标签
    • file_contexts 文件中定义可执行文件的标签:/system/bin/my_daemon u:object_r:my_daemon_exec:s0
    • type.te 等策略文件中定义标签的作用域和转换规则。
  3. 编写策略规则.te 文件):允许你的服务域(如 my_daemon)访问其所需的资源(文件、端口等)。
4. 服务控制命令

OpenHarmony 提供了 begetctl 命令工具来手动管理服务。

  • 启动/停止/重启服务
    begetctl start my_daemon
    begetctl stop my_daemon
    begetctl restart my_daemon
  • 定时启动服务begetctl timer_start my_daemon 5000 (5秒后启动)。

系统 API 也提供了相应的控制接口,如 ServiceControl, StartServiceByTimer 等,但这些通常是给系统组件使用,需要相应的 DAC 和 SELinux 权限。

四、最佳实践与故障排查

  1. 最小权限原则:为服务配置尽可能小的 uid/gidcaps(能力集),并使用沙盒功能("sandbox": 1)。
  2. 按需启动:对于不总是需要运行的服务,设置 "ondemand": true 以提升系统启动速度和减少资源占用。
  3. 利用抑制机制:为关键服务配置 critical 参数,防止其异常崩溃时无限重启拖垮系统。
  4. 调试
    • 如果服务未能正常启动,首先使用 dmesghilog 查看系统日志,寻找 init 进程报出的错误码(见文档中的错误码说明表)。
    • 当怀疑是 SELinux 问题导致服务启动失败时,先将 SELinux 设置为 Permissive 模式(setenforce 0)进行测试。如果问题消失,则基本可以确定是 SELinux 策略需要调整。

关注鸿蒙百川带你学习更多鸿蒙操作系统知识
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT:获取文件信息之创建日期方法created()方法--废弃

QT:获取文件信息之创建日期方法created()方法--废弃。 在Qt5.12框架中,QFileInfo::created()方法已被标记为废弃(deprecated),建议使用birthTime()或metadataChangeTime()替代。fileinfo.cpp:90:30: warning: create…

排列组合 容斥 总结

加法原理 加法原理。很直白的,就是一个用加法来弄的原理。 简单来说,就是做一件事情有 \(n\) 种方法,第 \(i\) 种方法又有 \(a_i\) 个具体的操作方案。那么非常显然,做这件事情就有 \(a_1 + a_2 + \dots + a_{n-1}…

10.13每日总结

今天满课,软件设计+软件开发案例分析+大数据技术+物联网工程,很忙,且开始看中级软件工程师的网课了,,,看起来真的很难,不是我擅长的那一挂,周末外语竞赛的成绩就出来了,,加油!

完整教程:学习 React 前掌握 JavaScript 核心概念

完整教程:学习 React 前掌握 JavaScript 核心概念pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

新学期每日总结(第7天)

今日相较昨日 学习了类与对象

20232422 2025-2026-1 《网络与系统攻防技术》实验一实验报告

实验目的 掌握ELF可执行文件的机器指令修改方法,理解程序执行流控制原理; 理解缓冲区溢出(BOF)漏洞的原理,掌握通过覆盖返回地址改变程序执行流的攻击方法; 学会构造并注入shellcode,理解漏洞利用的完整流程; …

详细介绍:redis特性和应用场景

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实验记录 2025/10/13

2025/10/13 使用配置:yolo11s.yaml from ultralytics import YOLOdef main():# 1. 并非加载预训练模型(这里用 YOLO11n,也可以换成 yolov11s、best.pt 等)# 而是让YAML 定义自己的网络结构model = YOLO(model=r…

newDay09

1.今天课程比较多,晚上简单复习了面向对象的知识,背背单词 2.明天还是再补补java吧 3.感觉自己基础还是太薄弱了,课堂上很多问题答不出来

正睿25csp七连测day5

题面:这场打得很飞舞,\(40pts,rk54\)。 T1 这道题比较考验思维。 我们可以考虑每个点是从最初序列的哪个位置转移过来了(记为 \(from\))。 不难发现,如果最终序列中的几个位置的 \(from\) 相等,那么这几个位置代…

C/C++ 指针详解与各种指针定义 - 指南

C/C++ 指针详解与各种指针定义 - 指南2025-10-13 22:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

14 10.13

上了数据结构 统一建模语言 Java跑步了背了单词

日志|前端框架Vue

Vue是一款用于构建用户界面的渐进式的JavaScript框架1)2)3)v-bindv-onv-if v-else-if v-else = v-showv-forv-实例演示vue生命周期的挂载完成提示

oop.shiyan1

实验1 源代码:1 #include<iostream>2 #include<string>3 #include<vector>4 #include<algorithm>5 6 //模版函数声明7 template<typename T>8 void output(const T& c);9 10 void …

玄机——第一章 应急响应-Linux日志分析 wp

简介 账号root密码linuxrz ssh root@IP 1.有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割 2.ssh爆破成功登陆的IP是多少,如果有多个使用","分割 3.爆破用户名字典是什么?如果有多个使…

第四周第五天4.5

所用时间:180分钟 代码量(行):0 了解到的知识点: 1.无约束问题方法求解 无约束问题的核心求解方法分为解析法和数值迭代法,前者直接求导找最优解,后者通过逐步迭代逼近最优解 解析法仅适用于目标函数可微且能通…

深入解析:flutter AudioPlayer的使用问题及处理

深入解析:flutter AudioPlayer的使用问题及处理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

11 10.10

学习了看书了

12 10.11

出去玩儿了 学习了

P3330 [ZJOI2011] 看电影

思路 第一眼看去好像并没有什么思路,于是我们通过手算或者暴力搜索打了一个表, 当 \(n = 2\) 时,当 \(k\) 变化时,答案如表所示n\ k 1 2 3 41 (1, 1) (2, 2) (3, 3) (4, 4)2 (0, 1) (3, 4) (15, 16) (24, 25)3 (0,…