Yocto 和使用已签名 rpm 包存储库时的图像生成

Yocto and the generation of images when using repository of signed rpm packages

我有两个问题与 Yocto 和图像生成有关,当发行版配置为使用以 gpg 签名的 rpm 包存储库时。

第一个问题:在 运行 "bitbake my-image.bb" 命令之后,构建过程停止并出现以下错误消息:

ERROR: myimage-1.0-r0 do_rootfs: [log_check] myimage: found 1 error message in the logfile:
[log_check] Failed to synchronize cache for repo 'yocto-rpm', disabling.

令人惊讶的是,仅当用于为生成的 运行 发行版(即 nginx)提供 rpm 包的 http 服务器停止(不监听)时才会出现此错误。如果 http 服务器已启动(侦听),则不会出现错误消息并且 yocto 图像的生成工作正常。

根据我的理解,yocto 生成的最终图像使用构建过程生成的本地 rpm(位于 build/ 目录内)。这些软件包在本地可用(您根本不需要在 运行 发行版上为 updating/installing 发布 rpm 的远程服务器)。所以,我不明白为什么构建过程需要与远程服务器同步才能在本地构建镜像。

第二个问题:我设置我的镜像使用dnf客户端来管理rpm包。为了配置用于提供 rpm 包的远程仓库,我创建了一个 dnf_%.bbappend 文件来将这个配置文件复制到目标目录 ${D}/etc/yum.repos.d/

$ cat yocto-rpm.repo
[yocto-rpm]
name=Rocko Yocto Repo
baseurl=http://<HTTP_SERVER_IP>/rpm
enabled=1
gpgcheck=1

当 'gpgcheck' 变量设置为值 0 时,即使 http 服务器 (nginx) 停止,图像也可以正常构建。但是,如果将 gpgcheck 设置为值 1,则在停止 http 服务器 (nginx) 时无法正常构建图像。

这怎么可能? yocto 是否分析安装在最终映像上的文件的内容以自定义构建过程?

只是为了提供与此问题相关的所有信息,yocto 知道 public gpg 密钥,因为它在 distro.conf 中以这种方式定义:

INHERIT += "sign_rpm"
RPM_GPG_NAME = "gpgyocto"
RPM_GPG_PASSPHRASE = "XYZ"

INHERIT += "sign_package_feed"
PACKAGE_FEED_GPG_NAME = "gpgyocto"
PACKAGE_FEED_GPG_PASSPHRASE_FILE = "/etc/yocto.d/gpgyocto"

"gpgyocto" 密钥在 gpg 密钥环上可用:

$ gpg --list-keys
/home/<myuser>/.gnupg/pubring.kbx
----------------------------------
pub   rsa2048 2018-04-27 [SC] [expires: 2020-04-26]
      9112FBBF2073012C1463B8686235C65BD7C1F0D8
uid           [ultimate] gpgyocto <yocto@<mydomain.com>
sub   rsa2048 2018-04-27 [E] [expires: 2020-04-26]

提前感谢您的宝贵时间! :)

关于第一个问题:生成图像需要下载其他包:如果服务器不可用,则进行其他替代选择(如本地缓存),(可以说)晦涩的消息是试图通知您.

关于第二个问题:gpg 检查需要 public 密钥来验证需要下载的包签名。如果 public 密钥不可用,rpm 将应用加密逻辑弱检查(即摘要验证)并出于历史原因继续 "best effort"。正确的 "fix" 将无法从签名尚未验证的包构建映像(因为无法找到所需的 public 密钥,因为 "server" 是 "stopped"或以其他方式不可用)。

我终于解决了我的问题。添加自定义 dnf_%.bbappend 是个坏主意。所有的问题都是因此而产生的。

解决此问题的最佳方法是完全删除 dnf_%.bbappend,然后在 local.conf 中定义自定义 PACKAGE_FEED_URIS 指向您的 rpm 服务器。 Yocto 构建过程会在 ${D}/etc/yum.repos.d/ 内自动生成一个配置文件,其中包含从目标设备使用该远程仓库所需的全部内容。就这样。希望这对其他人有帮助,感谢您的支持。