开机启动方式:通过 OpenHarmony init 服务配置实现。
配置开机启动程序
配置目录为 /system/etc/init/,该目录用于存放开机启动服务的 cfg 配置文件。
例如,要配置开机启动程序 my_program,将可执行文件放至如 /system/bin/my_program,并新建或修改 /system/etc/init/my_program.cfg 文件,内容如下:
{ "jobs": [{ "name": "init", "cmds": ["start my_program"] }], "services": [{ "name": "my_program", "path": ["/system/bin/my_program"], "uid": "root", "gid": ["root"] }]}其中 path 为可执行文件的路径,也可以包含参数,例如:
"path": ["/system/bin/my_program", "--option1", "value1"],示例:配置静态网络开机启动
为方便后续切换网络环境,将网络参数与启动逻辑分离:网络参数保存在 /etc/network-static.conf,开机服务只调用固定的启动脚本 /bin/network-static.sh。
首先创建网络参数文件 /etc/network-static.conf。以后只需修改此文件中的 IP、网关和 DNS,无需修改 init 服务文件:
cat > /etc/network-static.conf <<'EOF'ifconfig eth0 192.168.31.100 netmask 255.255.255.0 uproute add default gw 192.168.31.1echo nameserver 192.168.31.1 > /etc/resolv.confEOFchmod 600 /etc/network-static.conf创建网络启动脚本 /bin/network-static.sh:
cat > /bin/network-static.sh <<'EOF'#!/bin/shexec /bin/sh /etc/network-static.confEOFchmod 700 /bin/network-static.sh创建 OpenHarmony init 服务配置 /system/etc/init/network_static.cfg:
cat > /system/etc/init/network_static.cfg <<'EOF'{ "jobs": [{ "name": "post-fs-data", "cmds": ["start network_static"] }], "services": [{ "name": "network_static", "path": ["/bin/sh", "/bin/network-static.sh"], "uid": "root", "gid": ["root"], "once": 1 }]}EOFpost-fs-data 阶段会在文件系统可用后执行网络脚本。once: 1 表示网络脚本配置完成后正常退出,不由 init 重复拉起。
示例:配置 Dropbear 开机启动
Dropbear 需要在系统随机源初始化完成后再启动。此系统的 init 会在早期 init 阶段初始化 /dev/urandom,而 post-fs-data 发生在该阶段之后。下面的包装脚本会额外等待 /dev/urandom 可用,并在 Dropbear 异常退出后每 5 秒重试一次。
创建启动包装脚本 /bin/dropbear-start.sh:
cat > /bin/dropbear-start.sh <<'EOF'#!/bin/sh
# 等待 init 完成随机源初始化。while [ ! -c /dev/urandom ]; do sleep 1done
# Dropbear 退出时延迟重试,避免启动失败时高频循环。while :; do /bin/dropbear -E -F -R -p 22 sleep 5doneEOFchmod 700 /bin/dropbear-start.sh创建或替换 /system/etc/init/dropbear.cfg:
cat > /system/etc/init/dropbear.cfg <<'EOF'{ "jobs": [{ "name": "post-fs-data", "cmds": ["start dropbear"] }], "services": [{ "name": "dropbear", "path": ["/bin/sh", "/bin/dropbear-start.sh"], "uid": "root", "gid": ["root"] }]}EOF重启开发板后验证:
ifconfig eth0route -ncat /etc/resolv.conftest -c /dev/urandom && echo RANDOM_READYps -ef | grep dropbear | grep -v grep预期可以看到 eth0 的静态地址、默认路由、DNS,以及 sh /bin/dropbear-start.sh 和 dropbear -E -F -R -p 22 两个进程。