我的印象是 tar 不压缩文件。想象一下,当我压缩一百万个小文件(du -h
~ 4.2G)并且生成的 tar 大小只有原来的四分之一(ls -lh mytar.tar
~ 1.3G)时,我有多惊讶!
显然,这些小文件占用的空间超出了其报告的大小,并且回答另一个问题表明每个非空文件占用至少1KB,无论大小。但是这个 1KB 从哪里来,它在不同的文件系统(这是 ext4)之间是否有所不同,以及 1.01 KB 的文件占用 2KB 吗?
简而言之,如何测量真实文件大小,尤其是目录中的许多文件?我尝试过du --apparent-size -h
,但只得到 437M,所以我对这三个截然不同的数字感到非常困惑。
答案1
正如克里斯托弗指出的,这个问题非常类似于为什么文本文件即使只有一个字节的文本也至少占用 4kB?
我不确定我个人是否将其归类为重复项。
但这1KB是从哪里来的
更常见的是 4KB
文件系统以字节块(也称为分配单元)而不是单个字节来分配。因此,要在文件中存储单个字节,该文件将需要整个块。这意味着该块的其余部分留空,但没有其他文件可以使用它。
这个数字的来源尚不清楚,但它与很多事情相符。例如,在低级别,不可能将单个字节写入磁盘,只能写入其中的一个块。现代 HD 甚至 SSD 通常都有 4KB 的限制。这意味着,如果要写入一个字节,则必须首先加载 4KB,更改该 1 个字节,然后将整个块写回。如果您尝试写入整个块,则无需读取其原始内容。因此,符合硬件限制的文件系统效率更高。
正如 Stephen Kitt 指出的,4KB 是许多内核支持 ext3 的最大块大小。 (还在这里讨论)。一般来说,较大的块大小具有更有效的访问时间,这意味着“块越大越好”。
不同文件系统有不同吗(这是 ext4)
曾几何时,512 是一个常见的块大小,这个数字仍然偶尔作为默认值出现。 Tar 文件非常古老,并且具有相同的 512 字节块大小(大概是为了与文件系统和硬件保持一致,使磁盘写入速度非常快)。由于这样的 tar 文件对于非常小的文件(<512 字节)仍然非常浪费
现在,4KB 对齐(而不是 1KB)的文件系统更加常见。
是的,当您将文件系统格式化为使用不同的块大小时,可以对其进行配置。不同的文件系统有不同的限制,但大多数都可以配置。
1.01 KB 的文件占用 2 KB 吗?
假设块大小为 1KB,是的,这是正确的。
答案2
在您的示例中,文件系统中单个文件使用的平均空间为 4200 字节。
示例中文件的平均大小为 800 字节,因为 tar 存档中的文件开销为 512 字节。
如果许多文件小于 800 字节,某些文件稍大于 4096 字节,并且文件系统使用 4096 字节的内部块大小,但不实现小于 4096 字节的片段,则您的声明可能是正确的。
如果所有文件都小于 4096 字节,du
则会报告 4G,因此某些文件似乎需要 2 个块 à 4096 字节。