一、先搞清楚磁盘被谁吃掉了
咱们平时用Linux系统,最怕的就是突然弹出来个"no space left on device"的错误。就像家里的衣柜莫名其妙被塞满一样,让人一头雾水。这时候别急着删东西,先得找到"罪魁祸首"。
最常用的侦查工具就是df和du这对黄金搭档。先来个快速检查:
# 查看各分区使用情况(-h参数让数字更易读)
df -h
输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 47G 1.2G 98% /
/dev/sdb1 100G 20G 80G 20% /home
看到根目录已经98%了,危!接下来用du深入调查:
# 找出/目录下占用空间最大的前10个目录
sudo du -h --max-depth=1 / | sort -hr | head -n 10
输出可能长这样:
45G /var
1.5G /usr
800M /home
...
如果发现是/var这个"大胃王",那咱们就得重点排查日志、缓存这些常见"嫌犯"了。
二、清理临时文件和缓存
就像我们电脑用久了会产生一堆临时文件一样,Linux系统也会积累各种"垃圾"。这些往往是最好清理的。
- 清理apt缓存(适合Debian/Ubuntu系):
# 查看缓存大小
sudo du -sh /var/cache/apt/archives
# 清理已下载的安装包
sudo apt clean
# 更彻底的清理(包括旧版本的包)
sudo apt autoclean
- 清理系统日志:
# 查看日志目录大小
sudo du -sh /var/log
# 清空特定日志文件(比如syslog)
sudo truncate -s 0 /var/log/syslog
# 或者用logrotate管理日志
sudo logrotate -f /etc/logrotate.conf
- 清理临时目录:
# /tmp目录清理(注意别误删正在使用的文件)
sudo find /tmp -type f -atime +7 -delete
三、处理大文件和重复文件
有时候系统里会藏着一些"巨无霸"文件,可能是日志、崩溃转储或者下载的安装包。
- 查找大文件:
# 查找大于100MB的文件
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{ print $9 ": " $5 }'
- 处理core dump文件:
# 禁用core dump(临时生效)
ulimit -c 0
# 永久禁用需要修改/etc/security/limits.conf
- 查找重复文件(需要先安装fdupes):
# 安装工具
sudo apt install fdupes
# 查找指定目录下的重复文件
fdupes -r /home
四、清理Docker的磁盘占用
如果你在用Docker,它可是个隐藏的"磁盘杀手"。特别是长时间使用后,会积累大量镜像、容器和卷数据。
- 查看Docker磁盘使用:
docker system df
- 清理无用对象:
# 删除所有停止的容器
docker container prune
# 删除所有未被使用的镜像
docker image prune -a
# 更彻底的清理(包括builder缓存)
docker system prune -a --volumes
- 限制日志大小(在docker-compose.yml中):
services:
myservice:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
五、处理邮件和打印队列
这两个服务经常被忽略,但它们也可能占用大量空间。
- 清理邮件队列:
# 查看邮件队列大小
sudo du -sh /var/mail /var/spool/mail
# 清空特定用户的邮件
sudo cp /dev/null /var/mail/username
- 清理打印队列:
# 取消所有打印任务
sudo lprm -
# 或者直接清空打印队列
sudo rm -rf /var/spool/cups/*
六、高级技巧:使用LVM扩容
如果清理后空间还是不够,可以考虑使用LVM(逻辑卷管理)来扩容。不过这个需要你有未分配的磁盘空间。
- 查看当前卷组空间:
sudo vgdisplay
- 扩展逻辑卷(假设我们要给根分区扩容):
# 先确认卷组有可用空间
sudo vgs
# 扩展逻辑卷(增加5G)
sudo lvextend -L +5G /dev/mapper/ubuntu--vg-root
# 调整文件系统大小(ext4为例)
sudo resize2fs /dev/mapper/ubuntu--vg-root
七、预防胜于治疗:建立监控
与其等磁盘满了手忙脚乱,不如提前建立监控。
- 设置磁盘空间告警(添加到crontab):
# 每天检查一次,超过90%就发邮件
df -h | awk '$5+0 >= 90 {print $1 " is " $5 " full!"}' | mail -s "Disk Space Alert" admin@example.com
- 使用logrotate自动管理日志:
在/etc/logrotate.d/下创建自定义配置,比如:
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
}
八、注意事项与总结
在清理过程中,有几点需要特别注意:
谨慎使用rm命令:特别是以root身份操作时,一个不小心就可能删掉系统关键文件。建议先用
ls列出要删除的文件,确认无误后再执行删除。不要随意清空/proc和/sys:这些是虚拟文件系统,里面的"文件"实际上并不占用磁盘空间。
保留足够的系统日志:虽然日志可能占用空间,但它们是排查系统问题的重要依据。建议保留最近7-10天的日志。
考虑使用tmpfs:对于频繁读写的临时文件,可以挂载为tmpfs(内存文件系统),既提高速度又减少磁盘写入。
总结一下,面对Linux磁盘空间不足的问题,我们应该:
- 先诊断,后治疗:用
df和du找出问题所在 - 从易到难:先清理临时文件和缓存这类"软柿子"
- 重点突破:针对占用空间大的目录专项清理
- 建立长效机制:设置监控和自动清理策略
- 必要时扩容:考虑LVM等高级方案
记住,定期维护比紧急抢救要轻松得多。养成定期检查磁盘使用情况的习惯,就能避免很多突发状况。
评论