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

时间:2018-04-26 12:03:28

标签: rpm yocto gnupg signed

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

第一个问题:运行“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.

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

根据我的理解,yocto生成的最终图像使用构建过程(位于build / dir内)生成的本地rpms。这些软件包在本地可用(您不需要发布rpms的远程服务器,以便在运行的发行版上进行更新/安装)。所以,我不明白为什么构建过程需要与远程服务器同步以在本地构建映像。

第二个问题:我设置我的映像以使用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知道公共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"

gpg键环上有“gpgyocto”键:

$ 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]

提前感谢您的时间! :)

2 个答案:

答案 0 :(得分:1)

重新提出第一个问题:生成图像需要下载其他软件包:如果服务器不可用,则进行其他替代选择(如本地缓存),(可以说是)模糊的消息是尝试通知您。 / p>

第二个问题:gpg检查需要公钥来验证需要下载的包签名。如果公钥不可用,则rpm应用加密逻辑弱检查(即摘要验证)并由于历史原因继续“尽力而为”。正确的“修复”是无法从尚未验证签名的包中构建映像(因为“服务器”被“停止”或不可用,因此无法找到所需的公钥)。

答案 1 :(得分:0)

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

解决此问题的最佳方法是完全删除dnf _%。bbappend,然后在local.conf中定义指向rpm服务器的自定义PACKAGE_FEED_URIS。 Yocto构建过程自动生成$ {D} /etc/yum.repos.d/中的配置文件,并且需要使用来自目标设备的远程仓库。就这样。希望这有助于其他人,并感谢您的支持。