文件大小从何而来,即ls和cp如何知道文件大小?

文件大小从何而来,即ls和cp如何知道文件大小?

最近我有一个文件报告我的 500GB SSD 中的文件大小为 33P 字节,更多详细信息这里。这已经完成ls,并cp会报告没有足够的空间。

以我对 VFS 的了解和理解不足,我相信 (SATA) 驱动程序与磁盘通信,并且它通过 VFS 移动,直到到达索引节点(根据第 8.6 节索引节点的描述进行假设)这里)然后内核以某种方式将其传递到用户空间。

最后,我想知道如何ls知道cp大小,但我也想知道文件如何报告错误的大小,以及如果将来再次发生这种情况,在哪里寻找答案。

答案1

strace -v -e trace=lstat ls -l file
[...]
lstat("tw.txt", {[...] st_size=1103, [...]

答案2

文件的大小作为文件的一部分存储元数据,以及文件类型(目录/常规/符号链接/…)、时间戳、权限等。应用程序使用以下内容检索此元数据stat系统调用。元数据存储在文件的索引节点中。

如果文件存储在 SATA 磁盘上,则涉及 SATA 驱动程序,但它的级别比文件系统低得多。考虑 SATA 级别并不能帮助您了解发生了什么,恰恰相反。

文件可能比磁盘还大。文件可以被压缩。大多数文件系统仅支持一种非常简单的压缩形式:稀疏文件,其中大块空字节不存储在磁盘上。报告的磁盘使用情况du不计算那些省略的块,但报告的文件大小ls会计算在内。

作为乌普斯·Q·温布利在评论中指出,您发现的尺寸 (36028797019011568) 与完全合理的尺寸 (47600) 有点偏差。因此,这个大小很可能不是合法的稀疏文件,而是磁盘上数据损坏的迹象。在执行其他操作之前,请运行记忆测试。 RAM 是未纠正的单位错误的最大来源。请注意,由于此错误,您可能会出现更多损坏的数据。

相关内容