Tar格式的头和结构

5

我有一个学校项目,需要制作一个类似Unix系统tar的C程序。我有一些问题需要解释:

  1. 归档文件大小 我从互联网上了解到,一个归档文件具有定义好的512字节块数量。因此,头部有512字节,然后是文件内容(如果只有一个文件要归档),以512字节的块组织, 然后再加上2个512字节的块。

    例如:假设我要归档一个大小为0字节的txt文件。这应该意味着需要使用512 x 3字节。但是,当我在Unix中使用tar函数并单击属性时,它显示的是10240字节。我认为它添加了一些0(NULL)字节,但是我不知道在哪里、为什么以及多少个...

  2. 头部校验和 据我所知,这应该是归档文件的大小。当我使用hexdump -C检查它时,它像一个数字出现在归档文件的实际大小旁边(在单击属性时)。例如,如果我要归档一个0字节的txt文件,则会显示11200或11205或类似的数字。这个大小是八进制还是十进制?我猜它是八进制,因为你放在头部的所有信息都需要是八进制的。那么我在这里的第二个问题是:从原始大小10240字节中添加了多少内容?

  3. 头部模式 假设我有一个664的文件,格式化后的文件将是0,然后我应该在头部中放置0664。为什么在一个真正的归档文件中,在开头印刷了3个额外的0(000064)?


请查看http://en.wikipedia.org/wiki/Tar_(computing)。 - SSpoke
我已经检查过了,但是我不理解“校验和是通过将头记录的无符号字节值与八个校验和字节(被视为ASCII空格,十进制值为32)的总和来计算”的含义... - user3187893
不知道为什么它们会是十进制值32,这是空格的ASCII码,似乎如果校验和很短,则它们是字节0,并且可能长达8个字节。请尝试阅读此链接:http://www.gnu.org/software/tar/manual/html_node/Standard.html - SSpoke
1个回答

8
有各种版本的tar格式,并且并不是所有对以前版本的扩展都总是兼容的,因此总是需要一些猜测。例如,在非常旧的Unix系统中,文件名不允许超过14个字节,因此文件名(包括路径)的空间很大;后来,随着更长的文件名出现,必须进行扩展,但是没有足够的空间,因此文件名被分为两部分;更晚地,GNU tar引入了@@LongLink伪符号链接,使旧版tar至少可以将文件恢复到其原始名称。
1)Tar最初是一个* T *ape * Ar *chiver。为了实现对磁带的恒定吞吐量并避免过于频繁地启动/停止磁带,需要一次写入多个块。默认情况下是20个512字节块,-b选项用于设置块数。在很多情况下,该尺寸由硬件预定义,并使用错误的分块因子会使生成的磁带无法使用。这就是为什么tar会附加\ 0填充的块,直到tar的大小是块大小的倍数。
2)文件大小为八进制,包含放入tar的原始文件的真实大小。它与tar文件的大小无关。 校验和是从头字节的总和计算出来的,但是也存储在头中。因此,存储校验和会更改头,从而使校验和无效。这就是为什么您首先存储所有其他标题字段,将校验和设置为空格,然后计算校验和,然后用计算出的值替换空格的原因。
请注意,tar文件的标题是纯ASCII码。因此,在那些旧日子里,当tar文件(其组件为纯ASCII码)损坏时,管理员可以使用编辑器打开tar文件并手动恢复组件。这就是tar格式设计者害怕\ 0字节并使用空格的原因。
3)Tar文件可以存储块设备,字符设备,目录等等。Unix将这些文件模式存储在与权限标志相同的位置,并且头文件模式包含整个文件模式,包括文件类型位。这就是数字比纯权限长的原因。
此外,http://en.wikipedia.org/wiki/Tar_%28computing%29网站上有很多信息。

我明白,但是那些块添加到哪里了(tar文件结尾的两个512块的末尾)? - user3187893
  1. 头部的最大大小可以是512字节(尽管如果它们都满了,我的数组中的所有元素加起来也不能达到512字节),对吗?为什么它显示一个像11205这样的值?我不明白它从哪里来。
- user3187893
是的,它们被附加到末尾以获得tar文件中正确块数(20的倍数 / -b选项)。 - Guntram Blohm
  1. 头部始终为512字节,与文件名的长度无关。对于校验和,将头部中所有字节的ASCII值相加('\0' => 0,'\r' => 13,'0' => 48,'A' => 65等),将结果转换为八进制,即可得到11205。请记住,这是对头部进行校验和,而不是对文件进行校验。
- Guntram Blohm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接