我希望我的 initramfs 具有相同的哈希值,无论我何时何地构建它,如果文件的内容相同(并且由 root 拥有并具有相同的权限)。我在 GNU cpio 中没有看到任何选项来删除或设置存档中文件的时间戳。是否有一种相对标准的方法来处理 cpio 和其他存档程序的输入,以便您可以获得可重现的产品?
除此之外,是否有一个传统的“我们没有给出日期”时间戳?大多数软件都不会注意到什么?例如 0 纪元秒?
例如,如果我对 initramfs 的输入目录进行查找并手动将所有时间戳设置为 0,我可以构建该存档,将其提取到另一个系统上,重复该过程,然后再次构建它并获得位相同文件?
答案1
较新版本的 GNUcpio
有一个--reproducible
标志,可以在一定程度上满足您的要求。我的理解是剥离非决定论工具将在事后处理时间戳要求。touch
当然,您可以在打包前设置时间。
答案2
您可以使用它来完成此操作star
,它是find
基于libfind
.
致电例如:
star -c H=cpio -find somedir -chmtime 2020-05-20T12:10:12 > archive.cpio
当然,find
如果您愿意,您可以对不同的时间戳使用复杂的规则。
查看http://sourceforge.net/projects/schilytools/files/star
获取最新 tarball 中的最新源代码schilytools
。
顺便说一句:我相信以下内容可能看起来像广告,但已请求提供这些信息,并且从一开始就是开源的。star
应该是众所周知的,UNIX
因为它是最古老的免费tar
实现 - 它始于 1982 年,到 2020 年已有 38 岁了。
star
tar
是我所知道的最成熟、功能最完整的实现。其他实现通常从 中复制存档格式增强的概念,它也由其他人引入和使用的属性前缀star
来标识。SCHILY.*
star
32 年来,它分成两个进程,共享一个可配置的 FIFO 以获得最大速度。star -copy
比任何其他已知的 UNIX 树复制方法都要快。
30 年来,它支持并自动检测各种存档格式。
17 年来,它是一个通用的归档工具,实现了对各种 UNIX 归档器的命令行兼容性tar
,cpio
pax
甚至是不兼容的GNU tar
。
自 16 年来,它包括find
通过libfind
.这有助于避免学习不必要的新使用概念,因为每个人都应该知道如何使用find
.
两年以来,它完全消除了路径名长度限制。
看http://cdrtools.sourceforge.net/private/star.html和http://schilytools.sourceforge.net/man/man1/star.1.html了解更多信息。