我正在使用 Yocto 构建基于 systemd 的映像,但遇到了一个问题,即该映像中不存在 update-rc.d(systemd sysv 包装器所需)。
我可以确认 update-rc.d 被列为 systemd 的运行时依赖项:
(请参阅此输出第一行的末尾)
$ bitbake systemd -e | grep "^RDEPENDS"
RDEPENDS:systemd=" kmod dbus util-linux-mount util-linux-umount udev (= 1:250.4-r0) systemd-udev-rules util-linux-agetty util-linux-fsck systemd-serialgetty volatile-binds ldconfig libnss-myhostname pam-plugin-unix pam-plugin-loginuid pam-plugin-keyinit systemd-compat-units update-rc.d systemd-vconsole-setup"
RDEPENDS:systemd-bash-completion="bash-completion"
RDEPENDS:systemd-conf=" update-rc.d"
RDEPENDS:systemd-dev="systemd (= 1:250.4-r0)"
RDEPENDS:systemd-doc=" "
RDEPENDS:systemd-initramfs="systemd"
RDEPENDS:systemd-kernel-install=" bash"
RDEPENDS:systemd-staticdev="systemd-dev (= 1:250.4-r0)"
RDEPENDS:udev-hwdb=" udev"
systemd 显然包含在我的图像中,因为我可以看到它正在工作。还检查我的映像清单,确认 systemd 已包含在映像中。
$ grep -n systemd tmp/deploy/images/<arch>/<image_name>.manifest
283:libsystemd-shared cortexa55 1:250.4-r0
284:libsystemd0 cortexa55 1:250.4-r0
394:systemd cortexa55 1:250.4-r0
395:systemd-compat-units cortexa55 1.0-r29
396:systemd-conf txrz_g2l0 1:1.0-r0
397:systemd-extra-utils cortexa55 1:250.4-r0
398:systemd-serialgetty txrz_g2l0 1.0-r5
399:systemd-udev-rules cortexa55 1:250.4-r0
400:systemd-vconsole-setup cortexa55 1:250.4-r0
然而,update-rc.d 仍然不包含在结果图像中。清单中缺少包名称(即 update-rc.d),并且映像 rootfs 中缺少它应该提供的实际脚本文件。
为什么会发生这种情况?我可以做什么来调试为什么缺少此运行时依赖项?
结果发现该包丢失了,因为基本图像类将其添加到了
ROOTFS_RO_UNNEEDED
变量中。我确实正在构建只读映像,但仍然需要 update-rc.d
对某些服务进行运行时修改,同时将 rootfs 临时安装在我的开发目标上作为 RW。
将
ROOTFS_RO_UNNEEDED:remove = " update-rc.d"
添加到我的图像的开发版本解决了问题。