TAR文件格式问题

时间:2013-10-10 14:23:59

标签: compression zip gzip tar bzip2

我不清楚,正确的.tar文件格式是什么,因为我在使用三种方案时遇到了正确的功能(见下文)

根据我一直在使用的.tar规范,magic字段(ustar)是以空值终止的字符串,version字段是八进制数,没有尾随空值。

但是我已经查看了我在服务器上找到的几个.tar文件,我发现了magicversion字段的不同实现,并且所有这三个文件似乎都正常工作,可能是因为系统忽略这些字段。

在以下示例>>

中查看单词 ustar root 之间的不同(3)字节

情景1(20 20 00):

 000000F0      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............
 000000FC      00 00 00 00 | 00 75 73 74 | 61 72 20 20      .....ustar  
 00000108      00 72 6F 6F | 74 00 00 00 | 00 00 00 00      .root.......
 00000114      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............

情景2(00 20 20):

 000000F0      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............
 000000FC      00 00 00 00 | 00 75 73 74 | 61 72 00 20      .....ustar. 
 00000108      20 72 6F 6F | 74 00 00 00 | 00 00 00 00      root.......
 00000114      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............

场景3(00 00 00):

 000000F0      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............
 000000FC      00 00 00 00 | 00 75 73 74 | 61 72 00 00      .....ustar..
 00000108      00 72 6F 6F | 74 00 00 00 | 00 00 00 00      .root.......
 00000114      00 00 00 00 | 00 00 00 00 | 00 00 00 00      ............

哪一种格式正确?

2 个答案:

答案 0 :(得分:5)

在我看来,没有一个例子是正确的,至少不适用于POSIX格式 正如您可以阅读here

/* tar Header Block, from POSIX 1003.1-1990. */
/* POSIX header */

struct posix_header {   /* byte offset */
  char name[100];               /*   0 */
  char mode[8];                 /* 100 */
  char uid[8];                  /* 108 */
  char gid[8];                  /* 116 */
  char size[12];                /* 124 */
  char mtime[12];               /* 136 */
  char chksum[8];               /* 148 */
  char typeflag;                /* 156 */
  char linkname[100];           /* 157 */
  char magic[6];                /* 257 */
  char version[2];              /* 263 */
  char uname[32];               /* 265 */
  char gname[32];               /* 297 */
  char devmajor[8];             /* 329 */
  char devminor[8];             /* 337 */
  char prefix[155];             /* 345 */
};

#define TMAGIC   "ustar"        /* ustar and a null */
#define TMAGLEN  6
#define TVERSION "00"           /* 00 and no null */
#define TVERSLEN 2

您的第一个示例(Scenario 1)的格式似乎与旧的GNU标题格式匹配:

/* OLDGNU_MAGIC uses both magic and version fields, which are contiguous.
   Found in an archive, it indicates an old GNU header format, which will be
   hopefully become obsolescent.  With OLDGNU_MAGIC, uname and gname are
   valid, though the header is not truly POSIX conforming */

#define OLDGNU_MAGIC "ustar  "  /* 7 chars and a null */

在第二个和第三个示例(Scenario 2Scenario 3)中,version字段设置为意外值(根据上述文档,正确的值应为{ {1}} ASCII或00十六进制),因此该字段很可能被忽略。

答案 1 :(得分:1)

如果执行此命令,请使用Fedora 18:

tar --format=posix -cvf testPOSIX.tar test.txt

我有一个POSIX tar文件格式:ustar \ 0(0x757374617200)

否则,如果我执行此操作:

tar --format=gnu -cvf testGNU.tar test.txt

我有一个GNU tar文件格式:ustar 0x20 0x20 0x00(0x7573746172202000)(旧gnu格式)

来自/ usr / share / magic文件:

# POSIX tar archives
257 string      ustar\0     POSIX tar archive
!:mime  application/x-tar # encoding: posix
257 string      ustar\040\040\0 GNU tar archive
!:mime  application/x-tar # encoding: gnu

0x20是八进制的40。

我还尝试使用以下命令编辑十六进制代码:

00 20 20

然而tar工作正常。我没有问题地将test.txt exctract。

但是当我尝试使用以下代码编辑十六进制代码时

00 00 00

焦油未被识别。

所以,我的结论是正确的格式是:

20 20 00