阅读:1159回复:12
请LINUX高手指点(200分)本贴本想发在技术论坛,但怕没人注意,斗胆发在水坛,请斑竹见谅。 小弟的测试环境如下:LINUX 6.2 内核2.2.14 。 在这种测试环境下,小弟作了对文件的一些读写和删除操作,也就是(fread, fwrite,unlink)等一些很弱的编程。本来这是极简单的,小弟写了测试程序来测试,跑了一天,正常情况下没问题。 可在极少数的情况下(这样的情况小弟无法重现,极偶然),文件系统发生了异常!!!!出错信息如下: Filesystem panic (dev 03:01) fat_free : deleting beyond EOF File system has been set read_only 小弟再用vi或cp,mv等命令操作时,系统会报错,说文件是只读属性,无法编辑。 小弟十分困惑,重启计算机后,vi或cp,mv等命令操作时,一切正常,再用我写的对文件操作程序来测试, 一切正常,这种异常情况,不能重现,不知道什么时候发生异常,当然这种情况很少见,但时不时出现,一直是我程序中隐含的大问题。 出现这种情况后,小弟查了LINUX内核源程序,发现一些迹象,在 /usr/src/linux/fs/fat 目录下misc.c程序找到了这样一个函数 void fat_fs_panic(struct super_block *s,const char *msg) { int not_ro; not_ro = !(s->s_flags & MS_RDONLY); if (not_ro) s->s_flags |= MS_RDONLY; printk(\"Filesystem panic (dev %s).\\n %s\\n\", kdevname(s->s_dev), msg); if (not_ro) printk(\" File system has been set read-only\\n\"); } 小弟认为操作系统的报错信息是这个函数产生的,可是小弟对LINUX内核程序不是熟悉,不知道这种错误是怎样产生的,在什么情况下产生? 小弟对这个错误十分不解:为什么这样的问题不能频繁重现;是不是我在编译内核时留下的隐患;还是用户层程序中的BUGS??? 请各位高手指点!!! |
|
|
沙发#
发布于:2003-02-25 22:12
tome你可知罪? :D
顶啊。灌~~~~~~~~~~ |
|
|
板凳#
发布于:2003-02-25 22:18
不熟悉,帮您鼎鼎,出点力
|
|
|
地板#
发布于:2003-02-26 09:38
不知道偶能不能得到这200分, 唉, 口水滴答了
下面偶还是试试看嫩不能得到啊: LINUX的文件系统采用的是VFS(Virtual FileSytem) 你所说的操作实际上是VFS的外部接口, 这些本身要具体到实际的文件系统中, 显然, 从你的描述来看, 你的LINUX至少存在这样几个实际的文件系统: ext2, proc, fat, 那么对不同的文件系统最后的实际文件操作是不一样, 比如应用级看到的unlink, 实际上先是调用LIBC中提供的WRAPPER函数, 这个函数然后用INT 0X80来调用SYS_UNLINK, SYS_UNLINK然后调用current -> files -> fd[fd] -> f_op -> unlink(参见linuxroot/include/sched.h 和 linuxroot/include/fs.h中的相关数据结构)。 基本上把文件的操作给描述了一下, 现在来看你的问题, 从你的程序跑的过程中, 你实际上操作了FAT文件系统, 就是说你可能在你的机器上装了MICROSOFT的操作系统和LINUX, 而且在LINUX上你MOUNT了MICROSOFT的操作系统。 可能你没有手工做这个MOUNT的操作, 但是有几个是值得注意的: 1)安装的时候, 你把装有MICORSOFT操作系统的磁盘分区指定为LINUX下的一个文件目录, 比如C盘, 你可能指定为/HOME/HARDDISK/HDA1等 2)在LINUX系统(核心)初始化后, 你在系统的启动脚本中加入了MOUNT指令的SHELL表达式, 在REDHAT下, 你可以看看/etc/rc/下的脚本文件, 如sysinit, rc_local等 3)在超级用户下, 你手工MOUNT了MICROSOFT操作系统的文件系统 注意到这样一些情况, 在这个错误发生时, 是因为你是用只读方式来进行MOUNT的。 就我个人的经验, 除了在MICROSOFT操作系统的分区上不能进行软连接的建立外, 别的文件操作都是可以完成的。 不知道偶说的对不对~, 也不知道有没有帮助。 如有, 给偶分; 如没有, 敬请指正 :D :D :D :D ;) ;) ;) ;) |
|
|
地下室#
发布于:2003-02-26 09:44
忘了说了, 从你的出错看, 显然是MOUNT了C盘(MICORSOFT操作系统下)~~
|
|
|
5楼#
发布于:2003-02-26 10:56
hometown老大说的很是到位,我对文件的操作的确是在DOS分区上,
但我是 MOUNT -T VFAT /DEV/HDA1 /MNT 这个操作我是作的,然后我才对文件进行了一些读写操作, 我把DOS分区MOUNT到/MNT 这个目录下,是有读写权限的的(手工的命令mv cp 等是正常),可在极少数的情况下,文件系统发生了异常, 可是为什么这样的错误不能重现?? 再请老大指点!!! |
|
|
6楼#
发布于:2003-02-26 11:25
hometown老大,分我是照单全给了,还是请你多多指点,毕竟,你说的这几个可能性,我都作过,可不能不管我了
;) ;) ;) ;) ;) ;) ;) ;) ;) ;) ;) ;) |
|
|
7楼#
发布于:2003-02-26 15:11
自己顶一下!!!
|
|
|
8楼#
发布于:2003-02-26 16:38
自己顶一下!!!不知道你有没有对shell做删除, 这个原因不是太明白, 不过通常来说, 不可重复的错误一般是软件的原因, 就这个来看, 很有可能是FAT的接口实现有BUG。 我还没有研究FAT在LINUX底下提供的接口, 不好意思白要了你200分啦~, 不过如果可以描述的清楚的话, 我可以把那些代码看看, 看能不能找到原因 :( :( :( :( |
|
|
9楼#
发布于:2003-02-26 16:46
觉得不应该是AP中的问题, 应该KERNEL中的问题, 如果你不MOUNT上FAT, 我想这个问题出现的可能性会更小, 或者就不会出现
|
|
|
10楼#
发布于:2003-02-26 17:39
[quote]自己顶一下!!!不知道你有没有对shell做删除, 这个原因不是太明白, 不过通常来说, 不可重复的错误一般是软件的原因, 就这个来看, 很有可能是FAT的接口实现有BUG。 我还没有研究FAT在LINUX底下提供的接口, 不好意思白要了你200分啦~, 不过如果可以描述的清楚的话, 我可以把那些代码看看, 看能不能找到原因 :( :( :( :( [/quote] 我的确是对SHELL作了删除,hometown兄真是一针见血,我也怀疑是我的软件错误,hometown兄对我的指点,小弟不胜感激,hometown兄再说见外的话,小弟可愧不敢当!! 我会再仔细的查一遍程序,相信会找到的, hometown兄的指点,小弟再次表示感谢!! |
|
|
11楼#
发布于:2003-02-26 19:02
客气了, 希望能共同提高~~ :D :D :D :D
|
|
|
12楼#
发布于:2003-02-26 19:21
小狗我好崇拜你啊。
|
|