tar 格式的标头和结构

use*_*893 4 tar archive

我有一个学校项目,这意味着在 unix 系统中制作像 tar 一样的 ac 程序。我有一些问题希望有人向我解释:

  1. 档案的维度。我了解到(通过浏览互联网)一个档案有一个定义数量的块,每个块 512 字节。所以标题有 512 个字节,然后是文件的内容(如果它只有一个要存档的文件),它们组织在 512 字节的块中,然后是另外 2 个 512 字节的块。

    例如:假设我有一个 0 字节的 txt 文件要存档。这应该意味着要使用 512*3 字节的数量。为什么当我在 unix 中使用 tar 函数并单击属性时它有 10.240 字节?我认为它增加了一些 0 (NULL) 字节,但我不知道在哪里以及为什么和多少......

  2. 标头校验和。据我所知,这应该是档案的大小。当我用 hexdump -C 检查它时,它看起来像一个接近存档实际大小(单击属性时)的数字。例如 11200 或 11205 或类似的东西,如果我归档一个 0 字节的 txt 文件。这个大小是八进制还是十进制?我敢打赌它是八进制的,因为你放在标题中的所有信息都需要是八进制的。此时我的第二个问题是从 10240 字节的原始大小中添加了什么?

  3. 标题模式。假设我有一个 664 的文件,格式文件将为 0,那么我应该放入标题 0664。为什么,在正宗的存档中,在开头 (000064) 会再打印 3 个 0?

Gun*_*ica 8

tar 格式有多种版本,并非所有以前格式的扩展都始终相互兼容。所以总是有一些猜测。例如,在非常老的unix系统中,文件名不能超过14个字节,所以文件名(包括路径)的空间是充足的;后来,由于文件名较长,必须扩展但没有空间,因此文件名分成两部分;甚至后来,gnu tar 引入了@@LongLink 伪符号链接,它可以使旧的 tar 至少将文件恢复为其原始名称。

1) Tar 最初是 *T*ape *Ar*chiver。为了实现对磁带的恒定吞吐量并避免过多地启动/停止磁带,需要一次写入多个块。20 个 512 字节的块是默认值,-b 选项用于设置块数。很多时候,这个大小是由硬件预先定义的,使用错误的阻塞因子会使生成的磁带无法使用。这就是为什么 tar 附加 \0 填充的块,直到 tar 大小是块大小的倍数。

2) 文件大小为八进制,包含放入 tar 中的原始文件的真实大小。它与 tar 文件的大小无关。校验和是根据报头字节的总和计算出来的,然后也存储在报头中。所以存储校验和的行为会改变头部,从而使校验和无效。这就是为什么您首先存储所有其他标题字段,将校验和设置为空格,然后计算校验和,然后用您的计算值替换空格。

请注意,tarred 文件的标题是纯 ascii。这样,在过去,当 tar 文件(其组件为纯 ascii)损坏时,管理员只需使用编辑器打开 tar 文件并手动恢复组件即可。这就是为什么 tar 格式的设计者害怕 \0 字节而使用空格的原因。

3) Tar 文件可以存储块设备、字符设备、目录等等。Unix 将这些文件模式存储在与权限标志相同的位置,头文件模式包含整个文件模式,包括文件类型位。这就是为什么数字比纯许可长的原因。

http://en.wikipedia.org/wiki/Tar_%28computing%29上也有很多信息。