【问题标题】:Header and structure of a tar formattar 格式的标题和结构
【发布时间】:2023-03-14 21:40:02
【问题描述】:

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

  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. Header Mode.假设我有一个664的文件,格式文件会是0,那么我应该把header 0664放进去。为什么,在一个正宗的存档上打印3开头还有 0 (000064)?

【问题讨论】:

  • 我已经检查过了,但我不明白什么“校验和是通过将标头记录的无符号字节值的总和与作为 ascii 空格的八个校验和字节(十进制值 32)" 表示 ...
  • 不知道为什么它们会是十进制值 32,它是空间的 ascii,如果校验和很短并且可能长达 8 个字节,它们似乎是字节 0。尝试阅读此gnu.org/software/tar/manual/html_node/Standard.html

标签: archive tar


【解决方案1】:

存在各种版本的 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 将这些文件模式存储在与权限标志相同的位置,并且头文件模式包含 whole 文件模式,包括文件类型位。这就是数字比纯权限长的原因。

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

【讨论】:

  • 1) 好的,我明白了,但是这些块添加到哪里(在 tar 末尾的 512 的 2 个块中的最后一个)?
  • 2) 标头的最大 syze 可以是 512 字节(尽管我的数组中的所有元素如果满了就不能合起来 512 字节),对吧?为什么它显示像 11205 这样的值?我不明白它是从哪里来的
  • 1) 是的,它们被附加到末尾以获得 tar 文件中正确数量的块(20 的倍数 / -b 选项)。
  • 2) 标题总是正好 512 字节,与文件名的长度无关。对于校验和,将标头中所有字节的 ascii 值相加('\0' => 0,'\r' => 13,'0' => 48,'A' => 65 等),转换结果为八进制,你得到你的 11205。记住它是 header 上的校验和,而不是文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多