Bitbake:"元数据不是确定性的,需要修复"

Kon*_*yak 6 bitbake yocto

我正在构建一个Bitbake配方并收到以下错误消息:

ERROR: When reparsing virtual:native:/path/to/poky/meta/recipes-devtools/cve-check-tool/cve-check-tool_5.6.4.bb.do_populate_cve_db, the basehash value changed from 0b637979bcb5db4263f9ed97497a6330 to bcd28a5efe646ed4d327fefa349f889c. The metadata is not deterministic and this needs to be fixed.

这在一个干净的版本(之后bitbake -c cleanall -c cleansstate <recipe>)中再现.

这个错误的原因是什么?尚未从上游版本修改配方.

小智 8

我偶然发现了类似的错误。对我来说,它发生在 do_install 例程中。我的目标是存储一个文件的副本,其名称附加有 ${DATETIME} ,指的是特定位置的构建时间。

显然,食谱在构建过程中被解析多次,并且由于第二次解析时时间已更改,因此插入了不同的 ${DATETIME} 值,因此元数据被识别为已更改。

  • @Benedikt,那么在 yocto 中进行时间戳记的正确方法是什么? (2认同)

小智 7

我使用的修复方法是转到该配方并在最后添加一个空行,这将有助于 bitbake 重新识别配方

  • 特别是,我在我正在烘焙的图像配方中添加了一行,这解决了。 (2认同)

grm*_*rmm 7

最简单的解决方案:touch <recipename>. 然后cleansstate按照你的食谱运行。然后从这里开始照常进行。


小智 6

以下是添加此诊断消息的 yocto 补丁 https://patchwork.openembedded.org/patch/133517/

这是提交消息,解释了其原因以及获取问题更多详细信息的可能方法:

Bitbake 可以在构建过程中解析炊具和工作器中的元数据。如果元数据不是确定性的,它可能会在这两个解析之间发生变化,这会让事情变得很混乱。事实证明,目前很难调试这些问题。

此补丁可确保将原始解析中的 basehash 传递给工作人员,并在重新解析时检查这些内容的一致性。如果发现不一致,则向用户显示错误消息。

siggen.py 中有调试代码(请参阅“慢但可用于调试不匹配的基哈希”注释代码),由于性能问题,我们默认不启用此功能。如果您遇到此消息,请启用此代码,您将在 tmp/stamps 中找到“sigbasedata”文件,这些文件应与此错误消息中显示的哈希值相对应。文件上的 bitbake-diffsigs 应显示哪些变量正在发生变化。

签字人:Richard Purdie

  • 此信息看似正确,但没有帮助。这是 yocto 团队典型的大口胡言乱语。他们似乎发明了一种新的语言……当不需要一种语言时。什么是炊具?确定性意味着什么?“让事情变得很混乱”是什么意思/暗示?调试起来有什么困难?什么是基本哈希?有什么矛盾?什么是 siggen.py? (7认同)
  • 那么,解决办法是什么? (3认同)

小智 5

它帮助我删除配方的共享缓存:

bitbake recipename -c cleansstate
Run Code Online (Sandbox Code Playgroud)

然后,一切都像魅力一样发挥作用。

  • 对我来说不是一个解决办法。 (2认同)

cod*_*ist 4

发生这种情况是因为任务被评估两次,第一次由 Cooker 评估,第二次由 Bitbake Worker 评估。任务哈希会计算两次,如果不匹配,则认为元不稳定。基本哈希值是根据任务脚本中使用的变量计算得出的。因此,如果您使用与时间相关的变量(例如 DATETIME),您将收到此哈希不匹配错误。为了避免此错误,您需要使用 VarFlags 从哈希计算中排除变量。

do_something[vardepsexclude]="DATETIME"
Run Code Online (Sandbox Code Playgroud)

在这里您可以找到更详细的解释。 https://www.kc8apf.net/2017/01/tired-of-taskhash-mismatch/