注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小楼一夜听风雨

计算机知识、分子模拟、Linux学习,与您共分享!

 
 
 

日志

 
 

Linux下磁盘空间不足?其实是inode不足。  

2010-07-08 09:17:33|  分类: Linux学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      为了性能测试需要相同的图片,最简单同时也是最节省空间的方法就是采用软链接的方式。写了个简单的脚本来创建图片的软链接:
Bash代码 复制代码
  1. id=1000000000  
  2.   
  3. for((;id< 1010000000; id++))   
  4. do   
  5.     getUrl $id   
  6.     mkdir -p $url   
  7.   
  8.     ln -s 1.jpg "$url/$id.summ.jpg"  
  9. done  
id=1000000000    for((;id< 1010000000; id++))  do   getUrl $id   mkdir -p $url     ln -s 1.jpg "$url/$id.summ.jpg"  done

 把这个脚本放到服务器上执行,过了一段时间去看打印出来的日志,一直在报错,统计了一下生成的软链接数目,也只有60多万。脚本报的错误是:No space left on device

      使用df命令查看了下空间结果显示:

Bash代码 复制代码
  1. Filesystem           1K-blocks      Used Available Use% Mounted on   
  2. /dev/xvda3             5036316    216108   4564376   5% /   
  3. /dev/xvda1              101086     11236     84631  12% /boot   
  4. none                   2097216         0   2097216   0% /dev/shm   
  5. /dev/xvda8            48917076  40962920   5469304  89% /home   
  6. /dev/xvda5             3020140     37348   2829376   2% /tmp   
  7. /dev/xvda2            10080520   6175608   3392844  65% /usr   
  8. /dev/xvda6             3020140    133712   2733012   5% /var  
Filesystem           1K-blocks      Used Available Use% Mounted on  /dev/xvda3             5036316    216108   4564376   5% /  /dev/xvda1              101086     11236     84631  12% /boot  none                   2097216         0   2097216   0% /dev/shm  /dev/xvda8            48917076  40962920   5469304  89% /home  /dev/xvda5             3020140     37348   2829376   2% /tmp  /dev/xvda2            10080520   6175608   3392844  65% /usr  /dev/xvda6             3020140    133712   2733012   5% /var

 /分区还有很多空间,怎么会出现空间不足的错误呢?

      再次使用df命令查看,这次改变参数:使用df -i查看:

Bash代码 复制代码
  1. Filesystem    Inodes   IUsed   IFree IUse% Mounted on   
  2. /dev/xvda3    640000  640000       0  100% /   
  3. /dev/xvda1    26104      40   26064    1% /boot   
  4. none         184353       1  184352    1% /dev/shm   
  5. /dev/xvda8    6213760 1559069 4654691   26% /home   
  6. /dev/xvda5    384000      28  383972    1% /tmp   
  7. /dev/xvda2    1281696  167764 1113932   14% /usr   
  8. /dev/xvda6    384000    3074  380926    1% /var  
Filesystem    Inodes   IUsed   IFree IUse% Mounted on  /dev/xvda3    640000  640000       0  100% /  /dev/xvda1    26104      40   26064    1% /boot  none         184353       1  184352    1% /dev/shm  /dev/xvda8    6213760 1559069 4654691   26% /home  /dev/xvda5    384000      28  383972    1% /tmp  /dev/xvda2    1281696  167764 1113932   14% /usr  /dev/xvda6    384000    3074  380926    1% /var

 可以看到,/分区的inode已经被全部耗尽。

    先介绍下什么是inode。inode是文件系统分配用来记录文件位置和属性的结构,在一些文件系统中(如ext2, ext3等),它的数量在格式化的时候,就已经确定。如果文件系统是一本书,那么,inode就是这本书的目录。像ext3这样的文件系统,在格式化的时候,这本书的最大目录数已经确定。在你写书(保存文件到磁盘)的过程中,可能生的情况有:纸用完了(磁盘空间不足),这种情况下,当然无法保存新的文件了;另外一种情况,就是目录写完了(inode节点全部分配完了),这种情况下,虽然还有纸(磁盘空间),但由于目录(inode)已经没有了,没有了目录,文件就会无法找到,操作系统当然不会让你新建文件了。

     现在发生的情况就是因为inode全部被用完了,虽然还有磁盘还有空间,但是文件系统已经无法再记录这些空余空间了,因此也就不能再创建文件(文件夹)了。

      因为ext3文件系统的inode是在格式化文件系统的时候就已经确定的,要修改文件系统的inode数就只能格式化文件系统,这在服务器上显然是不可能的。临时的解决方法如下:

 

1、创建一个大的块文件:

Bash代码 复制代码
  1. dd if=/dev/zero of=disk.img count=1024 bs=1024KB    
dd if=/dev/zero of=disk.img count=1024 bs=1024KB  

 通过dd命令,将zero问价写入自定义的disk.img文件1024次,每次写入1024Kb,也就是创建一个1GB的文件,用zero文件进行填充。

 

2、格式化这个块文件:

Bash代码 复制代码
  1. mkfs.ext2 -N 5000000 -b 1024 -I 128 disk.img  
mkfs.ext2 -N 5000000 -b 1024 -I 128 disk.img

 格式化成ext2分区(因为ext3有日志系统,会消耗空间),制定inode大小为128byte(这个是linux内核限制的最小inode大小),制定inode数量为5000000,制定块大小为1024byte。

 

3、挂载该块文件

Bash代码 复制代码
  1. mount -o loop disk.img /mnt/xxx  
mount -o loop disk.img /mnt/xxx

 因为这个文件不是真正的块文件,所以需要增加-o loop参数。

 

    这样,这个就可以在这个块文件上创建大量的软链接了,这个1G的文件上有500w的inode,对于软链接这种基本不占空间,但是狂占inode的,非常适合。当然,更好的方法,是更换文件系统使用像ext4这样的新文件系统,这些文件系统中inode是动态分配的。

  评论这张
 
阅读(2493)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018