剩余空间不足故障处理过程
一、 问题描述:
在编译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写数据,故障发生。
阅读(111) | 评论(0) | 转发(0) |