为什么使用systemd自动启动不起作用



Yocto版本是战士。我用一个GO/golang用户应用程序(https服务器(做了一个yocto项目,它在raspi3上运行得很好。现在我正试着在yocto图像上自动启动它,但没有成功。我知道有很多关于这方面的问题,但我没有发现有帮助的东西。我试着遵循这篇文章中的所有步骤使用yocto启用systemd服务但它不会自动启动raspi。

这些文件在raspi为我找到的服务:

/lib/systemd/system/https-server.service 
/etc/systemd/system/multi-user.target.wants/https-server.service

如果我手动启动应用程序,它本身运行得很好,它位于/usr/bin/https服务器上的raspi

我的build/conf/local.conf:

IMAGE_INSTALL_append = " kernel-image kernel-devicetree sudo apt dnsmasq nano dhcpcd git glibc-utils localedef curl go https-server"
meta-https-server/
├── conf
│   └── layer.conf
└── recipes-https-server
└── https-server
├── files
│   ├── https-server.go
│   ├── https-server.service
│   ├── mytest
│   ├── server.crt
│   ├── server.key
│   └── testvideo.mp4
├── go-sw.inc
└── https-server.bb

https-server.bb

require go-sw.inc
inherit go systemd
#inherit go update-rc.d systemd

SRC_URI += "file://https-server.service"
SRC_URI += "file://https-server.go"
SYSTEMD_PACKAGES = "${PN}"
INITSCRIPT_PACKAGES = "${PN}"
SYSTEMD_SERVICE_${PN} = "https-server.service"
# Path
MY_KEY = "/data/yocto/2020-04-21-poky-warrior/poky-warrior/meta-https-server/recipes-https-server/https-server/files/server.key"
MY_CERT = "/data/yocto/2020-04-21-poky-warrior/poky-warrior/meta-https-server/recipes-https-server/https-server/files/server.crt"
TESTVIDEO = "/data/yocto/2020-04-21-poky-warrior/poky-warrior/meta-https-server/recipes-https-server/https-server/files/testvideo.mp4"
MY_TEST = "/data/yocto/2020-04-21-poky-warrior/poky-warrior/meta-https-server/recipes-https-server/https-server/files/mytest"
# COMPILER
do_compile() {
go build /data/yocto/2020-04-21-poky-warrior/poky-warrior/meta-https-server/recipes-https-server/https-server/files/https-server.go
}

# INSTALL
do_install() {
#   install -d to create directories, "${D}/${bindir}" is /usr/bin
#   systemd
install -d ${D}${systemd_unitdir}/system
install -m 0644 ${WORKDIR}/https-server.service ${D}${systemd_unitdir}/system
#   HTTPS certificate and key
install -d "${D}/${bindir}"
install -m 0755 "${MY_KEY}"    "${D}/${bindir}"
install -m 0755 "${MY_CERT}"   "${D}/${bindir}"
install -m 0777 "${TESTVIDEO}" "${D}/${bindir}"
install -m 0777 "${MY_TEST}"   "${D}/${bindir}"
#   HTTPS Server Software
install -m 0755 "${S}/build/https-server" "${D}/${bindir}"
}
FILES_${PN} += "${bindir}"
FILES_${PN} += "${libexecdir}"
FILES_${PN} += "${systemd_system_unitdir}"

REQUIRED_DISTRO_FEATURES= "systemd"

服务https-server.service

[Unit]
Description=HTTPS Server sw startup script
[Service]
ExecStart=/usr/bin/https-server
[Install]
WantedBy=multi-user.target

我发现了问题的原因:

在build/conf/local.conf的本地配置中我只有这个:

DISTRO_FEATURES_append = " systemd "

在我添加以下内容之后:

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

它运行良好。进程https服务器在启动时启动。我用ps检查了启动后正在运行的进程systemctl无法处理我的核心映像最小映像:

root@raspberrypi3:~# ps
[...]
152 root      861m S    /usr/bin/https-server
[...]
root@raspberrypi3:~#

所以这就产生了不同。不知道我的空间是否缺失DISTRO_FEATURES_apped="systemd"也是错误的??

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

@Nayfe建议的oe-pkdata util在这里是一个非常有用的工具:

user@machine:[...]/poky-warrior/build$ 
oe-pkgdata-util list-pkg-files -p https-server
https-server:
/lib/systemd/system/https-server.service
/usr/bin/https-server
/usr/bin/mytest
/usr/bin/server.crt
/usr/bin/server.key
/usr/bin/testvideo.mp4
https-server-dbg:
/usr/bin/.debug/https-server
https-server-dev:
https-server-ptest:

我还研究了上面的配方https-server.bb正如@Nayfe建议的那样,避免绝对路径。这不是原因问题,但风格不好。

不要使用/data/yocto/2020-04-21-poky-wior/poky-warior/meta-https-server/precipes-https-server/https-server/files/prefix,而是在SRC_URI中添加每个文件。

require go-sw.inc
inherit go systemd
#  "${D}/${bindir}" is /usr/bin 
#  ${WORKDIR} is path at local directory, 
#  this can be used instead of absolute paths
SRC_URI += "file://https-server.service"
SRC_URI += "file://https-server.go"
SRC_URI += "file://server.key"
SRC_URI += "file://server.crt"
SRC_URI += "file://testvideo.mp4"
SRC_URI += "file://mytest"
SYSTEMD_PACKAGES = "${PN}"
INITSCRIPT_PACKAGES = "${PN}"
SYSTEMD_SERVICE_${PN} = "https-server.service"
# COMPILER
do_compile() {
go build ${WORKDIR}/https-server.go
}

# INSTALL
do_install() {
#   install -d to create directories, "${D}/${bindir}" is /usr/bin
#   systemd
install -d ${D}${systemd_unitdir}/system
install -m 0644 ${WORKDIR}/https-server.service ${D}${systemd_unitdir}/system
#   HTTPS certificate, key and testdata for https-server
install -d "${D}/${bindir}"
install -m 0755  ${WORKDIR}/server.key     "${D}/${bindir}"
install -m 0755  ${WORKDIR}/server.crt     "${D}/${bindir}"
install -m 0777  ${WORKDIR}/testvideo.mp4  "${D}/${bindir}"
install -m 0777  ${WORKDIR}/mytest         "${D}/${bindir}"
#   HTTPS Server Software
install -m 0755 "${WORKDIR}/build/https-server" "${D}/${bindir}"
}
# FILES_${PN} is Yocto’s way of specifying
# which files are expected to be installed along with which package
# (${PN} is a variable holding the main package’s name).
FILES_${PN} += "${bindir}"
FILES_${PN} += "${libexecdir}"
FILES_${PN} += "${systemd_system_unitdir}"
REQUIRED_DISTRO_FEATURES= "systemd"

感谢@kostix和@nayfe的建议。

最新更新