我在 CentOS 系统上有一个日志文件占用了 700MB 的空间(使用 看到ls
),但是当我运行该df -h
命令时,它显示文件系统 (ext4) 上仅使用了 200MB 的空间。
是什么导致了这种差异?
文件占用的空间是否可能比 df 报告的空间更多,如果是,我如何判断哪些文件未使用空间?
编辑:我点击快速,其他帖子没有回答我的问题。这是问题的简化形式:
# ls -lh /mnt
total 29M
-rw-r--r-- 1 apache apache 678M Jan 6 10:01 Somelog.log
-rw-r--r-- 1 apache apache 1.1M Jan 1 03:20 Somelog.log-20230101.gz
-rw-r--r-- 1 apache apache 1.1M Jan 2 03:23 Somelog.log-20230102.gz
....etc....
# du -sh /mnt
29M /mnt
我不想要一些有关未计入总数的文件的信息。 (当文件仍在内存中时使用什么术语?如果是这种情况)
答案1
ls -l
显示文件的外观大小,IE可以从文件中读取多少数据。du
显示文件在磁盘上实际占用的空间量。
在您的情况下,日志文件是稀疏的:它包含接近 27MiB 的实际数据,以及大约 650MiB 的块(全部为零)。文件的写入方式导致后面的块不占用磁盘空间,因此它们不被计算在内du
。发生这种情况的方式如下:
- 一个进程写入日志文件,其中包含 650MiB 的真实数据;
- 日志文件被轮换并清除;
- 初始进程继续写入同一日志文件,其偏移量与日志文件轮换之前完成写入的偏移量相同。
最后一步会导致文件在附加新数据之前扩展到适当的大小,但不包含任何数据。
解决此问题的方法是强制写入进程在轮换后关闭并重新打开日志文件,方法是重新启动守护进程,或者通过信号通知它重新打开其日志文件(如果它支持这种机制)。