是否有没有文件元数据的标准存档格式?

是否有没有文件元数据的标准存档格式?

对于某些上下文,我正在开发一个类似包管理器的实用程序,它支持以非 root 用户身份构建包。我想确保 root 用户构建的包和非 root 用户构建的包绝对无法区分,而不是使用存档tar并忽略元数据。

是否有一种格式/实用程序有点类似于tar存档内的文件和目录不(并且理想情况下不能)包含权限位、时间戳和所有权相关信息等元数据?我希望存档能够由其中存在的目录和文件以及文件内容来完整描述(因此它也无法存储符号链接或硬链接)。

我也可以接受无法区分绝对路径和相对路径的存档格式(即/a/b映射a/b到同一事物,因为存档的路径概念与 Unix 路径不同)。

答案1

使用 tar(或 cpio)时无法删除用户信息,但可以强制他们避免区分软件包的制作者。使用 tar 并强制使用一些参数来避免区分构建该包的用户(请参阅 参考资料man tar):

  • -P, --absolute-names:强制 tar 不删除前导“/”(默认情况下会这样做)。如果您不能在命令行上放置绝对路径,则您提到的路径将被保留(如果您无法在所需的根目录中进行 cd,请尝试使用 -C 或 --change-directory )
  • --owner:强制用户存储在 tar 文件中,忽略文件/目录的实际所有者(例如 --owner=root)
  • --group:强制组存储在 tar 文件中(例如 --group=root)。
  • --no-acls:避免在 tar 文件中复制您自己的 ACL
  • --numeric-owner, --numeric-group: 屏蔽本地仅存储 UID/GID 的帐户的实际名称(如果您强制 root,则不需要,因为 root 始终为 0)
  • --mtime:强制所有文件/目录的修改时间,以掩盖它们实际修改的时间

请注意,具有绝对路径的符号链接将按原样存储。然而,当相对符号链接指向包树内部时,最好始终使用它们。

答案2

我发现的最好的是以下内容,它尝试通过

  • 对文件列表进行排序
  • 使用数字 0 表示所有者和组
  • 为所有者删除r和位,以及w全部其他人的权限
  • 将 修复mtime为 UNIX 纪元
find <files> -print0 \
| sort -z \
| tar -cf <output>.tar \
      --format=posix \
      --numeric-owner \
      --owner=0 \
      --group=0 \
      --mode="go-rwx,u-rw" \
      --mtime='1970-01-01' \
      --no-recursion \
      --null \
      --files-from -

我在以下位置写了更多相关内容:http://h2.jaguarpaw.co.uk/posts/reproducible-tar/

相关内容