Может ли неожиданная потеря питания повредить установку Linux?

22

Я разрабатываю приложение на встроенной плате Linux (работает на Debian), например, Raspberry Pi, Beagle Board / Bone или olimex. Доски работают в условиях, когда электричество неожиданно отключается (размещение БП и т. Д. Намного сложнее), и это будет происходить каждый день пару раз. Интересно, могут ли неожиданные отключения питания вызвать сбой / проблему в операционной системе Linux? Если это то, что я должен волновать, что бы вы предложили, чтобы предотвратить повреждения ОС от неожиданного отключения электроэнергии?

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

Прорвать
источник
1
Держитесь подальше от ext2 (используйте ext3 или выше) в файловых системах, которые вы сильно модифицируете, и вы по большей части должны быть в порядке.
LawrenceC
Если вы не будете очень осторожны в определении своих карт SD, карты не гарантируют ничего, если вы неожиданно отключите питание. Карта может быть в процессе выравнивания износа, что может привести к странным неожиданным повреждениям, которые могут быть даже в другом разделе!
Дероберт
Я не знаю точно, как это сделать, но вы можете подумать о том, чтобы сделать ваши ключевые приложения основанными на транзакциях. Таким образом, вы можете иметь свой текущий файл и резервную копию. Вы применяете транзакции к своему текущему файлу, и если это не удается, вы можете восстановить текущий файл из резервной копии и повторно применить транзакции. Если вы переключаетесь между текущей и резервной копией, используя символические ссылки или меняя имена файлов, это может произойти очень быстро с гораздо меньшей вероятностью ошибки, чем при копировании. После успешного обновления ваш текущий файл становится вашей резервной копией, а резервная копия становится текущей.
Джо
Продолжение. Это почти работает. Новый текущий файл также потребует применения к нему транзакций, что потребует двойной обработки транзакций, поэтому я уверен, что есть лучший способ. В любом случае это может быть намного быстрее и безопаснее, чем копирование всего файла, если он большой.
Джо

Ответы:

14

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

Как пишет l0b0, использование файловой системы журналирования поможет, так как она сможет отслеживать, что на самом деле было сделано. В дополнение к информации в википедии , что l0b0 связаны, вы можете быть заинтересованы в /unix/12699/do-journaling-filesystems-guarantee-against-corruption-after-a-power-failure , а также ,

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

Дженни Д
источник
10
Общий процесс в коде для защиты от прерываний записи, повреждающих файл, состоит в том, что вместо непосредственного изменения file.name вместо этого вы пишете совершенно новый файл file.name.newversion, а затем используете команды удаления / переименования, чтобы заменить старую версию на новый. Вам нужно добавить код очистки для восстановления после прерывания на каждом этапе; но такой подход всегда оставляет хорошую копию файла на диске. Это может повлиять на ваш дизайн, поскольку он плохо обновляет отдельные огромные файлы или часто вносит изменения в один файл.
Дэн Нили
11

Чтобы свести к минимуму вероятность повреждения ОС, вероятно, лучше иметь отдельные разделы «системы» и «данных» на SD-карте. Таким образом, вы можете смонтировать «системный» раздел только для чтения и использовать высокоэластичную ФС в разделе «данных».

Кроме того, большинство из этих плат имеют очень низкое энергопотребление, поэтому возможна резервная батарея. Плата «LiPo rider» для Raspberry Pi может использоваться в качестве базового ИБП для обеспечения полного отключения при отключении питания.

Stu
источник
5

Это будет зависеть от

  1. используете ли вы файловую систему журналирования и
  2. насколько хорошо приложения могут обрабатывать прерванную обработку.

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

Может быть очень сложно сказать что-то определенное о гипотетической сложной системе, но наиболее стабильное программное обеспечение Linux, похоже, способно справляться со сбоями довольно хорошо.

l0b0
источник
1

Поскольку никто не упомянул какие-либо конкретные файловые системы: более современные файловые системы (ext3, ext4, ntfs) способны обрабатывать сбои намного лучше, чем старые файловые системы (ext2, ext, fat32) из-за журналирования .

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

BlueRaja - Дэнни Пфлугхофт
источник