嵌入式爱好者

开发板ubuntu系统异常断电导致文件变成0kb

2023-12-13 13:08| 发布者: 香飘飘~~~| 查看: 82| 评论: 0

类目: T507系列产品  >  Ubuntu     文档编号: 1233

    问题现象:

ubuntu系统下,批量执行cp命令后,机子立马断电(arm板),开机后发现文件大小都变为了0kb。但如果是过一会儿再断电,文件大小就正常。

原因:

linux这边读写文件都是优先在cache里面的,也就是cache/buffer的机制。当回写进程触发,或者脏数据超时(简单来说就是满足条件触发回写),缓存才会开始把数据写到IO。也就是说执行完cp后,如果有空闲的内存,那么就会默认写到内存里头,如果断电时候,回写没有触发,数据就全部丢失了。

解决方法:

1、执行完cp后,调用sync命令。但是sync也只是告诉系统要开始写IO而已,实际还是异步,所以还是得等。所以可以调用sync后,执行sleep,不过sleep的度不好把控,要根据实际情况自己推算。

  如果是大文件的话,可以大文件拆分来写,但也只能解决燃眉之急,如果是arm这种随时断电的机子,还是没法解决。

2linux后台有守护进程每隔一段时间执行一次sync,那么可以修改或者说缩短sync时间,通过多写来确保数据安全。或者也可以减小cache,让sync的条件更容易触发,来解决这个问题。两个本质上都是提高系统从cacheIO的频率。

3、通过fflushfsync来实现。因为fsync是同步的,会等到写磁盘成功才返回。但是这样的话,时间的损耗就比较大。

    补充:

1、这种很随机的断电操作其实是很致命的,你无法保证关机的时候IO已经结束,个人认为硬件方面加个断电保护才是最可靠有效的。

2、如果没做断电保护,可以每次写的时候先写一次备份,备份写完再COPY到主文件。这样就算断电数据丢失,也能保证主文件和备份至少有一个数据是完整的(只是不能保证数据一定是最新的)。在业务允许的情况下(允许数据不一定要最新),这个方法我觉得反而是最简单有效的。



已解决

未解决

只是看看

最新评论

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-11-22 11:41

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

返回顶部