Есть несколько существующих тем, вращающихся вокруг этой проблемы, но то, что я ищу, немного отличается. У меня есть SD-карта на встроенном Linux, и он страдает от потери питания. Возможно, я смогу изменить аппаратное обеспечение в какой-то момент, правильно закрыть и т. Д. И т. Д. Но сейчас я просто хотел бы найти файловую систему, которая без сбоев выживет. Потеря данных приемлема. Я предпочел бы не потерять больше, чем файл, который я сейчас пишу, но я все равно предпочел бы потерять все это, чем столкнуться с «неспособностью смонтировать», «подождать 10 минут fsck» или «не может создать новый файл из-за этого inode что-то что-то ошибка ». Программа ДОЛЖНА продолжаться!
Я прилагаю много усилий для обеспечения этого. Я использую компоненты промышленного уровня, у меня есть аппаратные сторожевые таймеры, программные сторожевые таймеры, внутренние, внешние, перезапуск программ init, демоны, постоянно проверяющие память, файловые дескрипторы и еще много чего, у меня есть сторожевые таймеры, которые смотрят мои сторожевые псы, которые в свою очередь отслеживаются другими сторожевыми программами ... Но я не могу гарантировать, что SD-карта способна монтировать и функционировать?
Мой лучший выбор сейчас - использовать JFS на SD-карте, включая fsck и fsck.jfs в мою установку. (Добавление 600kb + еды моего оперативной памяти и флэш-памяти. Что плохо.) И запускайте fsck при каждом запуске (возможно, добавляя много времени загрузки. Что несколько плохо.). Это кажется немного грустным, хотя.
Кто-нибудь знает о лучшем способе или лучшей файловой системе?
ОБНОВЛЕНИЕ: e2fsprogs-libs (зависимость от jfsutils), похоже, адски сложно скомпилировать в моем дистрибутиве. Я посмотрю на ZFS (хотя он не является родным для моего дистрибутива. И, похоже, он делает многое из того, что мне не нужно.)
ОБНОВЛЕНИЕ 2: Еще немного информации о моей системе и моих тестах: Память на SD-карте является дополнительной, дополнительной памятью. Карты SD - 2Gb-8Gb промышленного класса microSD. SD-карта монтируется через мой rc с помощью команды mount -t. Опции "noatime", но не "sync". Мой дистрибутив - пользовательский uClinux со вкусом аналогового устройства, с ядром 3.10 и 1.21 busybox. Мое основное хранилище - это spi flash с jffs2. У меня никогда не было проблем с этим. Я даже не знаю, есть ли доступный fsck.jffs2. Нанд флеш с другой стороны ... но это другая история. Назначение SD-карты - хранить данные измерений. Программа 'monitor' добавляет результаты в файл и имеет стратегическую синхронизацию. Когда размер файла превысит заданный размер, будет создан новый файл. При достижении заданного количества файлов самый старый будет удален. Если текущий файл измерений теряется из-за потери мощности, это не беда. Файлы обычно имеют размер 50-100 КБ, а 1 результат обычно составляет 1 КБ. Это только начальная фаза разработки. Ничто не исправлено. Это первый раз, когда я имею дело с файловыми системами без флэш-памяти во встроенных системах. (Я получил ext4 на моих серверах x86.)
Я начал с vfat. Файловая система по умолчанию. (Я подумал, что у заводов может быть причина для его выбора. И если что-то работает, меня это особо не волнует.) Я никогда не видел проблем с потерей мощности во встроенных устройствах vfat. У меня возникли проблемы с FAT в WinCE. Однако, когда моя программа 'monitor' достигла 100-200 файлов, она больше не создавала. Кажется, что у FAT есть особая проблема с ограничением количества файлов в корне и немного больше в подпапках. Мне нужно иметь возможность создавать 500-1000 файлов в 1 директории. Так что vfat не подойдет.
Затем я переключился на ext2. Я не вставил fsck при запуске, хотя. (Не знал, что я должен был это сделать.) В течение дня моя программа-монитор не смогла создать больше файлов из-за ошибки «что-то из inode». Стихийное бедствие!
Мое текущее решение - ext2 с "e2fsck -y" при запуске. Пока это кажется многообещающим. Но e2fsck и вся концепция «fsck при запуске» мучают меня. Сам e2fsck тратит более 350 КБ моей основной вспышки и оперативной памяти. (Когда он не работает.) Это означает, что это моя самая большая программа. Это больше, чем busybox. Это почти соперничает с моим ядром.
Я рассматривал ext3. В нем есть метаданные, которые не повредят. Я сомневаюсь, насколько это поможет. Я думаю, что с моими небольшими файлами и контролируемой синхронизацией я должен быть покрыт? Имеет упорядоченную последовательность записи. Это означает, что данные также несколько записаны в журнал. Это, однако, может привести к недетерминированным задержкам. Что плохо в моей ситуации. (Это, вероятно, не проблема.) Он также имеет функцию синхронизации по расписанию. Например. совершать каждые 5 сек. Который мешает моей собственной синхронизации, я думаю. Слишком много записей плохо для SD-карт. Даже промышленные. Я не могу найти документацию о том, как отключить это. И ext3 по- прежнему требует запуска fsck при каждом запуске! Но ext3 все еще возможна.
Ext4. Устранит множество проблем с производительностью ext3. Мне не очень нужна производительность. И в моем дистрибутиве нет встроенных mkfs.ext4 и fsck.ext4. Возможно, это не проблема. Это может хотя. Например. У e2progs-libs (зависимость от jfsutils), похоже, много проблем с компиляцией.
JFS, XFS, BRFSS. Все поддерживается моим ядром. В настоящее время не включены в мой ящик для инструментов пользовательского пространства. Все кажется довольно большими, сложными системами. И все они, кажется, требуют эквивалент 'fsck' при запуске?
Я также подумал о создании собственной файловой системы: всегда пишу 2 копии таблицы файлов. При обходе выбирается тот, который имеет правильный CRC и самый новый порядковый номер. Сделайте двухэтапную последовательность записи. Выделить временно, исправить при фиксации. Fsck не требуется. Боюсь, это может быть немного наивно.
ОБНОВЛЕНИЕ 3: Кстати, природа встроенных систем (по крайней мере, этой) заключается в том, что они автономны, без присмотра, вне досягаемости, и им приходится работать годами. Такие программы, как fsck, которые могут потребовать взаимодействия с человеком, меня пугали.