Как корректно завершить работу в Linux и предотвратить повреждение в SDCARD - PullRequest
0 голосов
/ 11 июня 2019

Я работаю над встроенной системой Linux, которая монтирует SDCARD (отформатированную в FAT32) и непрерывно записывает около 500 КБ данных в секунду.

Теперь для обработки сбоев питания мы разработали батарею, которая дает резервную копиюоколо 3 секунд.

Это позволяет нам завершить корректное завершение работы.

У нас есть только один процесс записи данных на SDCARD. Так что никакой другой процесс не получит доступ к SDCARD в любом случае.

Во время сбоя питания и в процессе выключения Мы используем fflush и fsync, а затем, наконец, fclose текущего файла, в который записываются данные.

Мы даже проверили с помощью осциллографа, проверяя аппаратные линии, что транзакция данных становитсяактивен с SDCARD, когда мы вызываем fflush и fsync во время процесса выключения.то есть данные кеша пытаются быть записаны в SDCARD в течение этого времени.Это заставляет меня поверить, что fflush и fsync реализованы правильно.

Единственное, что я не сделал, так это размонтировал SDCARD, так как это занимает больше времени.

Но все же примерно за 10 попыток мы можем увидетьКорневой раздел SDCARD поврежден, а файлы отсутствуют.

Размонтирование необходимо для правильного корректного завершения работы.Что я понимаю, так это то, что mount только создает ссылку на inode корня этой файловой системы с остальной частью файловой системы.и umount удаляет только ссылку.

Каков идеальный способ или шаги для обеспечения защиты SDCARD при завершении работы во встроенном Linux.

Ниже приведен код, который выполняется во время процесса выключенияВ настоящее время.необходим размонтированный звонок.

    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;

1 Ответ

0 голосов
/ 11 июня 2019

Вы делаете почти правильно, однако есть одна загвоздка: вашему SD-устройству может потребоваться дополнительное время для очистки собственных внутренних буферов.

Необходимое время зависит от конкретного набора микросхем (и, конечно, марки, модели и т. Д.).

Чтобы правильно завершить работу системы, вам необходимо иметь резервный аккумулятор, который позволяет вам быть в безопасности: учтите, что резервные аккумуляторы на корпоративных RAID-картах могут находиться в диапазоне от 2 до 5 минут, а производитель точно знает все детали оборудования.

К сожалению, после fsync() вам придется ждать больше времени. В подобных обстоятельствах наши устройства RasperryPi защищены от повреждения благодаря резервной батарее, которая позволяет устройству работать в течение не менее 20 секунд (хотя в нашем случае 10-15 является безопасным), просто играя легко.

...