linux var目录 掉电,linux 修改的文件在掉电时会损坏的分析与处理

我们开发的嵌入式产品进入测试阶段,发现多次开关机之后,有两个文件会损坏。我们发现在app的关机处理函数里面,会对两个文件进行写入操作,然后就切断电源。这种情况下很有可能文件还没写入完成,就已经断电了。

现在修改成以下的做法:

1、对文件进行写入操作

2、system("sync");

3、sleep(2);

4、system("poweroff");

5、需要在内核驱动中实现切断电源的操作:

SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg)//kernel/sys.c

-->...

-->case LINUX_REBOOT_CMD_RESTART:

-->kernel_restart(NULL);

-->kernel_restart_prepare(cmd);

-->...

-->machine_restart(cmd);

-->...

-->case LINUX_REBOOT_CMD_POWER_OFF:

-->kernel_power_off();

-->if (pm_power_off_prepare)//如果实现了平台相关的函数则执行

-->pm_power_off_prepare();

-->...

-->machine_power_off();

-->machine_shutdown();

-->if (pm_power_off)//如果实现了平台相关的函数则执行

-->    pm_power_off();

-->do_exit(0);

-->...

其中:pm_power_off_prepare()以及pm_power_off()与具体平台相关

Freescale i.MX6:

mx6_sabresd_board_init(void)-->pm_power_off = mx6_poweroff;

static void mx6_poweroff(void)

{

mx6q_board_powerctrl(0);//仅仅是断开电源

}

后来再经过批量试产,发现使用上面的这种方法还是没能解决文件损坏的问题。之后我在网上找到了下面这篇文章,关于Ext3 的三种日志记录方式 :

Ext3 提供三种数据日志记录方式: data=writeback 、 data=ordered  (默认) data=journal。

1 data=writeback 方式

data=writeback方式下,ext3根本不执行任何形式的数据日志记录,提供给您的是和在XFS,JFS和 ReiserFS文件系统中找到的类似的日志记录(仅元数据)。这会让最近修改的文件在出现意外的重新引导事件中被毁坏。如果不考虑这个缺点, data=writeback 方式在大多数情况下应该能够提供最佳的ext3性能。

2 data=ordered 方式

data=ordered方式下,ext3只是正式记录元数据,而在逻辑上将元数据和数据块分组到称为事务的单个单元中。到了将新的元数据写到磁盘上的时候, 首先写的是相关的数据块。

data=ordered方式有效地解决了在 data=writeback 方式下和大多数其它日志记录文件系统中发现的毁坏问题,而这是在不需要完整数据日志记录的情况下做到的。一般说来,data=ordered ext3文件系统执行的速度比data=writeback文件系统执行的速度稍微慢一些,但比对应的完整数据日志记录还是要快出许多。

将数据附加到文件时,data=ordered方式提供了ext3完整数据日志记录方式提供的所有完整性保证。

不过,如果正在覆盖某一部分文件,而此时系统崩溃,那么有可能所写的区将包含原始块和在其中散布了更新块的组合。这是因为 data=ordered 不提供首先覆盖哪一个数据块的保证,因此不能假设只是因为更新了被覆盖的块 x,也就更新了被覆盖的块 x-1。

data=ordered让写操作顺序由硬盘的写高速缓存决定。这个限制并不经常具有负面影响,因为附加的文件一般比覆盖的文件更普遍。出于这个原因,data=ordered 方式是对完整数据日志记录的一个很好的更高性能的替代。

3 data=journal 方式

data=journal 方式提供了完整数据和元数据日志记录。所有新数据首先写入日志,然后再写入它的最终位置。在崩溃情况下,可以重放日志,使数据和元数据处于一致的状态。

要指定日志方式,可以使用如下方式:

1 向/etc/fstab的选项节添加适当的字符串例如 data=journal

2 在调用 mount 时直接指定 -o data=journal 命令行选项。

如果您愿意指定用于根文件系统的数据日志记录方法data=ordered是缺省值,则可以使用名为 rootflags 的特殊内核引导选项。因此,要将根文件系统置于完整数据日志记录方式下,则向内核引导选项添加rootflags=data=journal 。

如果我们想要查看某一个磁盘对应的文件系统的日志方式应该怎么查询,这里可以通过dmesg 命令:

[root@rac4 ~]# dmesg | grep -B 1 "mounted filesystem"

kjournald starting.  Commit interval 5 seconds

EXT3-fs: mounted filesystem with ordered data mode.

--

EXT3 FS on sda1, internal journal

EXT3-fs: mounted filesystem with ordered data mode.

--

EXT3 FS on sdb1, internal journal

EXT3-fs: mounted filesystem with journal data mode.

--

EXT3 FS on sdb1, internal journal

EXT3-fs: mounted filesystem with writeback data mode.

用dmesg这个工具来查看一些硬件的信息,命令记录对所以文件系统mount的信息,对/home/yang 进行mount和umount操作,会在dmesg 命令输出中显示出来!

[root@rac4 yang]# mount -o data=journal /dev/sdb1 /home/yang

[root@rac4 yang]# df -h

文件系统              容量  已用 可用 已用% 挂载点

/dev/sda3              26G   12G   13G  48% /

/dev/sda1              99M   12M   83M  13% /boot

tmpfs                 2.0G     0  2.0G   0% /dev/shm

/dev/sdb1              20G  173M   19G   1% /home/yang

[root@rac4 yang]# df -h

文件系统              容量  已用 可用 已用% 挂载点

/dev/sda3              26G   12G   13G  48% /

/dev/sda1              99M   12M   83M  13% /boot

tmpfs                 2.0G     0  2.0G   0% /dev/shm

[root@rac4 yang]# mount -o data=writeback  /dev/sdb1 /home/yang

[root@rac4 yang]# df -h

文件系统              容量  已用 可用 已用% 挂载点

/dev/sda3              26G   12G   13G  48% /

/dev/sda1              99M   12M   83M  13% /boot

tmpfs                 2.0G     0  2.0G   0% /dev/shm

/dev/sdb1              20G  173M   19G   1% /home/yang

即使是使用了这种方法,把文件系统的data mode设置为journal,也一样会损坏文件。

总结:我们在linux开发程序时,如果关机重启不想文件丢失,需要我们自己在程序中先退出去,而不能让系统强制杀掉我们的程序。系统强制杀掉程序,就是采用类似于windows任务管理器的方式,有可能会出现数据还没保存,或者保存到一半的情况就掉电了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值