Linux根目录磁盘占用过高排查解决思路

2025-09-22

Linux根目录磁盘占用过高排查解决思路

最近在学习一些关于服务器磁盘方面的运维知识,正好发现我的一台机器上根目录磁盘占用达到了96%,这个占用量已经非常危险了

首先使用 df -h 查看磁盘占用率:

文件系统        大小  已用  可用 已用% 挂载点
tmpfs           1.6G  2.8M  1.6G    1% /run
/dev/nvme0n1p4   57G   52G  2.3G   96% /
tmpfs           7.7G     0  7.7G    0% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
/dev/nvme0n1p2  1.9G  287M  1.5G   17% /boot
/dev/nvme0n1p5   27G  7.8G   18G   31% /home
/dev/sda        916G  229G  641G   27% /data

接下来结合最近学习的内容,来说一说解决思路和方案。

1. 清理 APT 包缓存

原因:apt会缓存安装和更新时下载的 .deb 包,这些文件通常没有别要长期保留

apt-get clean
apt-get autoremove -y

(我的这台机器操作系统是Ubuntu 22.04,如果是CentOS等操作系统可以自行查找yum如何清理rpm包缓存)

这一步会释放 /var/cache/apt/archives 下的空间(通常几百 MB 到几 GB不等),不会影响已安装的软件,下面是执行效果。

文件系统        大小  已用  可用 已用% 挂载点
tmpfs           1.6G  2.8M  1.6G    1% /run
/dev/nvme0n1p4   57G   51G  2.9G   95% /
tmpfs           7.7G     0  7.7G    0% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
/dev/nvme0n1p2  1.9G  287M  1.5G   17% /boot
/dev/nvme0n1p5   27G  7.8G   18G   31% /home
/dev/sda        916G  229G  641G   27% /data

2. 清理旧日志

/var/log/ 下可能堆积了大量历史日志和 .gz 压缩日志,占用根分区空间。

du -sh /var/log/*
journalctl --vacuum-time=7d     # 只保留最近7天的systemd日志
rm -rf /var/log/*.gz /var/log/*.[0-9]

这一步会释放 /var/log/ 下的日志空间(根据情况可能从几百 MB 到几 GB),保留最近日志,不会影响系统运行,下面是执行效果。

文件系统        大小  已用  可用 已用% 挂载点
tmpfs           1.6G  2.8M  1.6G    1% /run
/dev/nvme0n1p4   57G   49G  4.7G   92% /
tmpfs           7.7G     0  7.7G    0% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
/dev/nvme0n1p2  1.9G  287M  1.5G   17% /boot
/dev/nvme0n1p5   27G  7.8G   18G   31% /home
/dev/sda        916G  229G  641G   27% /data

3. 检查Docker占用

对于经常使用 Docker的用户来说,docker的镜像、容器默认会占用较多根目录的空间,我的这台机器overlay2 已经挂载到 /data,但镜像和日志可能仍残留在 /var/lib/docker(根分区)

docker system df         # 查看 Docker 镜像/容器/缓存大小
docker system prune -a   # 清理所有未使用的镜像、容器、网络(谨慎)
docker volume prune      # 清理无用数据卷

如果不太确定容器的运行状态是否会被影响,可以不执行这一步,因为docker主要占用空间的部分还是overlay2和镜像文件。

4. 查找大文件

有些临时文件或大日志可能会“卡”在根分区,检查大文件:

du -ahx / | sort -rh | head -n 20

这一命令会显示根目录下前 20 个最大文件/目录,找到异常占用的文件后,可以 rm 或迁移到 /data

我这里是multipass占用空间比较大,我记录一下:

首先停止multipass服务:

systemctl stop snap.multipass.multipassd.service

然后移动数据目录到大磁盘:

mv /var/snap/multipass/common/data /data/multipassd

最后建立软链接:

ln -s /data/multipassd /var/snap/multipass/common/data/multipassd

启动服务:

systemctl start snap.multipass.multipassd.service

这是最后的效果:

文件系统        大小  已用  可用 已用% 挂载点
tmpfs           1.6G  2.8M  1.6G    1% /run
/dev/nvme0n1p4   57G   34G   21G   63% /
tmpfs           7.7G     0  7.7G    0% /dev/shm
tmpfs           5.0M  4.0K  5.0M    1% /run/lock
/dev/nvme0n1p2  1.9G  287M  1.5G   17% /boot
/dev/nvme0n1p5   27G  7.8G   18G   31% /home
/dev/sda        916G  245G  625G   29% /data

63%虽然还是高,但是已经没有那么危险了。