1. Flash-хранилище
Зависит ли это от типа диска (традиционные жесткие диски или твердотельные диски) или от какой-либо другой переменной, о которой я не знаю? Это происходит (если это происходит) только в Linux или присутствует в других ОС?
Когда у вас есть выбор, вы не должны позволять флэш-хранилищам терять энергию без чистого выключения.
В недорогом хранилище, таком как SD-карты, вы можете ожидать потери целых блоков стирания (в несколько раз превышающих 4 КБ), потери данных, которые могут принадлежать разным файлам или основным структурам файловой системы.
Некоторые дорогие твердотельные накопители могут утверждать, что предлагают лучшие гарантии в случае сбоя питания. Однако стороннее тестирование показывает, что многие дорогие твердотельные накопители этого не делают. Слой, который перераспределяет блоки для «выравнивания износа», является сложным и запатентованным. Возможные сбои включают в себя потерю всех данных на диске.
Применяя нашу среду тестирования, мы тестируем 17 стандартных SSD от шести разных поставщиков, используя в общей сложности более трех тысяч циклов ввода ошибок. Наши экспериментальные результаты показывают, что 14 из 17 протестированных SSD-устройств демонстрируют неожиданное поведение при сбоях при сбоях питания, в том числе повреждение битов, урезанные записи, несериализуемые записи, повреждение метаданных и полный отказ устройства.
2017: https://dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013: https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme=enabled
2. Вращающиеся жесткие диски
Вращающиеся жесткие диски имеют разные характеристики. В целях безопасности и простоты я рекомендую предположить, что они имеют ту же практическую неопределенность, что и хранилище на основе флэш-памяти.
Если у вас нет конкретных доказательств, которых у вас явно нет. У меня нет сравнительных данных по вращению жестких дисков.
Жесткий диск может оставить один не полностью записанный сектор с неверной контрольной суммой, что впоследствии даст нам хороший сбой при чтении. Вообще говоря, этот режим отказа жестких дисков вполне ожидаем; родные файловые системы Linux разработаны с учетом этого. Они стремятся сохранить договор fsync()
перед лицом этого типа потери питания. (Мы бы очень хотели, чтобы это было гарантировано на SSD).
Однако я не уверен, что файловые системы Linux достигают этого во всех случаях, или это вообще возможно.
Следующая загрузка после этого типа ошибки может потребовать восстановления файловой системы. Так как это Linux, возможно, что при восстановлении файловой системы будут заданы некоторые вопросы, которые вы не понимаете, где вы можете только нажать Y и надеяться, что она уладится.
2.1 Если вы не знаете, что такое контракт fsync ()
Контракт fsync () является источником как хороших, так и плохих новостей. Сначала вы должны понять хорошие новости.
Хорошие новости: fsync()
хорошо документирован как правильный способ записи данных файла, например, когда вы нажимаете «сохранить». И широко известно, что, например, текстовые редакторы должны заменять существующие файлы атомарно, используя rename()
. Это делается для того, чтобы вы всегда сохраняли старый файл или получали новый файл (который был fsync()
отредактирован до переименования). Вы не хотите, чтобы вас оставили наполовину написанную версию нового файла.
Плохая новость: в течение многих лет вызов fsync () для самой популярной файловой системы Linux может эффективно привести к зависанию всей системы на десятки секунд. Поскольку приложения ничего не могут с этим поделать, было очень распространено оптимистично использовать rename () без функции fsync (), которая в этой файловой системе оказалась относительно надежной.
Следовательно, существуют приложения, которые неправильно используют fsync ().
Следующая версия этой файловой системы обычно избегала зависания fsync () - в то же время, когда она начала полагаться на правильное использование fsync ().
Это все довольно плохо. Понимание этой истории, вероятно, не помогло пренебрежительным тоном и оскорблением, которое использовалось многими конфликтующими разработчиками ядра.
Текущее разрешение заключается в том, что текущая самая популярная файловая система Linux по умолчанию поддерживается шаблон rename () без использования fsync ()реализует совместимость «ошибка за ошибкой» с предыдущей версией. Это можно отключить с помощью опции монтирования noauto_da_alloc
.
Это не полная защита. По сути, он сбрасывает ожидающий IO во время rename (), но не ожидает завершения ввода-вывода перед переименованием. Это намного лучше, чем, например, 60-секундное окно опасности! См. Также ответ на вопрос: Какие файловые системы требуют fsync () для обеспечения безопасности при сбое при замене существующего файла на rename ()?
Некоторые менее популярные файловые системы не обеспечивают защиту. XFS отказывается это сделать. И UBIFS также не реализовал это, по-видимому, это можно было бы принять, но для этого нужно много работать. На той же странице указывается, что у UBIFS есть несколько других проблем с «TODO» для обеспечения целостности данных, в том числе при потере питания. UBIFS - это файловая система, используемая непосредственно во флэш-памяти. Я полагаю, что некоторые трудности, о которых упоминает UBIFS с флеш-памятью, могут быть связаны с ошибками SSD.