如何在引导输出或 /etc/issue 中包含 git 图像层修订版?
How to include git revision of image layer in boot output or /etc/issue?
我正在为 SBC 创建一个 Poky 图像,我想为用户提供一种方法来查找用于创建图像的配方文件的 SHA1 ID。
食谱内容如下:
SUMMARY = "Toradex Embedded Linux Console Sporian Yocto version"
DESCRIPTION = "A Yocto Poky build derived from core-image-minimal"
LICENSE = "MIT"
#start of the resulting deployable tarball name
export IMAGE_BASENAME = "Sporian-Console-Image-Yocto"
IMAGE_NAME_apalis-imx6 = "Apalis-iMX6_${IMAGE_BASENAME}"
require /home/rdepew/workspace/oe-core3/poky/meta/recipes-core/images/core-image-minimal.bb
IMAGE_INSTALL += " \
packagegroup-core-ssh-openssh \
sqlite3 \
avro-c \
"
这是 SBC 启动时的控制台输出:
Poky (Yocto Project Reference Distro) 2.4.3 apalis-imx6 /dev/ttymxc0
apalis-imx6 login: root
root@apalis-imx6:~# uname -a
Linux apalis-imx6 4.1.44-2.7.4+gb1555bfbf388 #1 SMP Tue Oct 9 17:35:02 UTC 2018 armv7l GNU/Linux
root@apalis-imx6:~#
这里是/etc/issue的内容。请注意,这些是默认内容:
Poky (Yocto Project Reference Distro) 2.4.3 \n \l
假设包含配方的存储库的 SHA1 ID 是 ea4c5bb42e7542...。我想在启动期间或响应用户命令时打印 SHA1 ID(类似于 'uname')。我该怎么做?
我认为 ${SRCPV} 可能是我的问题的解决方案,但我不能屈服于我的意志。
Linux 和 U-Boot git 哈希值来自 Linux/U-Boot git 存储库。这就是 OpenEmbedded 通常的做法。当然有一种方法可以将 git 哈希从 OE 传递到 U-Boot/Kernel 构建系统,但我不建议这样做,因为这不是通常的做法。
至于 /etc/issue
文件,这通常在 meta/recipes-core/base-files/base-files_3.0.14.bb
配方中生成。将 bbappend 添加到您的层并扩展任务应该是相当直接的,例如像这样:
def get_layer_rev(d):
return bb.process.run('git rev-parse HEAD')
LAYER_REV="${@get_layer_rev(d)}"
do_install_basefilesissue_append() {
# Overwrite /etc/issue with a custom version of it
printf "${DISTRO_NAME} " > ${D}${sysconfdir}/issue
printf "${LAYER_REV}" >> ${D}${sysconfdir}/issue
}
派对有点晚了,但我意识到 实际上并没有保存 git 修订版
配方层,而是构建目录所在层的 git 修订版(如果构建目录不在 git 存储库中,则失败)。
因此我最终使用了这样的东西 git-revision-file.bb
:
LICENSE = "MIT"
SUMMARY = "Place a git revision file in the sysroot"
inherit image-buildinfo
REVISION_INFO_FILE = "build-layers-git-revisions"
S = "${WORKDIR}"
python do_configure() {
full_path = d.expand("${S}/${REVISION_INFO_FILE}")
with open(full_path, 'w') as file:
file.writelines(get_layer_revs(d))
}
do_install() {
install -d ${D}${sysconfdir}
install -m 0644 ${S}/${REVISION_INFO_FILE} ${D}${sysconfdir}
}
FILES_${PN} = "${sysconfdir}"
这会在 /etc/build-layers-git-revisions
中保存构建的每一层的 git 分支和修订版。
如果您只想对图层进行 git 修订,请使用 metadata_scm.bbclass
的 base_get_metadata_git_revision(path, d)
。但我认为以上内容为您的构建提供了更完整的信息。
您可以将 INHERIT += "image-buildinfo"
添加到您的配置中。这将创建一个文件 /etc/build
,其中包含类似
的内容
-----------------------
Build Configuration: |
-----------------------
DISTRO = poky
DISTRO_VERSION = 4.0.1
-----------------------
Layer Revisions: |
-----------------------
meta = HEAD:cb8647c08959abb1d6b7c2b3a34b4b415f66d7ee
meta-poky = HEAD:79b0270f55d69ecae8ada6dce492b7c561c56cca
meta-oe = HEAD:166ef8dbb14ad98b2094a77fcf352f6c63d5abf2
我正在为 SBC 创建一个 Poky 图像,我想为用户提供一种方法来查找用于创建图像的配方文件的 SHA1 ID。
食谱内容如下:
SUMMARY = "Toradex Embedded Linux Console Sporian Yocto version"
DESCRIPTION = "A Yocto Poky build derived from core-image-minimal"
LICENSE = "MIT"
#start of the resulting deployable tarball name
export IMAGE_BASENAME = "Sporian-Console-Image-Yocto"
IMAGE_NAME_apalis-imx6 = "Apalis-iMX6_${IMAGE_BASENAME}"
require /home/rdepew/workspace/oe-core3/poky/meta/recipes-core/images/core-image-minimal.bb
IMAGE_INSTALL += " \
packagegroup-core-ssh-openssh \
sqlite3 \
avro-c \
"
这是 SBC 启动时的控制台输出:
Poky (Yocto Project Reference Distro) 2.4.3 apalis-imx6 /dev/ttymxc0
apalis-imx6 login: root
root@apalis-imx6:~# uname -a
Linux apalis-imx6 4.1.44-2.7.4+gb1555bfbf388 #1 SMP Tue Oct 9 17:35:02 UTC 2018 armv7l GNU/Linux
root@apalis-imx6:~#
这里是/etc/issue的内容。请注意,这些是默认内容:
Poky (Yocto Project Reference Distro) 2.4.3 \n \l
假设包含配方的存储库的 SHA1 ID 是 ea4c5bb42e7542...。我想在启动期间或响应用户命令时打印 SHA1 ID(类似于 'uname')。我该怎么做?
我认为 ${SRCPV} 可能是我的问题的解决方案,但我不能屈服于我的意志。
Linux 和 U-Boot git 哈希值来自 Linux/U-Boot git 存储库。这就是 OpenEmbedded 通常的做法。当然有一种方法可以将 git 哈希从 OE 传递到 U-Boot/Kernel 构建系统,但我不建议这样做,因为这不是通常的做法。
至于 /etc/issue
文件,这通常在 meta/recipes-core/base-files/base-files_3.0.14.bb
配方中生成。将 bbappend 添加到您的层并扩展任务应该是相当直接的,例如像这样:
def get_layer_rev(d):
return bb.process.run('git rev-parse HEAD')
LAYER_REV="${@get_layer_rev(d)}"
do_install_basefilesissue_append() {
# Overwrite /etc/issue with a custom version of it
printf "${DISTRO_NAME} " > ${D}${sysconfdir}/issue
printf "${LAYER_REV}" >> ${D}${sysconfdir}/issue
}
派对有点晚了,但我意识到
因此我最终使用了这样的东西 git-revision-file.bb
:
LICENSE = "MIT"
SUMMARY = "Place a git revision file in the sysroot"
inherit image-buildinfo
REVISION_INFO_FILE = "build-layers-git-revisions"
S = "${WORKDIR}"
python do_configure() {
full_path = d.expand("${S}/${REVISION_INFO_FILE}")
with open(full_path, 'w') as file:
file.writelines(get_layer_revs(d))
}
do_install() {
install -d ${D}${sysconfdir}
install -m 0644 ${S}/${REVISION_INFO_FILE} ${D}${sysconfdir}
}
FILES_${PN} = "${sysconfdir}"
这会在 /etc/build-layers-git-revisions
中保存构建的每一层的 git 分支和修订版。
如果您只想对图层进行 git 修订,请使用 metadata_scm.bbclass
的 base_get_metadata_git_revision(path, d)
。但我认为以上内容为您的构建提供了更完整的信息。
您可以将 INHERIT += "image-buildinfo"
添加到您的配置中。这将创建一个文件 /etc/build
,其中包含类似
-----------------------
Build Configuration: |
-----------------------
DISTRO = poky
DISTRO_VERSION = 4.0.1
-----------------------
Layer Revisions: |
-----------------------
meta = HEAD:cb8647c08959abb1d6b7c2b3a34b4b415f66d7ee
meta-poky = HEAD:79b0270f55d69ecae8ada6dce492b7c561c56cca
meta-oe = HEAD:166ef8dbb14ad98b2094a77fcf352f6c63d5abf2