这是一篇关于 tar 格式的兼容性测试文章,作者是 Michał Górny,日期为 2018 - 11 - 25,版本 1.1,遵循https://creativecommons.org/licenses/by/3.0/版权协议。
内容概述:
- 前言:tar 格式历史悠久且存在兼容性问题,作者因 Gentoo 新二进制包格式的工作而进行此测试,本文仅关注读取兼容性,不涉及写入格式。
- 测试的实现:测试了 GNU tar 1.30、libarchive 3.3.3、star 1.5.3、NetBSD pax、busybox tar、Python tarfile 模块、p7zip 16.02、7 - Zip 18.05、WinRAR 5.61 等多种 tar 实现。
- 测试输入:所有测试输入上传至https://github.com/mgorny/tar-test-inputs仓库,包括多种压缩和手动修改的 tarball。
- 常见 tar 格式:介绍了 v7、ustar、pax、GNU tar、star、sun tar 等常见 tar 格式的特点和差异。
可移植性测试结果:
- tar 格式接受度:所有测试实现都能较好处理常见 tar 格式,GNU 格式的额外时间戳会引起一些混淆,star 格式除 busybox 外大多被接受,pax 格式会将扩展头提取为文件。
- 长路径名:测试实现大多支持 ustar 和 GNU 格式的长路径,pax 格式的长路径元数据可提取为文本文件,star 格式的长路径仅原始实现和 Python 支持。
- 大文件大小:除 NetBSD pax 外,其他工具大多支持 12 位和 base - 256 表示的大文件大小,pax 格式可通过扩展属性指定文件大小。
- 用户和组信息:大多数实现支持大的用户和组标识符,32 位长的用户名大多被支持,GNU tar 在处理用户名时存在特殊情况,Windows 实现未测试。
- 时间戳:大多数实现支持大的正时间戳,base - 256 格式更便携,pax 格式支持负时间戳,只有 GNU tar、libarchive 和 star 支持 atime 和 ctime,Python、p7zip 和 Windows 归档器不提供获取 atime 或 ctime 的方法。
- 扩展文件元数据:GNU tar、libarchive 和 star 支持扩展文件属性,ACLs 和通用 xattrs 被一致支持,文件标志仅 libarchive 和 star 支持且不完全兼容,libarchive 支持额外的 base64 编码的 xattrs。
- 稀疏文件:稀疏文件支持有限,GNU 格式最受支持,GNU pax 扩展仅 GNU tar、libarchive 和 Python 支持,star 格式仅初始实现支持,其他实现不支持。
- 卷标:卷标是 GNU tar 扩展,只有 GNU tar 和 libarchive 提供明确支持,pax 格式的行为难以确定。
- 多卷归档:支持情况不佳,GNU tar 只能提取自己的多卷格式,star 可以提取 GNU 和自己的格式,其他工具大多出错。
- 总结:建议使用 POSIX ustar 格式,避免扩展,长路径可使用 ustar 或 GNU 格式,大文件使用 GNU 格式,扩展文件元数据使用 pax 格式,避免使用稀疏文件和卷标,多卷归档使用 split(1)。
- 参考文献:列出了测试中使用的各种 tar 实现和相关文档的链接。
关键信息和重要细节:
- 详细介绍了不同 tar 格式在各种特性上的支持情况,如路径名长度、文件大小、时间戳、用户组信息等。
- 给出了各种 tar 实现在处理不同 tar 格式和特性时的测试结果,包括是否正确提取、是否支持某些扩展等。
- 总结了在不同需求下应选择的 tar 格式和避免使用的特性,以提高 tar 格式的可移植性。
- 强调了本文仅关注读取兼容性,不涉及写入格式的创建。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。