当前位置:首页 > Linux > 正文

linux磁盘已满如何删除文件

使用 du -sh 查找大文件/目录, find /path -type f -exec rm {} ; 删除无用文件,清空 /tmp 及日志文件

在Linux系统中遭遇“磁盘已满”(Out of Space)是一个常见且棘手的问题,可能导致应用崩溃、服务中断甚至系统瘫痪,本文将系统化梳理从诊断到解决的完整流程,涵盖文件定位、安全删除、日志清理、存储优化等关键步骤,并提供可落地的操作指令与风险控制方案。


紧急响应:快速释放空间的核心思路

当收到类似 Write failed: No space left on device 的错误提示时,需立即采取以下行动优先级最高的措施:

# 第一步:查找当前目录下的最大文件/文件夹(递归深度设为1层)
du -ah --max-depth=1 | sort -rh | head -n 5
# 第二步:跳转至占用最高的目录继续深入排查
cd /path/to/largest/directory
du -sh  | sort -rh

此组合拳能迅速锁定主要存储消耗源,若发现某个用户家目录(如 /home/username/)占比异常,大概率存在未清理的大文件;若是 /var/log/ 则需重点处理日志文件。


精准定位:多维度分析磁盘使用状况

全局视角 各挂载点用量统计

命令 作用说明 典型输出解读
df -h 显示所有挂载点的磁盘使用率 重点关注根分区()和使用率>90%的分区
df -Th 额外显示文件系统类型及挂载选项 区分ext4/xfs等文件系统特性
df -i 显示inode使用情况(解决”无剩余空间但无法创建文件”问题) inode用完时即使有空余空间也无法新建文件

微观视角 具体文件追踪

# 按文件大小降序排列前20个文件(含完整路径)
find / -type f -exec ls -l {} + 2>/dev/null | sort -nrk 5 | head -n 20
# 按修改时间排序近7天内新增的大文件(>100MB)
find / -type f -mtime -7 -size +100M -exec ls -lh {} +

注意:第一个命令会输出大量权限错误信息(重定向到/dev/null忽略),第二个命令可精准定位近期产生的冗余文件。


分类处置:不同场景下的删除策略

▶️ 场景1:用户生成的大文件(最常见)

特征:位于 /home//Downloads//tmp/ 或自定义目录,多为视频/压缩包/备份文件。
解决方案

linux磁盘已满如何删除文件  第1张

# 安全删除方案1:交互式确认后删除
find ~/Downloads -type f -size +1G -exec rm -i {} ;
# 安全删除方案2:移动至回收站(需预装trash-cli)
trash-put ~/Videos/.mp4

最佳实践:建立周期性清理脚本:

#!/bin/bash
# 每日清理/tmp下超过3天的文件
find /tmp -mtime +3 -type f -delete

▶️ 场景2:系统日志膨胀(服务器特供)

高危区域/var/log/ 及其子目录(auth.log, syslog, journald日志等)。
清理策略
| 日志类型 | 推荐操作 | 注意事项 |
|—————-|————————————————————————–|———————————–|
| Nginx访问日志 | cat /dev/null > /var/log/nginx/access.log (清空) | 需配合日志轮转配置 |
| Systemd日志 | journalctl --vacuum-time=3d (保留最近3天日志) | 不影响正在运行的服务 |
| Auditd审计日志 | ausearch -ts recent | audit2allow -d → 根据策略删除旧日志 | 需符合合规性要求 |

▶️ 场景3:Docker容器残留

# 删除所有已停止的容器+镜像+卷(生产环境慎用!)
docker system prune -a --volumes
# 选择性清理未使用的镜像
docker image prune -a --filter "dangling=true"

进阶技巧:对频繁部署的应用,建议配置--storage-opt size=...限制容器存储上限。


深度清理:容易被忽视的隐藏空间占用者

包管理器缓存

发行版 清理命令 预期释放空间
Ubuntu/Debian sudo apt autoremove && sudo apt clean 数百MB~数GB
CentOS/RHEL sudo yum clean all 约500MB
Arch Linux sudo pacman -sc 依赖关系复杂

孤立的软件包

# Debian系:查找完全没有依赖关系的孤立包
deborphan --guess-all | xargs apt-get remove -y
# RPM系:查找孤儿依赖
package-cleanup --leaves --exclude-scripts | xargs yum remove -y

CoreDump内核转储文件

# 禁用核心转储生成(永久生效)
echo "kernel.core_pattern=|/usr/bin/cat" >> /etc/sysctl.conf
sysctl -p
# 删除现有核心文件(谨慎操作!)
find /var/lib/systemd/coredump/ -name 'core' -delete

长效机制:防止磁盘再次爆满

监控告警配置

# 安装agedu工具实现每日邮件报警
apt install agedu
crontab -e # 添加以下内容
@daily root agedu -v / --warn-only --summary-only --mail-on-oversized --max-usage=90%

智能日志轮转

编辑 /etc/logrotate.conf 示例配置:

# 自定义日志轮转策略(保留最近7天,压缩至gzip格式)
/var/log/myapp.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data www-data
}

配额管理(针对多用户场景)

# 为用户john设置软硬配额(软配额=警告阈值,硬配额=绝对上限)
quotacheck -cumg /dev/sda1
quotaon /dev/sda1
setquota -u john 8G 10G /home/john

特殊情形处理指南

情况1:删除文件时报”Device or resource busy”

原因:文件正被进程占用。
解决

# 查找占用进程PID
lsof | grep deleted_file.txt
# 终止相关进程(谨慎操作!)
kill -9 <PID>
# 或重启对应服务后再删除
systemctl restart httpd.service

情况2:inode耗尽但磁盘有空余空间

诊断df -i 查看inode使用率。
解决

# 查找小文件泛滥的目录(每个文件至少占1个inode)
find /path/to/suspect -xdev -type f -printf '%hn' | sort | uniq -c | sort -nr
# 合并碎片化的小文件(如图片库)
montage .jpg -tile 4x4 -geometry 256x256 output.jpg

相关问答FAQs

Q1: 我不小心删除了重要文件怎么办?还能恢复吗?

A: 立即停止对该分区的任何写入操作!尝试以下方法:

  1. EXT系列文件系统:使用extundelete工具扫描恢复:
    sudo apt install extundelete
    sudo umount /dev/sda1 # 必须先卸载分区!
    extundelete /dev/sda1 --restore-all
  2. 专业数据恢复:若上述无效,建议关机后拆盘送专业机构恢复。️ 切勿继续往该分区写入数据!

Q2: 如何设置自动清理/tmp目录的任务?

A: 创建系统级定时任务:

# 编辑crontab
crontab -e
# 添加以下行(每天凌晨3点清理/tmp下超过24小时的文件)
0 3    find /tmp -mtime +1 -type f -delete >/dev/null 2>&1

优化建议:对于高频使用的临时目录,可采用tmpfs内存文件系统加速访问:

# 修改/etc/fstab添加如下行(重启生效)
tmpfs /tmp tmpfs defaults,noatime,mode=1777
0