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的建议。