Linux磁盘空间100% 查找并删除大文件

本文介绍如何在Linux系统中诊断磁盘空间不足的问题,并提供实用的命令行技巧来查找及删除大文件,确保系统稳定运行。

Linux磁盘空间100% 查找并删除大文件

发现问题

  • 如果是数据库,在客户端操作(比如navicat)数据库的时候,会弹窗报错No space left on devicejava应用也会在日志里报这个错;
  • 如果是spring-boot spring-cloudeureka状态会显示DOWN
  • 其他应用程序应该也会出现不同的down,比如连不上、响应速度非常慢等等。

问题验证

直接使用df命令查看磁盘占用情况:

df -h
#output>>>>>>>>>>>>>>>>
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/vg_192-lv_root   50G   44G  3.4G  100% /
#output>>>>>>>>>>>>>>>>

发现是真的,解决办法有两种:

  1. 扩容,可以参考这里:Linux 磁盘扩容
  2. 查找大文件,确认是什么原因导致磁盘被占满,要么更改一些策略,比如kafka日志清理策略、CDH集群健康日志清理策略等,要么删除大文件。

这里记录查找并删除大文件。

查找大文件

使用dudf命令定位大文件:

# 先确定是哪个文件夹占用较多
# 如果文件较多命令执行可能很慢,在知道大概位置的情况下不建议直接对根目录操作
# du的--max-depth=1表示只展示第一个层级的目录和文件
# sort的-h选项和du的-h选项一个意思,-r表示倒叙,默认升序
du -h / --max-depth=1 | sort -hr | head -n 10
#output>>>>>>>>>>>>>>>>>>>>>>>>>>
50G /
28G    /var
6.0G   /dfs
4.0G   /opt
3.0G   /root
2.3G   /usr
148M   /lib
39M    /log
30M    /etc
29M    /boot
#output>>>>>>>>>>>>>>>>>>>>>>>>>>

# 定位到/var目录占用超过50%(磁盘总量50G)
# 继续往下层目录找
du -h /var --max-depth=1 | sort -hr | head -n 10
#output>>>>>>>>>>>>>>>>>>>>>>>>>>
28G    /var
24G    /var/lib
3.8G   /var/log
371M   /var/cache
...
#output>>>>>>>>>>>>>>>>>>>>>>>>>>

# 继续/var/lib
du -h /var/lib --max-depth=1 | sort -hr | head -n 10
#output>>>>>>>>>>>>>>>>>>>>>>>>>>
24G    /var/lib
10G    /var/lib/mongo
8.4G   /var/lib/cloudera-service-monitor
4.5G   /var/lib/cloudera-host-monitor
319M   /var/lib/mysql
...
#output>>>>>>>>>>>>>>>>>>>>>>>>>>

# 最后发现是mongo 数据量太多以及cdh集群健康数据太多
# 可以设置mongo journal使用smallfile,否则文件到达1G并且文件所记载的写操作都被使用过了才会删除
# cdh日志默认在文件达到10G的时候才会回滚,这里也可以做文章

删除大文件

假设找到了对应的文件夹或文件并且可以删除,可以直接使用rm删除,也可以按照时间删除,比如一些日志文件,需要删除靠前的日志,较新的日志暂时还不能删除。

按文件大小删除

比如需要删除超过500M的文件,而不是删除整个文件夹:

# 建一个临时文件夹做测试
cd /tmp
mkdir test
cd test

# 建几个大文件试试
# seek表示跳过文件中指定大小的部分,实际上并没有写入任何数据
# 生成1000G的文件
dd if=/dev/zero of=test-big1 bs=1G count=0 seek=1000
# 生成1000M的文件
dd if=/dev/zero of=test-big2 bs=1M count=0 seek=1000

#查找 -size参数值中+表示> -表示< 不写表示等于
find /tmp/test -type f -size +200M
#output>>>>>>>>>>>>>>>
/tmp/test/test-big2
/tmp/test/test-big1
#output>>>>>>>>>>>>>>>

find /tmp/test -type f -size +2000M
#output>>>>>>>>>>>>>>>
/tmp/test/test-big1
#output>>>>>>>>>>>>>>>

find /tmp/test -type f -size -2000M
#output>>>>>>>>>>>>>>>
/tmp/test/test-big2
#output>>>>>>>>>>>>>>>

# 删除
# {} \;不能丢
find /tmp/test -type f -size +2000M -exec rm -rf {} \;
ls
#output>>>>>>>>>>>>>>>
test-big2
#output>>>>>>>>>>>>>>>

按时间和名称删除

# 删除修改时间距今超过10天的以.gz结尾的文件
# -mtime参数值中 0表示修改时间在24小时内 +x表示修改时间距今超过x天 -x表示距今少于x天 不写正负号表示等于
find tmp/test/* -mtime +10  -name "*.gz" -exec rm -rf {} \;
### Linux 系统磁盘空间满的解决方案 #### 查找清理不必要的文件 为了应对Linux系统中的磁盘空间不足问题,首先要识别哪些类型的文件占据了过多的空间。常见的情况包括日志文件、缓存文件、临时文件以及不再需要的大文件或旧版本软件包。定期清理这些文件有助于维持系统的稳定性和性能[^1]。 对于日志文件过大的情况,可以考虑配置logrotate工具自动轮转和压缩日志文件;而对于缓存文件,则可以通过调整应用程序设置减少其大小或者手动清除不需要的部分。另外,使用`find`命令可以帮助定位特定时间范围内未访问过的大型文件: ```bash find /path/to/search -type f -size +100M -atime +7 -exec rm {} \; ``` 此命令会删除在过去七天内未曾被读取且大于等于100MB的所有文件。 #### 处理已删除但仍被占用的文件 有时即使已经执行了`rm`指令移除某个大文件,在它仍然由其他进程持有打开状态的情况下,该文件所占据的空间不会立即得到回收。此时应当借助lsof(List Open Files)工具找出所有处于此类状况下的实例,终止相关联的应用程序以便彻底释放资源[^3]: ```bash lsof | grep '(deleted)' kill $(lsof -t | grep '(deleted)') ``` 上述脚本先列出所有标记为`(deleted)`的状态条目再获取它们所属PID列表进而实施强制结束操作。 #### 使用df与du对比分析差异 当面对`df`报告整体利用率接近极限但`du`统计各目录下实际消耗量相对较小的情形时,很可能意味着存在前述提到的“幽灵”文件现象——即已被物理层面抹去却因逻辑连接尚未解除而持续霸占着宝贵额度。这时除了依靠lsof外也可以尝试重启服务乃至整机来达到相同目的[^5]. 此外,经常运用这两个实用的小工具做周期性的巡检工作同样重要,因为这样能提前预警潜在风险点从而采取预防措施而不是等到危机爆发才手忙脚乱地补救。 #### 创建额外存储卷或扩展现有分区 假如经过一番努力之后依旧难以腾挪出足够的余裕度供业务运作所需的话,不妨思考一下是否有可能增设新的硬盘设备作为独立挂载点或者是对当前布局内的某些区域施行扩容处理。当然这一步骤往往涉及到较为复杂的变更流程所以务必谨慎行事以免引发更严重的后果[^2]。 #### 定期监控与自动化维护策略 建立一套完善的监测机制用来跟踪记录各项指标变化趋势无疑是非常必要的举措之一。一方面可设定阈值触发告警通知相关人员及时介入处置异常波动事件;另一方面则应制定例行任务计划安排诸如垃圾收集之类的常规作业以减轻人为干预负担提高效率降低失误概率[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值