Chinaunix首页 | 论坛 | 博客
  • 博客访问: 692252
  • 博文数量: 192
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2177
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(192)

文章存档

2024年(8)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2015-05-27 18:00:38

剩余空间不足故障处理过程
     一、 问题描述:
            在编译jave程序的时候,报磁盘剩余空间不足的错误。
     二、故障环境:
            系统版本:suse10sp3的64位系统
            kernel版本:(suse10sp3发行版原始版本)略
            文件系统:reserfs文件系统
            javec版本:略
            故障发生时工作目录:/opt
     二、处理过程:
            a、要到了故障单板环境后,重现了故障。
            b、
用df命令查剩余空间,已用空间不到1%。
            c、用touch/mkdir/vi/dd等工具创建并保存各种大小的文件不会出故障,怀疑是否编译器有故障呢?
            d、
后来多方折腾后发现,同一单板上的另一个分区没有这个错误。编译器的疑点暂时排除了。
            e、用gcc处理,"gcc test.c"
也会发生ENOSPC错误,算是用另一种方法重现了故障。
            f、
把发生故障的分区格式化一遍,故障仍然发生。
            g、放一个能够在其它机器上编译链接成功的test.c文件,用gcc分阶段处理test.c时在
链接阶段gcc test.o -o test发生了ENOSPC错误
            h、查看故障所在分区是reserfs文件系统,分区大小8.6TB。同一块单板上另一分区也是reserfs文件系统大小100GB没有此故障。
            i、
在束手无策之下,李宁提了一下说:“你用strace跟一下看看”。总算是有了个头绪。后来就发现用gcc处理C代码进行到链接阶段write()系统调用中返回了ENOSPC错误,基于对linux系统结构的了解,一下就觉得应该是分区或reserfs文件系统故障了。
            j、将出现故障的分区
用xfs文件系统重新格式化,没有出现故障,换回reserfs文件系统又发生故障,进一步认定是reserfs文件系统故障。
            k、另一个分区上的reserfs文件系统空间小却没发生故障,调整空间大小分别为200G/400G/800G/1.2T/2.2T/.../7.2T/8.2T,发现差别在8T的边界,故障只发生在容量大于8T的情况。
            l、找对应的reserfs文件系统版本原代码。想找出返回错误的那段代码。看了好几天,没看出什么明堂,再查作者信息,翻出了reserfs文件系统作者因谋杀而入狱的消息,并且这个文件系统已经有几年没更新了。
            m、在资料不足能力有限,不能具体定位的情况下,采用了另一种方法,找出故障发生的准确条件,用简短的C代码,创建文件并写入内容。在用系统调用open/creat创建一个空文件,用lseek定位文件指针到2048之后并且不是4096倍数的位置,再write写入数据时,故障发生了……
        
    三、结论:
            至此故障发生的条件清晰起来。
            1、suse10sp3的bit64系统,使用reserfs文件系统;
            2、分区大小大于8TB;
            3、在此分区上创建一空文件,用lseek移动文件指针到大于2048并且不等于4096的倍数的地方,然后用write写数据,故障发生。
阅读(113) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~