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
吗?
您的食谱有一些问题导致了您的错误:
1。使用正确的 SRCREV
:
SRCREV = "a37a89df4d53bca97c12c8908cbe8552032417b4"
上面的 SRCREV
是指在添加 .service
文件之前您的存储库中的提交。将其更改为最新提交,2140a0646b3ffc6595c50ac549dc6f1220f66c28
2。删除 autotools 已经描述的步骤:
由于您的源代码使用了 autotools 而您的 Yocto 配方继承了 autotools class,Yocto 将自动 运行 相当于 ./configure
、make
、make 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
也有一些错误:
simpledaemon.service
文件是从 ${S}
安装的,它是源目录(即 git 目录),而不是 ${WORKDIR}
sed
命令应该换行
- (优化)你可以用
${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 下的手册中阅读有关此技术的更多信息。
我正在尝试在启动时启动服务,但是我在构建时遇到了问题。 这是我自定义图层中的树结构
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
吗?
您的食谱有一些问题导致了您的错误:
1。使用正确的 SRCREV
:
SRCREV = "a37a89df4d53bca97c12c8908cbe8552032417b4"
上面的 SRCREV
是指在添加 .service
文件之前您的存储库中的提交。将其更改为最新提交,2140a0646b3ffc6595c50ac549dc6f1220f66c28
2。删除 autotools 已经描述的步骤:
由于您的源代码使用了 autotools 而您的 Yocto 配方继承了 autotools class,Yocto 将自动 运行 相当于 ./configure
、make
、make 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
也有一些错误:
simpledaemon.service
文件是从${S}
安装的,它是源目录(即 git 目录),而不是${WORKDIR}
sed
命令应该换行- (优化)你可以用
${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 下的手册中阅读有关此技术的更多信息。