我在嵌入式 Linux 系统上工作,它安装了一个 SDCARD(格式化为 FAT32)并且每秒连续写入大约 500KB 的数据。
现在为了处理电源故障,我们设计了一种电池,可以提供大约 3 秒的备用时间。
这使我们能够完成正常关机。
我们只有一个进程向 SDCARD 写入数据。因此无论如何其他进程都不会访问 SDCARD。
断电和关机过程中 我们使用 fflush 和 fsync,然后最后关闭写入数据的当前文件。
当我们在关机过程中调用 fflush 和 fsync 时,我们甚至通过探测硬件线路验证了数据交易与 SDCARD 激活。 即缓存数据正在尝试在这段时间内写入SDCARD。 这让我相信 fflush 和 fsync 的实现是正确的。
我唯一没有做的就是卸载 SDCARD,因为它需要更长的时间。
但仍然在大约 10 次尝试后,我们可以看到 SDCARD 根分区损坏并且文件丢失。
正常关机是否需要卸载。 我的理解是 mount 仅创建此文件系统根目录的 inode 与文件系统其余部分的链接。 并且 umount 仅删除链接。
在嵌入式 Linux 中关闭时确保保护 SDCARD 的完美方法或步骤是什么。
下面是当前关机过程中执行的代码。 是否需要 umount 调用。
if(fflush(file)<0)
printf("Failed fflush errno=%d",errno);
if(fsync(fileno(file))<0)
printf ("Failed fsync errno=%d",errno);
if(fclose(file)<0)
printf("Failed fclose errno=%d",errno);
file=NULL;
最佳答案
您几乎做对了,但是有一个问题:您的 SD 设备可能需要额外的时间来刷新它自己的内部缓冲区。
所需时间取决于精确的芯片组(当然还有品牌、型号等...)。
为了正确关闭系统,您需要有一 block 备用电池以确保安全:考虑到企业 RAID 卡上的备用电池的续航时间为 2 到 5 分钟,并且制造商确切地知道每个硬件细节。
不幸的是,在 fsync()
之后您必须等待更多时间。在类似情况下,我们的 RasperryPi 设备可以安全地使用备用电池防止损坏,备用电池允许设备运行至少 20 秒(尽管在我们的情况下 10-15 秒是安全的)只是为了轻松玩。
关于linux - 如何在 Linux 中正常关机并防止 SDCARD 损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56541592/