Yocto 系统配置

Yocto Systemd Configuration

我正在尝试在启动时启动服务,但是我在构建时遇到了问题。 这是我自定义图层中的树结构

michael@michael-VirtualBox:~/Documents/simple_daemon/sources/meta-simpledaemon$ tree
.
├── conf
│   └── layer.conf
├── COPYING.MIT
├── README
└── recipes-example
    ├── example
    │   └── example_0.1.bb
    └── simpledaemon
        ├── files
        │   └── simpledaemon.service
        └── simpledaemon_git.bb

在我的 local.conf 中,我在最后添加了以下内容:

IMAGE_INSTALL_append = " bbexample "
IMAGE_INSTALL_append = " simpledaemon "
IMAGE_INSTALL_append = " packagegroup-core-ssh-openssh "
IMAGE_INSTALL_append = " openssh-sftp-server "


DISTRO_FEATURES_append = " systemd"
VIRTUAL-RUNTIME_init_manager = " systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = ""

我的.bb文件如下:

# Recipe created by recipetool
# This is the basis of a recipe and may need further editing in order to be fully functional.
# (Feel free to remove these comments when editing.)

# WARNING: the following LICENSE and LIC_FILES_CHKSUM values are best guesses - it is
# your responsibility to verify that the values are complete and correct.
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=ca119cf6dcda0f0883a416a3e7f94cc2"

SRC_URI = "git://github.com/MichaelBMiner/simpledaemon;protocol=https"

# Modify these as desired
PV = "1.0+git${SRCPV}"
SRCREV = "a37a89df4d53bca97c12c8908cbe8552032417b4"

inherit systemd

S = "${WORKDIR}/git"

SYSTEMD_SERVICE_${PN} = "simpledaemon.service"
do_compile () {
    ${CC} ${LDFLAGS} simpledaemon.c -o simpledaemon
}
do_install () {
    install -d ${D}${bindir}
    install -m 0755 ${WORKDIR}/simpledaemon ${D}${bindir}
    install -d ${D}${systemd_unitdir}/system
    install -m 0644 ${WORKDIR}/simpledaemon.service ${D}${systemd_unitdir}/system sed -i -e     's,@BINDIR@,${bindir},g' ${D}${systemd_unitdir}/system/simpledaemon.service
}

# NOTE: if this software is not capable of being built in a separate build directory
# from the source, you should replace autotools with autotools-brokensep in the
# inherit line
inherit autotools

# Specify any options you want to pass to the configure script using EXTRA_OECONF:
EXTRA_OECONF = ""

我的simpledaemon.service如下:

[Unit]
Description=Example service
[Service]
Type=forking
ExecStart=@BINDIR@/simple-service
[Install]
WantedBy=multi-user.target

我从嵌入式 Linux Development Using Yocto Project Cookbook Second Edition 一书中获得了所有这些信息。

在我尝试添加此新服务之前,我的所有构建都已成功。本书没有提及用于 systemd 服务的 init shell 脚本。我还从 GitHub 中提取代码,而不是从我的构建目录中提取代码(您可以查看存储库)。

当我 运行 bitbake 时,出现错误 Didn't find service unit 'simpledaemon.service', specified in SYSTEMD_SERVICE_simpledaemon.。这告诉我这是一个路径错误,我只能假设它是由我的 GitHub 结构引起的。谁能对此有所启发?

你能在示例中移动 simpledaemon 目录 dir 吗?

可以参考obmc-op-control-host_git.bb

您的食谱有一些问题导致了您的错误:

1。使用正确的 SRCREV:

SRCREV = "a37a89df4d53bca97c12c8908cbe8552032417b4"

上面的 SRCREV 是指在添加 .service 文件之前您的存储库中的提交。将其更改为最新提交,2140a0646b3ffc6595c50ac549dc6f1220f66c28

2。删除 autotools 已经描述的步骤:

由于您的源代码使用了 autotools 而您的 Yocto 配方继承了 autotools class,Yocto 将自动 运行 相当于 ./configuremakemake install到configure/compile/install这个包。

因此,您可以删除整个 do_compile 任务和手动安装二进制文件的 do_install 的前几行:

do_compile () {
    ${CC} ${LDFLAGS} simpledaemon.c -o simpledaemon
}

do_install () {
    install -d ${D}${bindir}
    install -m 0755 ${WORKDIR}/simpledaemon ${D}${bindir}

3。使用do_install_append安装systemd服务

配方文件末尾的 inherit autotools 导致您的 do_install 任务被覆盖,因为 autotools class 将其设置为 autotools-style 方法。

因为你需要autotools do_install到运行,还有一些你自己的代码(安装systemd服务),你可以将inherit向上移动并与systemd结合:

inherit autotools systemd

然后定义一个 do_install_append 函数以附加安装 systemd 服务所需的额外步骤:

do_install_append () {
    install -d ${D}${systemd_system_unitdir}
    install -m 0644 ${S}/simpledaemon.service ${D}${systemd_system_unitdir}
    sed -i -e 's,@BINDIR@,${bindir},g' ${D}${systemd_system_unitdir}/simpledaemon.service
}

你原来的do_install也有一些错误:

  1. simpledaemon.service 文件是从 ${S} 安装的,它是源目录(即 git 目录),而不是 ${WORKDIR}
  2. sed 命令应该换行
  3. (优化)你可以用${systemd_system_unitdir}代替${systemd_unitdir}/system

4。删除未使用的 EXTRA_OECONF = ""

EXTRA_OECONF 设置为空将覆盖它具有的任何默认值,这通常由 Yocto 发行版定义。如果您确实需要 ./configure 的额外参数,请考虑使用 PACKAGECONFIG 或最后一招 EXTRA_OECONF += "--foo-bar".


完整配方:

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=ca119cf6dcda0f0883a416a3e7f94cc2"

SRC_URI = "git://github.com/MichaelBMiner/simpledaemon;protocol=https"

PV = "1.0+git${SRCPV}"
SRCREV = "2140a0646b3ffc6595c50ac549dc6f1220f66c28"

inherit systemd autotools

S = "${WORKDIR}/git"

SYSTEMD_SERVICE_${PN} = "simpledaemon.service"

do_install_append () {
    install -d ${D}${systemd_system_unitdir}
    install -m 0644 ${S}/simpledaemon.service ${D}${systemd_system_unitdir}
    sed -i -e 's,@BINDIR@,${bindir},g' ${D}${systemd_system_unitdir}/simpledaemon.service
}

调试提示

调试配方的一个有用方法是将以下命令的输出转储到一个文件并检查它:

bitbake -e your-recipe-or-image-name

如果您检查原始配方的 bitbake -e simpledaemon 的输出,并查找 do_install 的最终定义(搜索以 do_install 开头的行)。很明显,经过解析,该函数没有包含您安装服务代码的步骤。

您可以在 Viewing Variable Values 下的手册中阅读有关此技术的更多信息。