linux - 如何在 Linux 中正常关机并防止 SDCARD 损坏

标签 linux embedded-linux fat32

我在嵌入式 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/

相关文章:

linux - lua 5.1.4的开发包是什么?

c - request_irq中的dev_id参数是什么?

linux - 在 Linux 中将预定义变量从 shell 脚本传递到 shell 脚本

c++ - 您在软件中写入日志以处理可能的大量日志消息的策略是什么?

Android:如何将 bash 设置为默认 root shell?

c - AVR FAT 驱动程序设计

linux - do_package : split_and_strip_files (arm-poky-linux-gnueabi-objcopy) fails 时出现问题

linux - 需要共享 (.so) 库之间的循环依赖

windows - Windows 7 格式化驱动器上的 FAT32 文件分配表大小超出 FAT32 规范