Yocto:删除 System V init 脚本的 bbappend 文件

Pie*_*ier 5 init recipe bitbake yocto

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

所以我创建了一个 .bbappend 文件,我尝试了类似的东西:

pkg_postinst_${PN} () {
    update-rc.d dnsmasq -f remove
}
Run Code Online (Sandbox Code Playgroud)

但它没有用,我不知道如何使用 bbappend 文件删除这个 init 脚本。

谢谢,皮埃尔-奥利维尔

Kos*_*taZ 5

在 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.
Run Code Online (Sandbox Code Playgroud)

让我重申一下

The correct way to disable services is to configure
the service as stopped in all runlevels in which it
is started by default.
Run Code Online (Sandbox Code Playgroud)

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

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

NGINX 由nginx.incYoctometa-openembedded层下的文件描述:

meta-openembedded/meta-webserver/recipes-httpd/nginx/nginx.inc
Run Code Online (Sandbox Code Playgroud)

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

INITSCRIPT_NAME = "nginx"
INITSCRIPT_PARAMS = "defaults 92 20"
Run Code Online (Sandbox Code Playgroud)

Yocto rootfs 中生成的服务启动/终止符号链接是:

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
Run Code Online (Sandbox Code Playgroud)

此外,这由在 rootfs 创建期间update-rc.d.bbclass执行的thas 确认update-rc.d。所以,update-rc.dmeta/classes/update-rc.d.bbclass文件中调用的方式是:

update-rc.d $OPT ${INITSCRIPT_NAME} ${INITSCRIPT_PARAMS}
Run Code Online (Sandbox Code Playgroud)

答对了!

结论

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

INITSCRIPT_PARAMS = "stop 20 0 1 6 ."
Run Code Online (Sandbox Code Playgroud)

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

INITSCRIPT_PARAMS在重新创建 rootfs 之前,应验证有效的环境变量。正确且简单的方法是再次使用伟大的bitbake命令:

bitbake nginx -e | grep INITSCRIPT_PARAMS
Run Code Online (Sandbox Code Playgroud)

现在,让我们重新创建图像(core-image-full-cmdline在我的情况下):

bitbake core-image-full-cmdline
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

再次宾果!


Rom*_*mov 2

几件事:

  • 也许你正在使用systemd?
  • 也许您正在添加错误版本的食谱?
  • 也许你应该尝试一下update-rc.d -f dnsmasq remove(注意-f应该在名字前面)
  • 也许你应该尝试覆盖INITSCRIPT_PARAMSINITSCRIPT_PARAMS = "stop 20 0 1 6 ."