Безопасно используйте SD-карты, когда питание может отключиться в любое время

10

Мы работаем над небольшой встроенной системой 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 КБ).

Darron
источник
1
«надеюсь, SD-карты не такие глупые…» <--- ROFLOL. Скорее всего, не!
Дероберт
Пока вы не найдете полного решения вашей проблемы, используйте syncкоманду после каждой записи на SD-карту, она будет записывать биты сразу после того, как вы изменили / создали их, не сохраняя их в ОЗУ, так что ваши изменения как минимум будут на карте и не пропал бы из-за потери мощности.
Ханан Н.
syncвероятно, усугубит ситуацию, поскольку это увеличивает долю времени, в течение которого метаданные обновляются в середине.
Бен Фойгт

Ответы:

5

Ну, способ, которым вы можете это исправить, - это устранить проблему «питание может быть отключено в любое время». Нельзя ли добавить хотя бы минуту заряда батареи?

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

Ваша основная проблема - выравнивание износа на SD-картах, что зависит от AFAIK от производителя карты (и, возможно, даже от партии, они могут изменить ее в любое время). Вероятно, он не справляется с отключением питания правильно. И в зависимости от того, что он делает, это может означать не только повреждение блока, в который вы пишете.

  1. Предположим, тривиально маленькая карта - 3 (флэш) блока. Блок 1 получил больше записей, чем 2 или 3. Я буду называть физические блоки по номеру, а логические блоки A, B, C - по буквам. Прямо сейчас, A = 1, B = 2, C = 3.
  2. Вы выдаете запись в блок A. SD-карта как ага! здесь нужно выравнивание износа, иначе блок 1 будет изнашиваться до 2 и 3. Он решает поменять блок 1 и 2.
  3. Он считывает блок 1 в позицию ОЗУ i (на SD-карте, а не в ОЗУ системы). Он обновляет часть, которую вы хотели изменить.
  4. Он читает блок 2 в позицию ОЗУ ii
  5. Стирает блок 1
  6. Он записывает позицию ОЗУ ii в блок 1.
  7. Это обновляет таблицу сопоставления, чтобы сказать B = 1
  8. Стирает блок 2.
  9. Он записывает позицию RAM i в блок 2.
  10. Это обновляет таблицу сопоставления, чтобы сказать A = 2

Конечно, «обновление таблицы сопоставления» не всегда тривиально. И порядок 5–10 может быть другим (если они все завершены, это не имеет значения, ну, конечно, стирание должно наступить до записи). Но происходит сбой питания, вы можете получить не только поврежденный A (как вы ожидаете), но и B. Или, если сбой питания происходит во время обновления сопоставления, кто знает, какой тип повреждения это вызовет.

derobert
источник
1
Эти устройства должны жить в относительно суровых условиях в течение многих лет, и после их установки они будут отправлены в различные страны, для которых нам не нужно было бы готовить батареи. Мы, вероятно, бросили бы MMC / SD и создали бы наше собственное решение NAND-flash перед использованием батареи.
Даррон
Что ж, в нашем случае решение «починить« электричество можно отключить в любое время »» сводится к тому, чтобы «не дать водителям грузовика заснуть за рулем и врезаться в наши устройства». «Грузовик врезался в него» на самом деле о наиболее распространенном способе отказа.
SF.
1
Минута заряда батареи не требуется. Количество энергии, необходимое для безопасного отключения SD-карты, должно находиться в пределах диапазона, который может хранить конденсатор.
Бен Фойгт
4

Нечто подобное обсуждалось на сайте electronics.stackexchange.com: как защитить SD-карту от неожиданных сбоев питания?

Побочный ответ, который работает в тандеме с программными решениями, заключается в том, чтобы взглянуть на аппаратное обеспечение (об этом тоже был вопрос по ESE, но я не могу его найти сейчас; речь шла не только о SD-картах, просто об устройствах, теряющих энергию и как это обнаружить и действовать на это).

Коротко говоря: у вас может не быть заряда батареи, но у вашего блока питания есть довольно большие конденсаторы для сглаживания питания. По сути, власть не просто гаснет. Напряжение снижается. Вероятно, имеется встроенная защитная микросхема / схема, которая подает сигнал RESET на встроенную систему, когда напряжение падает ниже определенной точки. Материнские платы для ПК тоже есть, и они реагируют на сигнал «POWEROK» от блока питания. Это означает, что при отключении питания компьютер будет принудительно остановлен за несколько миллисекунд до того, как напряжение упадет ниже безопасного уровня. В течение этого времени периферийные устройства, такие как SD-карты, все еще включены, но с компьютера больше не происходит транзакций.

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

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

Во всяком случае, вполне может быть, что у вас не будет такой большой проблемы. Предполагая, что блок на вашей карте может пережить 100 операций записи (консервативно - но постарайтесь получить карты хорошего качества!), И используя карты 8 ГБ, вы будете записывать 800 ГБ к моменту окончания первого блока (статистически, конечно).

Алексиос
источник
Вопрос был начат, потому что я уже получал огромное повреждение SD-карты при отключении питания. Довольно часто, на самом деле. Возможно, 1 из 20 сбоев питания был катастрофическим, а, возможно, 1 из 4 нанес хотя бы НЕКОТОРЫЕ повреждения. В конце концов я перешел на хранение данных за день на внутренней флэш-памяти NAND и копирование на SD в полночь (примерно 1 секунда). Я надеюсь улучшить положение вещей в будущем. У меня уже есть колпачки на 400 мкФ на рейке ... не достаточно, по-видимому ... возможно, с отключением происходит неправильно.
Даррон
Это довольно высокий уровень заболеваемости! Пришло время достать осциллографы и увидеть это в действии. Хотя, скорее всего, вы можете обойти это в программном обеспечении, лучший способ с точки зрения энергопотребления - убедиться, что у вас нет аппаратных сбоев. Может быть, вы могли бы хеджировать свои ставки и спросить на electronics.stackexchange.com ?
Алексиос
@darron, какое решение вы решили в связи с проблемой хранения на SD-карте? Вы все еще пишете в NANDFlash и копируете один раз в день? У меня есть дизайн с SD-картой в качестве основной RFS (без отдельной NANDFlash), и я вижу проблемы с повреждением данных, как с внезапными сбоями питания, так и без них.
Фред Бассет
4

У нас была проблема с нашей SD, корневая файловая система ext2 была повреждена при непредвиденных сбоях питания. Прежде всего, мы заставляем систему работать с правами монтирования только для чтения. Поскольку нам требовалось некоторое доступное для записи хранилище (но мы не записывали данные), мы создали второй раздел как доступный для записи. Чтобы минимизировать повреждение FS при неожиданном сбое питания, мы сделали это разделом ext3, даже если это вызовет как минимум вдвое больше физических записей на карту. Эта комбинация (но я признаю, что наши записи второго раздела встречаются редко по сравнению с регистратором данных), кажется, работает без проблем. Так далеко. (Системы установлены около 30 месяцев на профессиональных объектах)

Дэйв Китчен
источник
3

Для защиты данных в среде с возможностью отключения электроэнергии и общей безопасности данных вы должны набрать еще больше баллов.

НЕ ИСПОЛЬЗУЙТЕ ячейки MLC для хранения, только время хранения данных SLC достаточно. Тогда эти карты SLC могут иметь интеллектуальную прошивку, некоторые из которых не могут быть повреждены из-за потери питания. Они распознают отключение питания, измеряя и гарантируя, что последний блок записан полностью.

Эти карты дороже и немного медленнее, чем ячейки MLC. Смотрите продавцов, как swissbit для карт.

Rotesmofa
источник