Потеря силы при записи в файл

Я работаю над проектом для устройства, которое должно постоянно записывать информацию на устройство хранения. Устройство должно быть в состоянии терять энергию, но точно сохранять информацию, которую оно собирает, до момента потери питания.

Я искал ответы на вопрос, что произойдет, если в такой системе будет потеряно питание. Есть ли проблемы с потерей питания и не закрытием файла? Возможно ли повреждение данных?

Спасибо

0

Решение

Весь вопрос «безопасного хранения данных при отключении питания» довольно сложно решить в общем виде — точное решение будет зависеть от точного типа данных, скорости передачи данных и т. Д.

Чтобы сохранить информацию «при выключенном питании», данные должны храниться в энергонезависимой памяти (флэш-памяти, EEPROM или ОЗУ с резервным питанием от батареи). Опять же, это аппаратное решение.

Если вы можете «потерять данные, записанные в файл»? Да, вполне возможно, что файл может быть записан неправильно, если питание устройства хранения файлов потеряно, когда система находится в процессе записи.

Ответ на этот вопрос действительно зависит от того, сколько свободы у вас есть для сборки / настройки оборудования, чтобы справиться с этой ситуацией. Системы, рассчитанные на высокую надежность, будут иметь возможность обнаруживать сбои питания и продолжать работать в течение нескольких секунд (иногда намного больше) после отключения питания, а когда происходит отключение питания, оно переходит к «сохранить все данные, и красиво выключить «режим. Как правило, это выполняется с помощью источника бесперебойного питания (ИБП), который имеет механизм сигнализации, который сигнализирует об отсутствии внешнего питания, и когда система получает этот сигнал, запускает аварийное отключение.

Если у вас нет способа подключить ИБП и отключить его упорядоченным образом, то есть другие функции, такие как ведение журнала файловой системы, которая может предоставить вам хороший набор данных, но не гарантируется, что вы получите полные данные (и вам нужно обрабатывать формат файла так, чтобы «обрезанные данные» не полностью разрушали файл — классический пример — это zip-файл, в котором «каталог» (список содержимого) хранится в самом конце файла. вы можете заполнить 99,9% файла, но недостающие 0,1% — это то, что вам нужно для декодирования всего содержимого.

3

Другие решения

Да, повреждение данных определенно возможно.

Однако есть несколько рекомендаций, чтобы свести его к минимуму программным способом:

  • Используйте журналирующую файловую систему и переведите ее в режим максимального журналирования (например, для ext3/ext4 использование data=journal, Не меньше).
  • Избегайте программных буферов. Если у вас нет выбора, сбросьте их как можно скорее.
  • Синхронизировать файловую систему как можно скорее (либо через sync/syncfs/fsync системные вызовы или использование sync вариант крепления).
  • Никогда не перезаписывайте существующие данные, просто добавляйте новые данные в существующие файлы.
  • Будьте готовы иметь дело с неполными записями данных.

Таким образом, даже если вы потеряете данные, будут записаны только последние несколько байтов, и файловая система в целом не будет повреждена.

Вы заметите, что я принял Unix-у ОС. Насколько я знаю, Windows не дает достаточного контроля, чтобы навязывать такие ограничения файловой системе.

0