关于ubifs在断电时丢失数据的处理方法

  • 时间:
  • 来源:互联网

关于ubifs在断电时丢失数据的处理方法 


首先要说的是,文件系统在掉电的时候肯定是有几率丢失数据,因为断电可以在任何情况下发生,如果有数据在内存个中来不及写入,那么内存中的数据就丢失了,而且nand上的未写完的数据,可能因为文件对应的信息没有更新,造成重启后文件系统找不到那个文件,或者文件无法打开。所以,最牢靠的办法是使用UPS或者后备电池。 

 
UBIFS具有很好的性能,这从ubifs作为rootfs的mount和启动速度就可以看出。部分原因是ubifs可以说是一个write back的文件系统。 也就是说,ubifs会在内存中维持一个buf,当文件被修改时,只是这个buf的内容被改变,但是不一定会将改动回写到nand;系统会积累一定时间的改动然后再写入,这样能提高系统的性能。但是这样带来的问题是一旦断电,buf里的改动全部丢失。 

 

 解决办法可以有: 

 1. 在kernel的bootargs中加入rootflags=sync,强制使用sync方式mount ubifs,结果就是性能下降 

 2. 在程序中修改了文件内容后,调用fsync 

 

UBIFS是异步文件系统。正如其它Linux文件系统,它使用页cache。页cache是由Linux内存管理单元负责。页cache很大并可以缓存很多数据。当我们把一个文件写入文件系统时,事实上我们的数据是先写入了页cache,标记页为“脏”,然后写函数返回,过一段时间后数据正式写入储存介质。 write-buffer是UBIFS自己的缓冲区,工作于页cache和flash之间。这表示回写并不是写入flash而是写入了write-buffer。 write-buffer是为了改善nand flash性能。write-buffer的大小通常是
nand flash的页大小。

write-buffer的存在可以把一些零散的数据合并起来整页整页地写入到nand flash中。这不但减少了低速的与flash通信的次数,而且减少了flash中的碎片。 当然在写入大量数据时,是不需要用到write-buffer的。只在最后一次写入数据不够一个
nand flash页时,最后的数据缓存起来。

 

当然实现同步的方法有: sync()、fsync(fd)、open时使用O_SYNC、在挂载UBIFS时加上“-o sync”选项。

 

 

 

boyemachao
发布了6 篇原创文章 · 获赞 25 · 访问量 9万+
私信 关注

本文链接http://element-ui.cn/news/show-1763.aspx