文件大小不匹配

Coo*_*ops 4 linux filesystems

报告的文件大小差异背后的原因是什么?

[root@localhost]# ls -lah sendlog
-rw-rw-r-- 1 mail mail 1.3T Aug 15 17:30 sendlog

[root@localhost]# du -m sendlog
24M  sendlog
Run Code Online (Sandbox Code Playgroud)

当服务器的备份因配额问题而不断失败时,这引起了我们的注意,因此不仅仅是“ls”看到了这个错误的大小。

诸如“稀疏文件”和“块分配”之类的术语浮现在脑海中,但我不确定为什么会发生或背后的真正原因。显然,这两个命令检查大小的方式有所不同,我总是相信 du 是对的吗?

仅供参考,这应该是一个非常标准的邮件日志文件。

Kje*_*sen 10

值之间的差异如下。

来自stat(2)的手册

struct stat {
    // snip
    off_t     st_size;    /* total size, in bytes */
    // snip
    blkcnt_t  st_blocks;  /* number of blocks allocated */
    // snip
};
Run Code Online (Sandbox Code Playgroud)

st_blocks 字段指示分配给文件的块数,以 512 字节为单位。(这可能小于 st_size/512,例如,当文件有孔时。)

ls 报告st_size的大小是 ,du 报告的大小是st_blocks * 512

du 报告的值是文件系统/磁盘上文件使用的字节数,ls 报告的值是您与文件交互时文件的实际大小/长度。(除了使用磁盘使用情况外,du 还只计算硬链接文件一次)

哪个值是“正确的”取决于上下文。如果您认为磁盘使用量 du 是正确的,如果您想知道文件中有多少字节,则 ls/st_size是正确的。

此外,您可以通过使用各种选项 get ie du (--apparent-size) 来使用报告的大小,st_size或者您可以使用 ls (-s) 来报告使用的块数。

你关于你的日志文件是一个稀疏文件的假设听起来似乎有道理,但是,我不知道原因。