gpt4 book ai didi

init - Yocto:删除 System V 初始化脚本的 bbappend 文件

转载 作者:行者123 更新时间:2023-12-02 05:10:25 26 4
gpt4 key购买 nike

我目前正在使用 Yocto 安装 dnsmasq,但我想删除自动启动。

所以我创建了一个 .bbappend 文件,并尝试了类似的操作:

pkg_postinst_${PN} () {
update-rc.d dnsmasq -f remove
}

但它不起作用,我不知道如何继续使用 bbappend 文件删除此初始化脚本。

谢谢,皮埃尔·奥利维尔

最佳答案

在 SysV 下禁用服务的正确方法是使用 INITSCRIPT_PARAMS :

来自man update-rc.d

A  common  system administration error is to delete the links with
the thought that this will "disable" the service, i.e., that this
will pre‐ vent the service from being started. However, if all links
have been deleted then the next time the package is upgraded,
the package's postinst script will run update-rc.d again and this
will reinstall links at their factory default locations. The correct
way to disable services is to configure the service as stopped in
all runlevels in which it is started by default. In the System V
init system this means renaming the service's symbolic links from
S to K.

让我重申一下

The correct way to disable services is to configure
the service as stopped in all runlevels in which it
is started by default.

但是我们如何才能知道服务默认启动的所有运行级别呢?好吧,如果 /etc/init.d/script 的“update-rc.d LSB header”不存在(Yocto 中的 NGINX 就是这种情况 - 我用它作为例子),那么就很简单了:

  • 运行级别 0 - 关闭,=> 默认情况下在此运行级别停止服务
  • 运行级别 1 - 单用户模式,=> 通常在此运行级别停止服务
  • 运行级别 6 - 重新启动,=> 这很简单:在此运行级别停止服务

NGINX由Yocto nginx.inc层下的meta-openembedded文件描述:

meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx.inc

NGINX 在 nginx.inc 文件中定义初始脚本如下:

INITSCRIPT_NAME = "nginx"
INITSCRIPT_PARAMS = "defaults 92 20"

Yocto rootfs 中生成的服务启动/终止符号链接(symbolic link)为:

rootfs/etc/rc0.d/K20nginx -> ../init.d/nginx # Shutdown runlevel
rootfs/etc/rc1.d/K20nginx -> ../init.d/nginx # Single user mode runlevel
rootfs/etc/rc2.d/S92nginx -> ../init.d/nginx
rootfs/etc/rc3.d/S92nginx -> ../init.d/nginx
rootfs/etc/rc4.d/S92nginx -> ../init.d/nginx
rootfs/etc/rc5.d/S92nginx -> ../init.d/nginx
rootfs/etc/rc6.d/K20nginx -> ../init.d/nginx # Reboot runlevel

此外,执行的 update-rc.d.bbclass 也证实了这一点 rootfs 创建期间为 update-rc.d。所以,update-rc.d 的方式是meta/classes/update-rc.d.bbclass文件中调用的是:

update-rc.d $OPT ${INITSCRIPT_NAME} ${INITSCRIPT_PARAMS}

宾果游戏!

结论

要禁用 Yocto 下 SysV 中的服务,我们需要定义:

INITSCRIPT_PARAMS = "stop 20 0 1 6 ."

但是如何验证生成的 INITSCRIPT_PARAMS 呢?

有效的INITSCRIPT_PARAMS环境变量应该在重新创建 rootfs 之前进行验证。正确且简单的方法要做到这一点,再次使用伟大的 bitbake 命令:

bitbake nginx -e | grep INITSCRIPT_PARAMS

现在,让我们重新创建图像(在我的例子中为 core-image-full-cmdline):

bitbake core-image-full-cmdline

我们现在可以很容易地看到,所有剩余的 Start/Kill 符号链接(symbolic link)是:

rootfs/etc/rc0.d/K20nginx -> ../init.d/nginx # Shutdown runlevel
rootfs/etc/rc1.d/K20nginx -> ../init.d/nginx # Single user mode runlevel
rootfs/etc/rc6.d/K20nginx -> ../init.d/nginx # Reboot runlevel

再次宾果游戏!

关于init - Yocto:删除 System V 初始化脚本的 bbappend 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39144515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com