为什么GNU tar指定--format=pax参数生成的归档内会出现ustar标识?
核心原因解释
- pax(POSIX tar)格式本身就是ustar格式的标准扩展超集,并非完全独立的二进制结构。根据POSIX规范,所有pax归档的普通文件条目,首先必须写入符合ustar规范的基础头结构,其中单个512字节头块内偏移256字节的位置(也就是你xxd输出里的0x100、0x300、0x500地址),固定存放8字节的ustar magic结构:1个空字节、
ustar字符串、1个空字节、00版本号,这是标准强制要求,并非实现bug。 - 你指定
--format=pax的实际作用是:当文件元数据(超长文件名、特殊权限、非常规时间戳、扩展属性等)超出ustar基础头的承载能力时,自动生成额外的pax扩展头存储溢出的元数据,而非回退到老式v7/GNU格式做兼容。 - 你本次测试的场景完全没有触发pax扩展头的生成条件:三个空txt文件的文件名长度极短、所有元数据(mtime、owner、group)都是ustar头可直接存储的常规值,因此整个归档只会写入三个符合ustar规范的基础头,不会生成额外的PaxHeaders扩展条目,自然每个基础头里都会出现标准的ustar标识字符串。
补充说明:如果要触发pax扩展头的生成逻辑,可以在测试目录中添加文件名长度超过ustar头限制(通常为255字节)的文件,此时tar会自动生成对应的PaxHeaders条目;这类条目的基础头同样会携带ustar标识,只是会在头块后追加存储pax格式的键值对扩展元数据。
内容的提问来源于stack exchange,提问作者therealneil
相关产品推荐
相关产品推荐

