求助排查硬盘显示已满但实际文件占用远低于此的原因
你遇到的这种情况其实挺常见的,大多是因为文件系统里存在一些磁盘分析器没统计到的“隐形占用”,结合你是删除文件夹后出现的问题,给你列几个最可能的原因和对应的排查/解决方法:
已删除文件被进程持续占用,磁盘空间未释放
当你用rm -r删除文件夹后,如果有后台进程还在打开这些文件夹里的文件,系统不会真正释放这些文件占用的空间——df会把它们算成“已使用”,但磁盘分析器扫不到这些已经被标记删除但还没被系统回收的文件。
排查方法:运行sudo lsof | grep deleted,这个命令会列出所有持有已删除文件句柄的进程。找到对应的进程后,你可以重启该进程(比如用systemctl restart <进程名>),或者直接重启系统,空间就会被释放。磁盘分析器没有扫描root权限的文件/目录
磁盘分析器默认可能以普通用户权限运行,没法访问root专属的文件、系统目录(比如/var/log、/var/cache、/root),这些目录的占用空间不会被统计进去,但df是统计整个分区的所有空间。
排查方法:用root权限启动磁盘分析器,或者用命令行工具查看分区内各目录的真实占用:sudo du -sh /*这个命令会列出根目录下每个子目录的总占用大小,找到占用异常大的目录后再深入排查,比如
sudo du -sh /var/log看看日志文件是不是占了很多空间。系统快照/备份工具占用了大量空间
如果你用了Timeshift这类系统快照工具,它会在根分区生成快照文件,这些文件通常是隐藏状态,磁盘分析器可能不会默认统计,但df会把它们算进已使用空间里。
排查方法:打开快照工具的图形界面查看,或者用命令sudo du -sh /timeshift(如果快照存储在根分区的话)确认占用大小,删除不需要的旧快照就能释放空间。挂载点下的“遗留文件”占用空间
假设你之前在某个挂载点(比如/mnt/data)挂载了外部分区,后来卸载了这个分区,但之前在/mnt/data目录下存放的文件还留在那里。之后如果重新挂载分区,这些遗留文件会被新挂载的分区覆盖,看不到但仍然占用根分区的空间,df会统计,但磁盘分析器扫挂载点时看到的是新分区的内容,不会统计遗留文件。
排查方法:先卸载对应的挂载点(比如sudo umount /mnt/data),然后查看该目录下的文件,删除不需要的文件后再重新挂载分区。文件系统元数据异常(少见但可能)
虽然你的情况是空间满而非inode满,但偶尔文件系统的元数据出错也会导致df统计异常。可以尝试检查文件系统的完整性:
首先得卸载该分区(如果是根分区的话,需要进入单用户模式或者用Live CD启动),然后运行:sudo fsck /dev/nvme0n1p5注意:
fsck会修改文件系统,运行前最好备份重要数据。
备注:内容来源于stack exchange,提问作者Alonso




