No space left on device 原因及排查方法

1. 概念

  • 首先我们要清楚inodeblock的概念
    • inode在格式化创建文件系统的时候诞生,用来存放文件的属性信息,存放着block的位置,没有文件名,创建一个非空文件占用一个inode和至少1个block
    • block是实际存放数据的位置,block大小1k4k8kcentos 6.x(分区大于500M 默认是4k),文件很大的话占用多个block, 文件非常小的时候1k block剩余的空间不能继续使用,所以系统中block消耗更快

结论

磁盘满了就分为,inode满了,block满了,以及一种特殊的情况

2. 文件删除原理

  • 硬链接数为0(所有硬链接均被删除)
  • 进程调用数为0(没有进程在调度文件)

3. 原因分析

硬链接数为0,进程调度数不为0

4. 解决方案

1. 查看是否是block满了

  • 查看所有block使用情况

    df -h
    
  • 查找大文件

    du -sh /usr/* | grep G
    
  • 删除大文件(按照实际情况)

    rm -f /usr/local/bin/1g
    
  • 再次查看所有block使用情况

    df -h
    
  • 未解决继续看第二步

    2. 查看是否inode满了(df -h发现还有空间)

  • 查看inode使用情况

    df -i
    
  • 如果小文件太多,采用a.txtb.txt 一批一批的删(按照实际情况)

    rm -f *.txt
    
  • 查找系统中 目录大小大于1M(目录一般大小为4K,所以目录要是大了那么文件必然很多)

    find / -size +4k -type d |xargs ls -ldhi
    
  • 再次查看inode使用情况

    df -i
    
  • 未解决继续看第三步

3. 查看是不是文件被占用一直没被彻底删除(特殊原因)

这种情况往往是容易被忽略,也是让人郁闷的,因为你会发现df -h明明已经有空间了,但是就是放不进去东西。

  • 显示出系统中被打开的文件

    lsof | grep deleted
    

    显示结果

    结果:
    第一列 软件/服务的名称
    第八列 文件的大小
    第10列 文件的名字
    第11列 标记(硬链接数为0 进程调用数不为零 就会有 delete)
    
  • 重启对应的服务 释放磁盘空间(按照实际情况)

  • 杀掉占用空间的服务

    kill -9 <pid>
    
    /etc/init.d/rsyslog restart
    
  • 再次查看所有block使用情况

    df -h