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%虽然还是高,但是已经没有那么危险了。