du -sh
查找大文件,find /path -type f -size +100M
筛选超大文件,确认后用 rm
删除;清空日志/缓存(如 journalctl --vacuum-time=3d
当Linux系统提示磁盘已满时,若不及时处理可能导致服务中断、应用崩溃甚至系统无法正常运行,以下是针对此问题的完整解决方案,涵盖原因排查、数据清理、应急处理及预防措施,并提供可落地的操作指南与实用技巧。
快速定位问题根源
确认磁盘使用现状
通过以下命令组合快速定位高负载分区:
# 查看各分区使用率(人类可读格式) df -h # 按目录层级统计文件大小(深度遍历) du -sh / | sort -hr | head -n 20 # 显示前20大目录
✅ 关键解读:关注/dev/mapper/...
(LVM逻辑卷)、/dev/sdX
(物理磁盘)等设备的Use%
列,超过90%需立即干预,若Mounted on
列为且Use%
接近100%,说明根分区已满。
典型场景 | 特征表现 | 风险等级 |
---|---|---|
/var/log 暴涨 |
系统日志持续写入 | |
/home 用户文件过多 |
普通用户存储大量视频/文档 | |
/tmp 临时文件堆积 |
未及时清理的会话残留 | |
/var/lib/docker 膨胀 |
容器镜像未清理 | |
/opt 第三方软件缓存 |
包管理器下载的历史版本 |
实时追踪新增文件
watch -n 5 'lsof +L1 | grep deleted | wc -l' # 监测被删除但进程仍占用的文件数 inotifywatch -m creation -r /path/to/monitor # 监控指定目录新文件创建
⚠️ 注意:若发现大量deleted
状态文件,需终止相关进程才能彻底释放空间。
分级清理策略(按优先级排序)
▶︎ L1级:零风险操作(推荐优先执行)
操作项 | 命令示例 | 预期效果 | 注意事项 |
---|---|---|---|
清理系统日志 | journalctl --vacuum-time=3d |
保留最近3天日志 | CentOS/RHEL适用 |
清空回收站 | sudo trash-empty |
立即释放标记为删除的文件 | 需提前确认无有用文件 |
清理包管理器缓存 | sudo apt autoclean (Debian)sudo yum clean all (RHEL) |
删除已下载的无用包 | 不影响已安装软件 |
截断超大日志文件 | sudo truncate -s 0 /var/log/syslog |
清空日志文件但不删除历史记录 | 需配合日志轮转配置 |
▶︎ L2级:可控风险操作(需谨慎验证)
场景1:清理旧内核
# Debian系 dpkg --list | grep linux-image | grep -v `uname -r` | xargs apt remove --purge # RHEL系 package-cleanup --oldkernels --count=2 # 保留最新2个内核
❗️ 警告:切勿删除当前运行的内核版本!可通过uname -r
查看当前内核。
场景2:清理Docker冗余数据
# 停止所有容器 docker stop $(docker ps -aq) # 删除未使用的镜像、容器、网络、卷 docker system prune -a --volumes
📦 扩展:对于生产环境,建议改用docker system df
先查看各组件占用空间。
场景3:清理数据库日志
# PostgreSQL示例(需超级用户权限) pg_ctl promote -D /var/lib/postgresql/data # 主从切换后清理备库日志 vacuum full; # 全量真空回收空间
💡 替代方案:修改数据库配置文件调整checkpoint_segments
参数,减少WAL日志生成量。
▶︎ L3级:高风险操作(仅作最后手段)
强制删除可疑大文件:
# 查找超过1GB的文件并交互式确认 find / -type f -size +1G -exec ls -lh {} ; | less # 批量删除匹配模式的文件(谨慎!) find /path/to/dir -name ".bak" -exec rm -f {} ;
🔍 安全技巧:先用touch testfile && chattr +i testfile
创建不可变测试文件,验证能否被删除。
特殊场景应对方案
⚠️ 紧急情况:SSH无法登录
当磁盘满载导致SSH连接失败时:
- 物理终端/VNC接入:通过控制台直接操作系统
- 启动救援模式:GRUB菜单选择
rescue
模式,挂载文件系统后执行:mount -o remount,rw /dev/sda1 # 假设根分区在/dev/sda1 rm -rf /tmp/ # 优先清理临时文件
- 使用LiveCD:启动Ubuntu Live USB,挂载目标分区进行数据转移。
🔄 长期解决方案:扩容与优化
方案 | 实施步骤 | 优点 | 缺点 |
---|---|---|---|
LVM扩容 | pvresize /dev/sdb → lvextend -L+5G |
在线扩容无需停机 | 依赖LVM元数据完整性 |
添加新硬盘 | fdisk 分区 → mkfs.ext4 → mount |
独立存储空间 | 需要重新分配挂载点 |
迁移至对象存储 | rsync同步至OSS/S3 → 修改应用配置文件 | 近乎无限扩展性 | 增加网络延迟 |
分布式文件系统 | GlusterFS/Ceph部署 | 高可用+横向扩展 | 架构复杂度提升 |
预防机制建设
🛡️ 自动化监控配置
# 每日凌晨2点执行磁盘检查并发送告警 crontab -e <<EOF 0 2 df -h | mail -s "Disk Space Alert" admin@example.com EOF
📊 可视化工具推荐:Netdata(实时监控面板)、Prometheus+Grafana(历史趋势分析)。
⚙️ 系统级优化设置
# /etc/logrotate.conf 示例配置 /var/log/nginx/.log { daily rotate 7 compress delaycompress missingok notifempty }
🔧 参数说明:rotate 7
表示保留最近7个日志文件,compress
启用gzip压缩节省空间。
常见问题解答(FAQs)
Q1: 为什么我删除了大量文件但df
显示空间仍未释放?
A: 可能原因:① 存在打开该文件的进程(用lsof | grep deleted
查看);② 文件系统未同步(尝试sync
命令);③ 使用了硬链接(stat file
查看Link count),解决方案:重启相关进程或使用fuser
强制关闭文件描述符。
Q2: 如何防止普通用户占满根分区?
A: ① 设置用户配额:quotaon -a
启用配额,edquota useradd
设置软硬限制;② 修改默认shell为nologin
限制非必要登录;③ 将用户家目录迁移至独立分区:usermod -d /home2/username
。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/96392.html