Мы работаем над небольшой встроенной системой Linux (2.6.35), с небольшим внутренним устройством NAND для ОС и приложений (250-500Meg) и картой SD с картами SDHC SD 8 ГБ для данных.
Мощность устройства может быть отключена в любое время.
Система должна хранить данные на SD-картах. Эти данные очень важны ... это целое назначение системы. Системы обычно полностью отключены от любой сети в удаленных местах, и данные извлекаются через sneakernet каждые 4-8 недель.
В настоящее время у нас просто есть VFAT на SD-картах. Это было главным образом для того, чтобы первые тестовые клиенты могли легко скопировать данные вручную на свои ноутбуки с Win7.
Тем не менее, я теперь обеспокоен тем, что отключение питания в неподходящее время вызывает потерю данных.
Как лучше настроить такую систему, чтобы предотвратить потерю данных? JFFS2 звучит как то, что я хотел бы с точки зрения того, как он записывает данные (а потребности в производительности совсем не высоки), но звучит довольно глупо при использовании block2mtd и т. Д. Я также не уверен, как будет взаимодействовать выравнивание износа карты с этим.
Какой лучший способ сделать это?
РЕДАКТИРОВАТЬ
Сейчас я думаю о том, чтобы покидать файловую систему VFAT и выделять файлы дневного размера, заполненные 0xFF, что должно значительно ограничить подверженность сбоям цикла питания. Тогда я мог бы только добавлять записи в эти предварительно подготовленные блоки, и, надеюсь, SD-карты не настолько глупы, чтобы стереть / записать записи уровня в области 0xFF.
Я могу использовать noatime, но есть ли эквивалентное время VFAT для предотвращения записи в измененное поле времени? Мне нужен какой-то способ предотвратить любые обновления метаданных, пока не будет создан файл нового дня.
РЕДАКТИРОВАТЬ 2
Кто-то из обменников стеков электроники напомнил мне, что есть также данные ECC по NAND, поэтому нет способа предотвратить необходимость стирания.
Итак, подойдет ли JFFS2 через block2mtd в этой ситуации?
РЕДАКТИРОВАТЬ 3
Это хуже, чем я думал. У меня есть SD-карты, которые стирают блоки данных, даже если вы записываете одинаковое содержимое на диск. Eraseblocks - 64 КБ, и это слишком велико, чтобы полностью задерживать запись. Я буду хранить до 128 КБ данных во флэш-памяти NAND (которую я могу контролировать при записи) в виде журнала, а затем записывать блоки размером 128 КБ в файл размером 128 КБ в разделе VFAT на SD-карте (в в случае, если другие SD-карты имеют стираемые блоки 128 КБ).
sync
команду после каждой записи на SD-карту, она будет записывать биты сразу после того, как вы изменили / создали их, не сохраняя их в ОЗУ, так что ваши изменения как минимум будут на карте и не пропал бы из-за потери мощности.
sync
вероятно, усугубит ситуацию, поскольку это увеличивает долю времени, в течение которого метаданные обновляются в середине.