磁盘空间不足问题
磁盘空间不足是Linux运维中最常见的问题之一,会导致系统性能下降、服务异常甚至系统崩溃。
🚨 问题现象
常见错误信息
# 命令执行失败
bash: cannot create temp file for here-document: No space left on device
# 应用程序错误
ERROR: No space left on device
ERROR: Cannot write to file
# 系统日志错误
kernel: Out of space on device
系统表现
- 文件无法创建或修改
- 应用程序无法启动或异常退出
- 系统响应缓慢
- 无法写入日志文件
- 数据库操作失败
🔍 问题诊断
1. 检查磁盘使用情况
# 查看所有挂载点的磁盘使用
df -h
# 查看inode使用情况
df -i
# 示例输出
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 19G 512M 98% /
/dev/sda2 100G 45G 50G 48% /home
tmpfs 2.0G 0 2.0G 0% /dev/shm
2. 找出占用空间最多的目录
# 查看根目录下各目录大小
du -sh /* 2>/dev/null | sort -hr
# 查看当前目录下的大文件
du -sh * | sort -hr | head -10
# 递归查看大目录
du -h /var | sort -hr | head -20
3. 查找大文件
# 查找大于100MB的文件
find / -type f -size +100M 2>/dev/null | head -20
# 查找大于1GB的文件
find / -type f -size +1G 2>/dev/null
# 按文件大小排序
find / -type f -exec ls -lh {} \; 2>/dev/null | awk '{print $5 "\t" $9}' | sort -hr | head -20
4. 检查隐藏的已删除文件
# 查看被删除但仍被进程占用的文件
lsof +L1
# 查看具体进程占用的文件
lsof | grep deleted
🛠️ 解决方案
立即解决方案
1. 清理临时文件
# 清理/tmp目录
sudo rm -rf /tmp/*
sudo rm -rf /tmp/.*
# 清理用户临时目录
sudo rm -rf /var/tmp/*
# 清理系统缓存
sudo sync
echo 1 | sudo tee /proc/sys/vm/drop_caches
echo 2 | sudo tee /proc/sys/vm/drop_caches
echo 3 | sudo tee /proc/sys/vm/drop_caches
2. 清理日志文件
# 查看日志文件大小
sudo du -sh /var/log/*
# 清理系统日志
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=100M
# 清理旧日志文件
sudo find /var/log -name "*.log" -type f -mtime +30 -delete
sudo find /var/log -name "*.gz" -type f -mtime +30 -delete
# 截断大日志文件(保留文件但清空内容)
sudo truncate -s 0 /var/log/large.log
3. 清理包管理器缓存
# CentOS/RHEL/Fedora
sudo yum clean all
sudo dnf clean all
# Ubuntu/Debian
sudo apt-get clean
sudo apt-get autoclean
sudo apt-get autoremove
# 清理孤立包
sudo package-cleanup --leaves
sudo package-cleanup --orphans
4. 清理用户目录
# 清理下载目录
find ~/Downloads -type f -mtime +30 -delete
# 清理浏览器缓存
rm -rf ~/.cache/google-chrome/
rm -rf ~/.mozilla/firefox/*/Cache/
# 清理回收站
rm -rf ~/.local/share/Trash/*
长期解决方案
1. 扩展磁盘空间
# 查看可用磁盘
lsblk
# 扩展LVM逻辑卷
sudo lvextend -l +100%FREE /dev/mapper/vg-root
sudo resize2fs /dev/mapper/vg-root
# 或者添加新磁盘并挂载
sudo fdisk /dev/sdb
sudo mkfs.ext4 /dev/sdb1
sudo mkdir /data
sudo mount /dev/sdb1 /data
echo "/dev/sdb1 /data ext4 defaults 0 2" | sudo tee -a /etc/fstab
2. 移动大目录到新分区
# 移动/var/log到新分区
sudo systemctl stop rsyslog
sudo cp -a /var/log /data/
sudo mv /var/log /var/log.bak
sudo ln -s /data/log /var/log
sudo systemctl start rsyslog
🔧 预防措施
1. 建立监控告警
#!/bin/bash
# disk_monitor.sh
THRESHOLD=85
EMAIL="admin@example.com"
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read output; do
usage=$(echo $output | awk '{print $1}' | cut -d'%' -f1)
partition=$(echo $output | awk '{print $2}')
if [ $usage -ge $THRESHOLD ]; then
echo "磁盘使用率告警: $partition 使用率 $usage%" | mail -s "磁盘空间告警" $EMAIL
fi
done
2. 配置日志轮转
# 编辑/etc/logrotate.conf
sudo vim /etc/logrotate.conf
# 示例配置
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
postrotate
/bin/systemctl reload myapp
endscript
}
3. 定期清理脚本
#!/bin/bash
# cleanup.sh - 定期清理脚本
# 清理临时文件
find /tmp -type f -atime +7 -delete
find /var/tmp -type f -atime +7 -delete
# 清理旧日志
find /var/log -name "*.log.*.gz" -mtime +30 -delete
# 清理包缓存
if command -v yum &> /dev/null; then
yum clean all
elif command -v apt-get &> /dev/null; then
apt-get clean
fi
# 记录清理结果
echo "$(date): 系统清理完成" >> /var/log/cleanup.log
4. 设置磁盘配额
# 启用用户磁盘配额
sudo quotacheck -cum /home
sudo quotaon /home
# 设置用户配额(软限制1GB,硬限制2GB)
sudo edquota -u username
📊 磁盘空间管理最佳实践
1. 分区策略
- 单独分区挂载/var、/tmp、/home
- 为日志文件单独分区
- 保留10-15%的磁盘空间作为缓冲
2. 监控策略
- 设置磁盘使用率告警阈值(通常80-85%)
- 监控inode使用情况
- 定期检查大文件和增长趋势
3. 清理策略
- 建立定期清理计划
- 配置合理的日志轮转策略
- 定期清理不需要的文件和包
4. 应急处理
- 建立磁盘空间应急响应流程
- 准备快速清理脚本
- 定期测试扩容方案
🚨 紧急处理步骤
当磁盘空间达到100%时:
立即清理临时文件
sudo rm -rf /tmp/* /var/tmp/*
截断大日志文件
sudo truncate -s 0 /var/log/messages
重启占用已删除文件的进程
sudo systemctl restart service_name
释放系统缓存
echo 3 | sudo tee /proc/sys/vm/drop_caches
扩展磁盘空间或移动数据
📚 相关工具
- ncdu - 交互式磁盘使用分析
- iotop - I/O使用监控
- lsof - 查看打开文件
- fuser - 查看文件使用进程
- tree - 目录树形显示
通过合理的预防措施和及时的处理,可以有效避免磁盘空间不足对系统造成的影响。
磁盘空间管理是日常运维的重要工作,通过合理的空间管理策略可以避免系统因空间不足而出现问题。