磁盘空间不足问题

title

磁盘空间不足是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%时:

  1. 立即清理临时文件

    sudo rm -rf /tmp/* /var/tmp/*
    
  2. 截断大日志文件

    sudo truncate -s 0 /var/log/messages
    
  3. 重启占用已删除文件的进程

    sudo systemctl restart service_name
    
  4. 释放系统缓存

    echo 3 | sudo tee /proc/sys/vm/drop_caches
    
  5. 扩展磁盘空间或移动数据

📚 相关工具

  • ncdu - 交互式磁盘使用分析
  • iotop - I/O使用监控
  • lsof - 查看打开文件
  • fuser - 查看文件使用进程
  • tree - 目录树形显示

通过合理的预防措施和及时的处理,可以有效避免磁盘空间不足对系统造成的影响。

磁盘空间管理是日常运维的重要工作,通过合理的空间管理策略可以避免系统因空间不足而出现问题。


powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:47:16

results matching ""

    No results matching ""