“磁盘不够用”是 Linux 运维里出现频率最高的告警之一,但很多服务器的真实问题不是盘太小,而是空间被日志、缓存和无人认领的数据悄悄吃掉了。高效使用磁盘的完整路径其实是四步:先看清空间去了哪里,再定位占用大户,然后按类别回收,最后用分区与监控把问题挡在下次告警之前。
一、先看清现状:df 与 du 各司其职
第一步永远是确认“还剩多少、被什么分区吃掉”。两条命令分工不同:
df -hT # 各分区总量、已用、可用与文件系统类型
df -i / # 看 inode 使用率,小文件过多时会先耗尽 inode
du -sh /var /home /opt 2>/dev/null # 目录实际占用(du 才反映真实磁盘消耗)
注意两个常见陷阱:一是 df 显示已满但 du 统计对不上,多半是有进程还握着已删除文件的句柄,用 lsof +L1 找到后重启对应服务即可释放;二是 df 的“可用”比“容量减已用”少 5% 左右,那是 ext4 默认给 root 预留的块,数据盘可以用 tune2fs -m 1 调小预留比例。
二、定位占用大户:从粗到细三连击
不确定空间去哪了,就按“分区 → 目录 → 文件”逐层下钻:
# 1. 当前分区下每个一级目录占多少(只算一层,速度快)
du -xh --max-depth=1 / 2>/dev/null | sort -rh | head -15
# 2. 找出全盘最大的 20 个文件
find / -xdev -type f -size +500M -exec du -h {} + 2>/dev/null | sort -rh | head -20
习惯用交互界面的话,ncdu / 是最省心的选择:可以像文件管理器一样逐层进出,还能直接在界面里删除。参数 -x 很关键,它阻止 du/find 跨文件系统,避免把挂载的 NAS 或容器卷也算进来。
三、三大可回收来源:日志、缓存、软件残留
日志。先让 systemd 接管 journal 上限,再处理应用日志:
journalctl --disk-usage # 看 journal 占了多少
sudo journalctl --vacuum-size=500M # 收缩到 500M
sudo edit /etc/systemd/journald.conf.d/limit.conf # 写 SystemMaxUse=500M 永久生效
对 Nginx、Tomcat 这类自管日志,配合 logrotate 的 compress + maxsize + copytruncate 组合,别让单个 access.log 长到几十 GB。
缓存。发行版包管理器缓存是最安全的即时回收项:apt clean、dnf clean all 或 pacman -Scc。Docker 主机则定期跑 docker system df 查看镜像、悬空层与容器日志占用,确认后执行 docker system prune -a --volumes(先确认没有需要保留的卷)。
软件与内核残留。Debian 系用 apt autoremove --purge 清依赖孤儿,老内核只保留当前与上一版,方便回滚又不占空间。
四、省空间的手法:压缩、去重与正确删除
对不再修改的历史数据,归档压缩收益立竿见影:文本日志用 zstd 或 gzip 压完再留,通常能省 80% 以上。删除正在被写入的大文件时,不要直接 rm(空间要等进程退出才释放),用 : > bigfile.log 原地截断更安全。同一台机器上存在多份虚拟机镜像或备份时,可以考虑 reflink(cp --reflink=auto)或 btrfs 快照这类写时复制手段,让相同数据只占一份物理空间。
五、规划视角:把“够用”变成长期状态
回收只是止血,长期高效靠规划:数据盘独立分区,避免日志写满拖死根分区;容量可能增长的盘直接用 LVM,日后 lvextend 在线扩容不用重分区;最后加上监控——Prometheus 的 node_filesystem_avail_bytes 或最朴素的 cron 脚本,在 85% 阈值就告警,比半夜处理 100% 的磁盘体面得多。
推荐落地顺序:新机器第一天就配置 journald 上限和 logrotate;每月巡检跑一次 du 下钻;扩容前先用 LVM 快照做保护。
常见问题 FAQ
Q1:df 显示 100% 但 du 统计只有 40%,删不掉文件怎么办?
大概率是已删除文件仍被进程持有。用 lsof +L1 | grep deleted 定位进程,重启或 reload 该服务,空间立即释放。
Q2:能直接删 /root/.cache 或某软件的缓存目录吗?
可以,缓存的定义就是“删了能重建”。但先确认目录确实是缓存而非数据——拿不准就先 mv 改名观察几天,服务正常再真删。
Q3:SSD 需要像 Windows 那样定期整理碎片吗?
不需要。ext4/xfs 的分配策略加上 SSD 的随机读写特性,使碎片整理既无收益又磨损寿命,保持适度空闲空间(约 10–20%)比任何整理工具都有用。
Q4:小文件太多,删了一堆空间还是紧张?
先看 df -i。inode 耗尽时哪怕剩余空间充足也无法新建文件,治本方案是合并存储(tar/sqlite/对象存储)或重建文件系统时调大 bytes-per-inode。