Linux 新手入门:用 df 和 du 找出磁盘被谁占满了
服务器用着用着,最常见的一类报错就是磁盘满了:写文件提示 No space left on device,服务起不来,日志也写不进去。遇到这种情况先别急着删东西,第一步是先看清磁盘到底被谁占了,再动手清理。
先看整块磁盘还剩多少,用 df -h:
df -h
-h 是让人读得懂的单位(G、M 而不是字节数)。重点看 Use% 这一列,哪个挂载点接近 100%,问题就在哪里。根目录满了和 /var 满了,排查方向完全不一样,所以先定位挂载点,再往下找。
如果根目录 / 满了,用 du -sh /* 看一级目录各占了多少:
du -sh /*
du 是统计目录大小,-s 只汇总不展开子目录,-h 同样是可读单位。这一眼就能看出是 /var 大、/home 大,还是 /tmp 大。找到最大的那一级,再往里钻一层:
du -sh /var/*
这样一层层缩小范围,很快就能定位到具体目录。想一次看到排序后的结果,可以加上排序:
du -h --max-depth=1 /var | sort -hr | head -10
--max-depth=1 只看一层,sort -hr 按大小倒序,head -10 只取前十行。日志目录 /var/log 经常是头号嫌疑对象,某个服务的日志没做轮转,几个月就能长到几十 G。
定位到具体的大文件,可以用 find 按大小找:
find /var/log -type f -size +100M
这条命令找出 /var/log 下大于 100M 的文件。找到之后先确认这个文件归哪个服务,再决定怎么处理。直接删正在被写的文件要小心:文件删了、进程还拿着句柄,磁盘空间并不会立刻释放,服务还可能写出错。更稳妥的做法是先清空内容而不是删除文件:
truncate -s 0 /var/log/xxx.log
truncate -s 0 把文件截断成 0 字节,进程继续往里写也不会报错,空间马上释放。系统自带的 logrotate 会定期做这件事,手动清理只是应急,长期还是要靠轮转配置。
还有两个新手容易忽略的点。第一,df 看到满了、但 du 算出来没那么大,可能是已删除却仍被进程占用的文件,用 lsof | grep deleted 可以查到,重启对应服务就能释放。第二,/tmp 里堆着的临时文件和下载一半的安装包,确认没用就可以直接删,这是最安全的清理对象。
总结一下排查顺序:df -h 定挂载点,du -sh 一层层定位目录,find 找大文件,truncate 安全清空日志。磁盘满了不可怕,可怕的是不看就乱删——先定位、再清理,服务才不会被你顺手删出问题。
- 点赞
- 收藏
- 关注作者
评论(0)