You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 22系统根分区/dev/nvme0n1p3磁盘满额,无法定位大文件/目录以释放空间的求助

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 /

如果输出里的Typebtrfs,就执行以下命令查看快照:

# 列出所有子卷(包括快照)
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

火山引擎 最新活动