Я работаю над Raspberry Pi 3b+, хочу запустить Raspberry в промышленное производство (не судите меня, это мой заказчик).

Я использую SD-карту, которая содержит два раздела (/boot и /).

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

Для решения этой проблемы моя SD-карта доступна только для чтения.

Мой вопрос

Я знаю, как защитить свою SD-карту (...надеюсь) от сбоев питания.

Но я не понимаю, почему SD-карта повреждается после сбоев питания.

Можете ли вы объяснить мне причины, пожалуйста?

0
Julien 22 Апр 2021 в 14:43

2 ответа

Лучший ответ

Некоторые примечания, о которых следует знать:

Защита SD-карты от записи может привести к тому, что вся система просто не запустится. Некоторые файлы являются временными/динамическими, и их необходимо записывать во время работы ОС (или программ в ОС). Конечно, есть решения, такие как создание фальшивого диска в ОЗУ для хранения этих временных файлов (это временные файлы, и нет проблем, если сбой питания привел к исчезновению ОЗУ). Современные ядра Linux уже делают это или подобное; Каталоги /run и /sys создаются в оперативной памяти и фактически не записываются на какой-либо физический диск. Другие, такие как некоторые файлы/каталоги в /dev, создаются по мере необходимости.

Что касается того, как и почему происходит повреждение. Поймите, что чтение/запись на SD-карту происходит очень медленно по сравнению со скоростью ЦП и ОЗУ. Когда ЦП выполняет миллиарды инструкций в секунду, а ОЗУ аналогичным образом обращается к ячейкам памяти, все в порядке. Но что происходит, когда вам нужно читать или писать с/на SD-карту? Он может читать/записывать только несколько тысяч ячеек памяти в секунду.

Вы не хотите, чтобы ОС просто останавливала все, чтобы дождаться завершения чтения/записи. Представьте, что вы загрузили веб-страницу, загрузка которой заняла целую минуту. Но пока он загружался, вам приходилось ждать, пока он будет сделан! Вы не могли выпить свой кофе, вы не могли переключиться на другую веб-страницу, вы даже не могли сказать ей, чтобы она перестала загружаться, потому что вы нетерпеливы.

Итак, что делает ОС, так это кэширует определенные данные в ОЗУ, поэтому ей не нужно постоянно ждать, чтобы снова прочитать их с SD. Он делает это и при записи на SD-карту: вместо фактической записи на SD-карту он сохраняет данные в ОЗУ и планирует их фактическую запись на SD в более позднее время, когда ЦП/ОС не так загружены. , и возвращается к другим делам, например к выполнению ваших пожеланий.

Повреждение происходит, когда эти данные находятся только в ОЗУ, но происходит сбой питания. Нет возможности поддерживать оперативную память в свежем виде, поэтому она не может записывать кэшированные данные на SD-карту. Его больше нет. Итак, данные на SD-карте устарели — у меня нет данных, которые были в ОЗУ. Иногда вам везет, и это не беда; потерянные данные тривиальны и могут быть созданы снова. В других случаях потерянные данные являются критически важными и приводят к повреждению.

Даже небольшое изменение может вызвать большую проблему. Если файл стал больше только на один байт, ОС должна обновить данные диска: как один байт, добавленный к файлу, так и данные на диске, которые сообщают ОС, насколько велик файл. Я должен обновить это, чтобы узнать, что файл теперь на 1 байт больше. Однако опять же, эта информация кэшируется в ОЗУ и позже планируется записать на SD-карту.

Если сбой питания произойдет сейчас, прежде чем он запишет новый размер, SD-карта будет «думать», что файл все еще имеет старый размер. Это новое до свидания полностью потеряно - коррупция.

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

ЭМИ (электромагнитный импульс) аналогичен — он вызывает короткое замыкание и перегорание электрических устройств. Таким образом, ваша SD-карта все еще может быть уничтожена, если она подверглась достаточно сильному ЭМИ. И так далее.

2
C. M. 22 Апр 2021 в 16:39
Вау, спасибо за эту очень четкую информацию! теперь понял\о/
 – 
Julien
22 Апр 2021 в 17:18

Это не ограничивается SD-картами.

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

1
berndbausch 22 Апр 2021 в 15:02
Тем не менее, каждый, кто занимается написанием операционных систем и/или проектированием оборудования, знает об этой потенциальной проблеме, и были предприняты различные довольно умные меры для минимизации — хотя и не устранения, потому что это невозможно — риска.
 – 
Shadur
22 Апр 2021 в 15:45