Ubuntu 22系统根分区/dev/nvme0n1p3磁盘满额,无法定位大文件/目录以释放空间的求助
我完全理解你现在的头疼——df明明显示根分区/dev/nvme0n1p3用了824G,但各种du命令统计的总大小才20多G,这种“空间失踪”的情况其实很常见,大概率是以下几个原因导致的,咱们一步步来排查解决:
一、排查「已删除但被进程占用的文件」
这是最常见的原因:你删除了大文件,但有进程还在持续读写它,系统不会立刻释放磁盘空间,直到这个进程退出。这时候df会显示空间被占用,但du扫不到这些“隐形”的文件。
执行以下命令找出这类文件:
sudo lsof | grep deleted
输出里会列出所有被标记为deleted但仍被进程持有的文件,重点看文件大小列(默认是第7列),找到占用空间大的条目。
解决办法:
- 如果是不重要的进程,直接用
kill <PID>(PID是输出里的第二列)终止进程,空间会立刻释放; - 如果是系统服务,比如nginx、mysql这类,建议用
sudo systemctl restart <服务名>重启服务,避免直接kill导致数据丢失。
二、检查「挂载点下的隐藏文件」
比如你后来把某个分区挂载到了/opt、/var这类目录下,但挂载之前这些目录本身就存放了大文件,挂载后这些文件会被“覆盖”看不到,但它们依然占用根分区的空间,df会统计进去,但du扫挂载后的目录时看不到。
方法1:临时卸载挂载点检查
以/opt为例:
# 先卸载挂载的分区 sudo umount /opt # 查看/opt目录下的真实内容大小 du -sh /opt # 看完记得重新挂载 sudo mount /opt
如果发现里面有大文件,直接清理即可。
方法2:不卸载直接查找根分区内的大文件
用-xdev参数限制只扫描当前根分区,避免跨其他挂载的分区:
sudo find / -xdev -type f -size +5G -exec ls -lh {} \;
这个命令会直接列出根分区里大于5G的所有文件,包括被挂载点隐藏的那些。
三、检查Btrfs文件系统的快照(如果你的根分区是Btrfs)
Ubuntu 22.04默认安装时可能会选用Btrfs文件系统,系统或timeshift工具会自动创建快照(用于系统恢复),这些快照会占用大量空间,但du默认不会统计快照的空间。
先确认你的根分区文件系统类型:
df -T /
如果输出里的Type是btrfs,就执行以下命令查看快照:
# 列出所有子卷(包括快照) sudo btrfs subvolume list / # 统计根分区所有子卷的空间占用 sudo btrfs filesystem du -s /
如果是timeshift创建的快照,可以用以下命令管理:
# 列出所有快照 sudo timeshift --list # 删除指定快照(替换成你要删的快照名称) sudo timeshift --delete --snapshot '2024-05-20_12-00-00'
删除不需要的旧快照就能释放大量空间。
四、用更精准的工具扫描大文件/目录
你提到的ncdu是非常好用的交互式磁盘分析工具,一定要加上-x参数(只扫描当前文件系统),这样才能准确统计根分区的所有内容:
sudo ncdu -x /
进入界面后,你可以按n按名称排序、s按大小排序,找到占用空间最大的目录或文件,直接在界面里按d删除(注意确认,避免误删系统文件)。
最后总结
按照上面的步骤排查,大概率能找到“失踪”的几百G空间。优先排查进程占用的删除文件和挂载点隐藏文件,这两个是最容易快速解决的;如果是Btrfs快照,清理旧快照也能释放大量空间。
备注:内容来源于stack exchange,提问作者Umair Ayub




