Это страшная тема, с несколькими возможностями для расследования ... Я собираюсь охватить два больших.
Посмотрите этот доклад из ELC 2015: Особенности файловой системы для встроенных устройств.
Файловая система
Файловая система должна тщательно обрабатывать записи на диск. Проблема может возникнуть, если, например, длина файла увеличивается первой, а данные записываются вторыми. Это проблема, которая может легко возникнуть, и я только сегодня просматривал файл журнала, в котором обнаружена эта проблема - система неожиданно потеряла питание:
00017ea0 6f 74 29 20 43 4d 44 20 28 20 20 20 63 64 20 2f |ot) CMD ( cd /|
00017eb0 20 26 26 20 72 75 6e 2d 70 61 72 74 73 20 2d 2d | && run-parts --|
00017ec0 72 65 70 6f 72 74 20 2f 65 74 63 2f 63 72 6f 6e |report /etc/cron|
00017ed0 2e 68 6f 75 72 6c 79 29 0a 00 00 00 00 00 00 00 |.hourly)........|
00017ee0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017ef0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017f90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fa0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fb0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fc0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017fe0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017ff0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00018000 4d 61 72 20 31 30 20 31 35 3a 31 38 3a 33 34 20 |Mar 10 15:18:34 |
00018010 72 6f 6c 6c 79 20 72 73 79 73 6c 6f 67 64 3a 20 |rolly rsyslogd: |
00018020 5b 6f 72 69 67 69 6e 20 73 6f 66 74 77 61 72 65 |[origin software|
Так что да ... файловая система должна быть в состоянии обрабатывать такие события. Существуют коммерческие предложения для файловых систем, которые обеспечивают устойчивость к потере мощности, но я не рекомендую такую.
Конечно, использование файловой системы только для чтения в максимально возможной степени является большим преимуществом - например, наличие ОС в файловой системе только для чтения и конфигурация (и т.д.) В файловой системе для чтения и записи. Это может потенциально помочь вам восстановиться после повреждения и возобновить обслуживание.
Кроме того, журналируемые файловые системы обычно лучше обрабатывают такие события, но не предполагают какого-либо уровня гарантии ... Мой файл журнала выше был в файловой системе ext4
с журналированием.
Средство хранения
Вы упоминаете SD-карты в качестве основного хранилища ... что касается. На самом деле все флэш-накопители имеют проблемы с неожиданным отключением питания. Это связано с тем, как они работают - выравнивание износа полностью выполняется контроллером хранилища, и поэтому он может решить перемещать страницы в любое время.
Кроме того, запись на страницу часто состоит из целого набора операций, и нет никакой гарантии / стандарта, определяющего, в каком порядке они происходят.
- Проверить на стертую / новую страницу - при необходимости стереть
- Читать данные со старой страницы
- Примените изменения согласно
write()
- Написать новую страницу
- Пересвязать логическое с физическим отображением
Существует много историй о том, как люди отключали системы или устройства хранения данных и находили, что « мой 128 ГБ SSD отображается как 1 ГБ » или « моя SD-карта больше не работает » и т. Д ...
Цитата из JEDEC 84-A441: (по общему признанию, ссылающаяся на eMMC, но, вероятно, относящаяся к делу)
Сброс карты (с использованием CMD0, CMD15 или аппаратный сброс для e • MMC) или сбой питания приведет к прекращению любой ожидающей или активной операции программирования. Это может оставить некоторые или все данные, адресованные операцией, в неизвестном состоянии, если не была включена надежная запись. Ответственность за предотвращение этого лежит на хозяине.
Резюме
К сожалению, на самом деле нет хороших / надежных шагов, которые можно предпринять, чтобы упростить « извлечение смонтированной SD-карты без прохождения процесса размонтирования программного обеспечения / ОС » и не столкнуться с проблемами.
Мораль истории - найдите способ sync
и unmount
его правильно, чтобы гарантировать, что данные файловой системы являются непрерывными, и что write()
не выполняются, когда пользователь отключает их.