Регистрация данных типа черного ящика - PullRequest
3 голосов
/ 05 октября 2008

Во встроенном приложении для Linux, которое я разрабатываю, необходимо записывать некоторые события, которые происходят время от времени. Эти записи сохраняются на флэш-устройстве MTD, и после их записи нет необходимости изменять их или выполнять эффективный поиск, но требуется доступ для чтения, чтобы показать данные пользователю. Большая проблема в том, что питание может отключиться в любое время без надлежащей последовательности выключения. Частота этих событий может быть очень медленной (дни / недели), но несколько из них будут происходить одновременно. Данные, сохраняемые для каждого события, строго типизированы: дата, время, пара коротких текстовых строк и несколько целых чисел.

В настоящее время я унаследовал решение, основанное на jffs2 и SQLite, которое далеко от оптимального, поскольку иногда файл БД поврежден. Когда это происходит, весь файл становится нечитаемым, и невозможно понять, была ли это вызвана ошибкой в ​​jffs2, или в SQLite, или был ли неисправен сектор флэш-памяти, или было отключено питание в неподходящее время.

Существует ли библиотека или комбинация файловой системы / библиотеки, которая может помочь мне решить эту проблему? Или я должен просто использовать текстовый файл в CSV-подобном формате?

Ответы [ 5 ]

3 голосов
/ 05 октября 2008

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

Если вам не нужен поиск в системе, CSV работает отлично.

1 голос
/ 13 октября 2008

Мы используем простой старый syslogd для раздела YAFFS2 на флэш-памяти NAND, похоже, он работает хорошо: когда сообщения отправляются в регистратор и питание отключается сразу после (<100 мс) сообщения, а журнал никогда не отображается коррумпированы. </p>

Это основано на наблюдении, а не на том, что я четко знаю, что все всегда будет соответствовать замыслу, разум.

1 голос
/ 05 октября 2008

Существует целый ряд встроенных файловых систем (не совместимых с жирными дисками), разработанных именно для этой цели. Я не могу предложить, так как никогда не использовал один, но здесь что-то из Google. Я уверен, что вы можете копать больше, и, надеюсь, кто-то здесь может предоставить больше информации, может быть, есть что-то на основе GPL. Сравнение разных файловых систем здесь

0 голосов
/ 10 ноября 2008

Какие услуги доступны для вас? Лучшим вариантом часто является регистрация на внешнем ресурсе, , например, через системный журнал, SNMP, необработанный сокет или последовательный порт. Это защитит ваши логи от неприятностей на самом устройстве.

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

0 голосов
/ 06 октября 2008

Два CSV / текстовые файлы. Начните новую пару каждый раз, когда система перезагружается. Записать каждое событие в первый файл, очистить файл для сохранения, записать запись во второй файл, а затем очистить снова.

Таким образом, если вы потерпите крах во время первой записи, все данные во второй копии (вплоть до этой записи) все еще будут там.

Убедитесь, что очистка является полной очисткой файловой системы, а не только очисткой буфера Clib.

Возможно, также разместите файлы в отдельных файловых системах. Резервирование места впереди того, что вам нужно, также может помочь ускорить процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...