Я бег небольшого uClibc
и busybox
встроенная система , основанную на x86 - устройстве. Я использую initramfs, но я также монтирую пользовательский ext3
каталог на компактном флэш-устройстве в режиме IDE, который я использую для хранения постоянных данных регистрации измерений, созданных пользовательским приложением c ++. Я выбрал ext3
файловую систему, так как она рекомендуется для обеспечения безопасности от потери питания при использовании дисков CF в режиме IDE в нескольких книгах, которые я прочитал (« Сборка встраиваемых Linux-систем » Карима Ягмура и « Embedded Linux Primer » Кристофера Халлинана). Это особенно важно, и данные являются критическими.
Однако из-за некоторых комментариев в моем предыдущем вопросе Путаница с тем, как восстановить поврежденные файлы ext3, если во время записи файла происходит сбой питания, может показаться, что на самом деле эта файловая система не дает гарантии безопасности от повреждения данных из-за питания потеря. Так что я хотел бы знать, если
- На
ext3
самом деле лучший выбор для этой установки? - Потеря питания во время операции записи на диск только повреждает часть данных, которые я периодически добавляю в файл, или это может повредить весь файл?
- Являются ли данные, которые не записываются в момент потери питания, полностью безопасными? В частности, есть ли риск, что мой
initramfs.cpio
файл также может быть поврежден? - Есть ли какой-либо метод, который я могу использовать в своем коде приложения для защиты данных (например, создание дополнительного раздела и запись моих данных для зеркального отображения изображений, чтобы всегда было 2 копии) - скорость не является реальной проблемой для моего приложения, поэтому дорогостоящие операции копирования приемлемы
Я видел и читал ответы на этот связанный вопрос: гарантируют ли журнальные файловые системы защиту от повреждения после сбоя питания? , но это не совсем охватывает некоторые вещи, которые меня смущают.
Я понимаю, что задаю много вопросов, но кажется, что, несмотря на чтение большого количества материала, у меня была принципиальная неспособность понять риски для моих данных в случае потери питания.
источник
Мне кажется, что то, чего может достичь реализация файловой системы в случае внезапной потери питания, - в конце концов, она фактически взаимодействует с аппаратным обеспечением, так что происходит между временем, когда она отправляет данные / инструкции оборудованию, и когда получает ответ вне его контроля. Если бы существовала файловая система, которая могла бы обойти эту проблему, вы бы о ней слышали.
Из-за этого стратегия защиты критически важных данных больше всего выиграет от решений, принятых на аппаратном уровне, например, с использованием источника бесперебойного питания. Возможно, это не так возможно в вашей ситуации.
Вы сказали, что производительность не является большой проблемой, поэтому используйте ее разумно
fsync()
.Я лично использую файловые системы extN и на интернет-серверах с низким средним трафиком в течение многих лет, и, как и Алексиос, я не видел много повреждений из-за сбоя питания (хотя, честно говоря, на серверах есть ИБП, и я не могу вспомнить один из них на самом деле идет по этому пути). Гораздо более серьезной проблемой является повреждение из-за аппаратного сбоя, из-за которого различные файловые системы могут (опять-таки) быть в той или иной степени способными справиться с проблемой, но (опять-таки) это принципиально вне их контроля, и они не могут предотвратить ее.
Я иногда видел потерянные файлы или обрезанные до нулевого размера. Я полагаю, что есть большая вероятность, что их можно будет как-то восстановить; это не было необходимо для меня, поскольку они были поддержаны. В большинстве случаев, если что-то не так,
fsck
кажется, с этим справляются.Я думаю, что риск действительно очень низок только из-за сбоя питания, за исключением того, что вид повреждения флэш-памяти может быть вызван скачком напряжения, который может сопровождать сбой питания - с которым у меня нет опыта, но, надеюсь, вы подумали и исследовал это.
Стоит повторить пункт о fsync () . Объекты C ++ / iostream не имеют метода для этого (:: flush и :: sync не являются fsync), но все, что вам нужно, - это файловый дескриптор.
источник
sync
опция через/etc/fstab
файл, так как я понимаю, что это заставляет запись происходить синхронно. Я предполагаю, что это означает, что когда код записи моего файла возвращается, данные физически записываются на диск. Я понял, что монтирование с поsync
существу делает то же самое, что вызовfsync(my_filedescriptor)
после записи. Правильно ли мое понимание этого?fsync()
в те точки, которые вы считаете подходящими , в любом случае не повредит , и делает систему более устойчивой (например, если устройство случайно установлено без установки синхронизации и т. Д.).ZFS - определенно файловая система, защищенная от коррупции по замыслу и, возможно, единственная. Однако я не уверен в доступности реализаций ZFS (на основе fuse или native) для платформ на основе uClinux.
источник
Существует, по крайней мере, одна коммерческая файловая система, которая выполняет огромную работу, следя за тем, чтобы файловая система почти не могла быть повреждена из-за сбоев электропитания и что единственные данные, которые вы рискуете потерять, - это данные, которые добавлялись при отключении питания.
Недостатком является то, что это очень дорого, с другой стороны, они предлагают отличную поддержку. Из-за расходов, это действительно единственный вариант для больших ставок и / или продуктов с большим объемом. Как критическое встроенное оборудование, например, для добычи нефти и газа, которое должно обеспечивать целостность системы в «неопределенных» условиях эксплуатации (например, частые отключения электроэнергии и т. Д.).
Проверьте DataLight (компания) и / или продукт " Reliance NITRO ". (Reliance - это их устаревшее и безопасное, но не очень эффективное решение, заменяемое Reliance NITRO ). Даже если у вас нет денег, чтобы использовать эту систему, у них есть довольно хорошие статьи, в которых обсуждается, как работает их система, почему она более надежна, чем, например, ext3 и ext4.
Мои извинения, если это читается как реклама, просто хотел указать на варианты.
источник