Безопасная запись на компактную флэш-память на встроенном Linux

Я разрабатываю встроенную систему Linux, которая работает с компактной флэш-памяти и tmpfs. Флэш-память монтируется только для чтения и обычно должна оставаться такой, но иногда мне нужно что-то записать во флэш-память.

Какие меры предосторожности следует соблюдать при записи во флэш-память (через интерфейс PATA)? По причинам, которые я не могу вспомнить, я использую файловую систему ext4, смонтированную с помощью barrier=1,data=ordered,nodelalloc,noatime,ro. Это ужасная идея? Система должна загружаться быстро с нулевым вмешательством. Я испытываю искушение сделать tune2fs -c 0 -i 0. Это еще худшая идея?

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

Как это лучше координировать? flock выглядит многообещающе; это лучший способ пойти и о чем мне нужно беспокоиться? Я не хочу, чтобы устаревшая блокировка блокировала запись или оставляла файловую систему доступной для записи на неопределенный срок.

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


person eater    schedule 23.01.2011    source источник


Ответы (4)


Делаем ext4 безопасным

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

Несмотря на то, что они предназначены для необработанных устройств NAND, файловая система журналирования, такая как jffs2 или yaffs, все же может быть полезной. У них есть полезная характеристика, состоящая в том, что их формат на диске больше похож на список, чем на дерево, поэтому новые данные, как правило, упаковываются более плотно и, таким образом, с меньшей вероятностью испортят относительно статические части файловой системы.

Я не могу комментировать, как сделать ext4 «безопасным» при таких обстоятельствах; ни структура файловой системы, ни fsck не знают об общих режимах отказа флэш-устройств (в частности, о том, что во время любой записи есть длительный период, когда весь блок данных недействителен). Такое поведение, конечно, специфично для контроллера на CF-карта, так что в любом случае это не очень предсказуемо.

Самый безопасный и предсказуемый способ, который я могу придумать, — это тот же макет данных с флип-буфером, который используется во встроенных устройствах меньшего размера. То есть у вас есть две области записи (два раздела). В любой момент времени хотя бы одна из них должна быть согласованной. Когда вы хотите написать, выберите старшую из двух. Если вы включите питание и обнаружите несоответствие в буфере A, скопируйте содержимое буфера B (и не разрешайте запись в B в это время).

Управление монтированием/перемонтированием

Я бы написал демона, который управляет размонтированием/перемонтированием от имени всех процессов в системе. Это имеет ряд преимуществ:

  • вы отделяете логику umount/remount и должны реализовать ее только один раз
  • процессы, которые хотят писать, не нуждаются в привилегиях root
  • вы можете встроить своего рода сторожевой таймер, чтобы гарантировать, что раздел не останется RW слишком долго. Если это так, вы можете убить процесс-нарушитель (возможно, откат) и перемонтировать-RO.
  • вы можете измерить, как долго вы смонтировали RW, что дает вам некоторое представление о риске, связанном с каждым обновлением.
person Ian Howson    schedule 02.02.2011
comment
Отличные очки. Кажется, что из-за абстракции контроллера CF файловая система практически не может гарантировать атомарные операции, не так ли? Подход с флип-буфером звучит как путь. Управление перемонтированием через демона также является хорошей идеей. В моем случае уже есть один демон, который выполняет большую часть операций записи, поэтому его управление перемонтированием является естественным расширением. Спасибо! - person eater; 07.02.2011
comment
Да, я думаю, вы правы в проблеме абстракции контроллера CF. Вы можете гарантировать атомарность с одним контроллером, но нет гарантии, что другой будет вести себя так же. - person Ian Howson; 08.02.2011
comment
ни структура файловой системы, ни fsck не знают об общих режимах отказа флэш-устройств (в частности, о том, что во время любой записи есть длительный период, когда весь блок данных недействителен). --- Если вы говорите о командном режиме и режиме чтения флэш-памяти, это не имеет значения, поскольку он удален из поля зрения аппаратных слоев над контроллером флэш-памяти. - person cmcginty; 10.02.2011
comment
@Casey: нет. Я говорю о физическом процессе записи во флэш-память, а не о логических интерфейсах к нему. Вы можете записать только один байт данных, но наивный контроллер все равно будет читать блок, изменять его в памяти, стирать блок и перезаписывать его. - person Ian Howson; 11.02.2011

Я сделал встроенную систему, работающую с CF-карты на 4 ГБ. Я установил его с 3 разделами:

  • /ботинок; доб2; ~128 МБ
  • корень; кабачки; 500 МБ (поскольку он недоступен для записи, нет возможности случайно перевести его в режим записи.)
  • /данные; доб2; ~3,5 ГБ любых данных, которые я хочу сохранить

Я использую ext2, потому что я считаю, что любая из журналируемых FS на самом деле вызовет изменение большего количества блоков для каждой записи. Также нет смысла запускать файловую систему флэш-памяти на CF-карте, поскольку система не имеет прямого доступа к блокам флэш-памяти. Карта CF содержит внутреннюю логику отображения блоков.

person cmcginty    schedule 24.01.2011
comment
В моем случае записи происходят настолько редко, что меня меньше беспокоит износ флэш-памяти и больше заботит согласованность файловой системы. - person eater; 02.02.2011

Поскольку вы используете CF, выравнивание износа, скорее всего, встроено, и поэтому вы не получите никакой пользы от использования файловой системы, такой как yaffs2, jffs2 и т. д., в которые встроено выравнивание износа. Фактически, большинство файловых систем выравнивания износа не рекомендуются. для карт CF со встроенным выравниванием износа. Однако вам нужна файловая система со встроенным журналированием, чтобы вы могли безопасно выполнять циклы включения-выключения без повреждения системы. Есть два варианта: выбрать файловую систему с ведением журнала или выбрать базу данных (при условии, что записи ориентированы на базу данных) с выравниванием износа, таким как sqlite. Что касается файловой системы, вы можете использовать ext3 или ext4, хотя лично я рекомендую ext3, поскольку ext4 все еще содержит ошибки, которые могут вызвать у вас головную боль. Я бы также порекомендовал, как и другим, иметь два раздела, один только для чтения с использованием файловой системы, такой как squashfs, cramfs, и другой для чтения и записи с использованием ext3.

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

person Pankaj    schedule 02.02.2011

Я бы сделал отдельный раздел, который монтируется rw.

person jschorr    schedule 23.01.2011
comment
У меня есть корневой раздел, раздел данных и альтернативный корневой раздел, который получает копию корневого раздела после успешного обновления программного обеспечения. Поскольку раздел данных обычно не записывается, я бы хотел, чтобы он был подключен только для чтения большую часть времени. Я слишком параноик? - person eater; 23.01.2011
comment
Я имею в виду, что у вас должен быть выделенный раздел данных только для этой потребности rw. - person jschorr; 24.01.2011
comment
У меня есть специальный раздел. Он просто записывается так редко (никогда в некоторых случаях использования), что я бы хотел, чтобы он был смонтирован только для чтения, если это возможно. Мой вопрос в том, как это сделать правильно. - person eater; 02.02.2011