当前位置:  技术问答>linux和unix

单板断电,jffs2分区丢失

    来源: 互联网  发布时间:2016-08-14

    本文导语:  大家好,最近遇到了一个麻烦问题,希望大家不吝赐教,谢谢。 现象:单板突然断电,结果单板再启动的时候,导致配置文件全部丢失 分析:配置文件是放在/dev/mtd4分区的,单板在启动的时候,会执行如下脚本: ...

大家好,最近遇到了一个麻烦问题,希望大家不吝赐教,谢谢。

现象:单板突然断电,结果单板再启动的时候,导致配置文件全部丢失

分析:配置文件是放在/dev/mtd4分区的,单板在启动的时候,会执行如下脚本: 

# Check for a jffs2 FS on mtd4 and mount mtd4 to /userconfig 
if [ $mtd4_valid = "1" ]; then 
  erase_mtd4=0 
  echo "Checking for jffs2 filesystem on mtd4" 
  mtd_debug read /dev/mtd4 0 2 /var/tmp/jffs2test >/dev/null &&  
    hexdump /var/tmp/jffs2test | grep '0000000 1985' >/dev/null  -->这里会去分析mtd4的头两个字节,如果不是1985,则后面会erase掉整个分区,然后重新mount 
  if [ $? = "0" ]; then                                
    echo "Mounting /userconfig" &&  
      /bin/mount -n -t jffs2 /dev/mtdblock4 /userconfig ||  
        (echo " Flash mount failed" && erase_mtd4=1) 
  else 
    echo " Not found" && erase_mtd4=1 
  fi 
  rm -f /var/tmp/jffs2test 
fi 

# If mtd4 needs erasing, do so and then mount it to /userconfig 
[ $mtd4_valid = "1" -a $erase_mtd4 = "1" ] &&  
(echo "  Erasing mtd4 and mounting /userconfig." &&  
  echo "  This will take a couple minutes, as will the initial flash access." &&  
    /sbin/mtd_debug erase /dev/mtd4 0 ${mtd4_size} >/dev/null &&   -->配置文件之所以丢失是因为整个分区被erase掉了
    /bin/mount -n -t jffs2 /dev/mtdblock4 /userconfig || mtd4_valid=0)

我比较疑惑的是,断电之前,并未操作/dev/mtd4,只是做了文件的拷贝,cp命令。按道理来说应该是直接操作/dev/mtd4,比如fd = open("/dev/mtd4"),然后再做ioctl(fd,MEMERASE,size), 

如果在erase的过程中断电,那么在启动的过程中,肯定会erase掉整个分区,然后再重新mount。但是关键是,我们并未像上面那样操作,而仅仅做了文件的拷贝(文件是拷贝到mtd4分区的),没有那样直接对flash分区的操作。 

然而从现象上来看,的确是有什么东西操作了flash的mtd4分区,在操作的过程中被断电,导致出现问题。 

下面是故障出现时的打印,

MD_SetMediaModeReq  Ch 1 RTxMode 3 
11930:26:59 [DB][Info] [dbc_mgr_file.c(130)dbFileCopy]  Start cp -f /var/tmp/db_user_cfg.xml /userconfig/cfg/db_user_cfg.xml  -->这里做了拷贝,貌似还没拷贝完就断电

00007100

Copyright 2001-2006 PMC-Sierra, Inc.
Detected RAM size: 0x04000000
No manufacturing flash config at bfc00020
......
get the mtd4's info
Checking for jffs2 filesystem on mtd4
 Not found
  Erasing mtd4 and mounting /userconfig. --> 这里没有找到上面所说的'0000000 1985',于是就erase掉mtd4了......
  This will take a couple minutes, as will the initial flash access.
Erased 3407872 bytes from address 0x00000000 in flash

按道理来说,仅仅做cp命令,如果不直接读写/dev/mtd4,是不可能会把jffs2文件系统的头给弄坏的啊,纠结ing

还请各位xdjm帮忙分析分析,这其中有啥古怪呢?不胜感激~~~


|


我所说的 损坏的数据并不是指 flash 上的坏块, jiffs 是有坏块管理的,或者说它能够避开坏块,不去使用坏块。
所谓的坏块,其实就是不能完全擦除干净的块,其实还是能写入数据的。
所谓损坏的数据, 比如你现在的情况, 刚擦除,还没写入就掉电了, 这种就算是了。
另外还有一些,比如硬件不够稳定,导致写入的数据不完整, 或者驱动写得不够健壮,
都有可能引起数据不完整的情况出现, 而这些数据就是 jiffs 不认可的数据,但是 flash 硬件并没有问题,
或者说这个块并不是坏块。



是不是如果一个分区里只要有一个坏block,jffs2就mount不上呢?如果不是这样的话,那么导致
===========================================
坏的数据可能导致 jiffs2 mount 不起来, 但是 flash 上的坏块却不会导致 mount 不起来。
jiffs2 mount 不上的原因只能去读代码了, 就是要看哪些情况对程序来书哦是不合法的。
yaffs2的代码我阅读过, jiff2 的没仔细研究过,所以不好说。。。

至于 flash IC 自己会标识坏块, 这个说法也是错误的。
标识坏块要靠软件去做,或者说驱动去 修改第一个 block的 第一个 page 的标志来实现。
硬件自己可干不了这事, 具体可参考 内核中的 nand_base.c 和 nand_bbt.c

|
1. 不论是nor 还是 nand flash在写入数据前,都会按块来擦除,然后才能写入数据。
jffs2文件系统有擦写平衡算法,那么pottichu讲的"你的问题应该出现在刚擦除第一个块,还没来得及写入就断电了, 所以出现了这个问题。要重现,是非常困难的",当然存在。

2. 也许有可能是jffs2或者kernel驱动的bug,我在2.6.18的内核中,在nor flash里使用jffs2,碰到过nvram数据在断电后丢失的情况,丢失的概率是 5%左右。

|
哦,不会有其他程序操作mtd4了吧.

楼主你的嵌入式单板,用的flash当做普通pc系统的硬盘吗?就是说你的存储设备除了ram就是flash,而且系统重启后,上次的操作都会保留?

|
搬板凳学习之

|
   学习,也学不了,好多都不知道。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 求帮忙解决在linux下usb转为串口用来接收和发送数据给M0单板的一个问题 !!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3