| « R3-FS (продолжение 1) | BAADF00D » |
Сегодняшний день -- день рождения новой ФС. Предлагаю отметить его ликованием. Наконец-то мы завершили процесс разработки и уже не осталось сомнений -- файловой системе быть!
Продолжение:
Исходные данные - нашим приходится разрабатывать всевозможные измерительные системы и системы сбора данных, у которых одна особенность - они встроенные и не должны требовать вмешательства со стороны человека. Это не исключает необходимости представлять данные в удобном для человека виде. Человек с точки зрения нашего робота - явление временное, появляется редко. Данные он забирает, оставляет ценные указания. А робот всё время трудится и плодит несметное количество архивов, часть которых выкидывается потому что не привлекает внимания. Например, катится измерительная платформа из Питера в Москву и измеряет каждый сантиметр пути, по дюжине параметров. Гигабайты полученных данных складирует на носитель и стираются, если они не востребованы.
В качестве основной модели мы выбрали флеш память, со всеми её особенностями и недостатками. Мы не планируем реализацию ФС для жестких дисков. Какие жесткие диски выдержат прямое попадание камнем? Наш робот-трансформер крепится под обычной железнодорожной платформой для контейнеров. Должен выдерживать вибрации, от которых гайки и разъемы самопроизвольно выкручиваются, если не скреплены стальной проволокой.
Недостатки флеш памяти:
1. ограниченное количество циклов записи, для MLC многослойных чипов - количество циклов всего 500 для SLC заметно больше. Но если речь идет о перезаписи гигабайтов данных в час, то надежности просто не хаватает для обеспечения работы традиционных файловых систем таких как FAT. FAT просто протрет до дыр те кластеры, где живут таблицы FAT и директории.
2. Битые блоки на NAND FLASH даны от рождения, чипы продаются изначально с битыми блоками и битые блоки могут проявляться в процессе эксплуатации.
3. Большое время стирания данных и большой размер единицы стирания данных. Вообще, когда единица стирания данных (сегмент) отличается от единицы хранения (страница, блок, сектор) - не удобно.
Если носитель большого размера и файлы большого размера, то хранение таблиц FAT -- крайне не разумно с точки зрения распределения памяти, они занимают мегабайты и мегабайты. Надежность хранения данных сильно падает, поскольку при увеличении размеров файлов вероятность сбоя растет пропорционально размеру носителя и размеру файла.
Требования к фс:
Файловая система должна быть совместима с FAT, потому что доступ осуществляется через USB.
Устройство должно прикидываться Mass Storage носителем типа Флешка и давать прозрачный доступ на чтение ко всем архивам. Архивы бывают большого размера. В случае переполнения носителя архивы должны затираться по времени хранения. Некоторые архивы должны иметь возможность сохраняться дольше обычных. Как воспоминания, если полезные и важные, хранятся дольше.
Файловая система должна быть абсолютно надежной в условиях, когда на носителе возникают ошибки. Ошибки проявляются в виде выколотых бит. Потеря одного бита данных на блоке не должна приводить к потере данных. Данные должны автоматически восстанавливаться. Для решения такой задачи существуют алгоритмы ECC -- контроля и коррекции целостности данных.
Файловая система должна быть быстрой, абсолютно быстрой, быстрее некуда. Что такое "быстрее некуда" с точки зрения робота -- это когда для пересылки данных (сохранения архива на носитель) вообще не расходуется процессорное время. В рамках известных операционных систем это просто не реально. Обычно операционная система копирует буфер два три раза прежде чем данные попадут на носитель.
Решения:
Мы переделали обычный POSIX стиль работы с файлами, только ради одной идеи, чтобы исключить лишнее копирование буферов, совсем исключить. Способ работы с файловой системой стал таким: если файл уже создан, то распределение ресурсов памяти (выделение буферов) дело драйвера носителя, а не приложения. По сути, когда программа обращается к файловой системе на RAM диске или во встроенный флеш, то в ответ получает ссылку на память, где данные хранятся, а не новый блок заполненный данными.
Формат носителя подбирается таким образом, чтобы для операций копирования данных на носитель можно было использовать DMA (прямой доступ к памяти). Данные не должны требовать обработки. Это порождает только одно побочное требование -- контроль целостности надо выполнять аппаратно. Если целевая аппаратура поддерживает DMA и имеет встроенную поддержку ECC, то оказывается возможно достичь абсолютного показателя -- файловая система не грузит процессор.
На этом мы не остановились, надо увеличивать быстродействие носителя за счет применения технологий RAID. В современных FLASH в одном корпусе (в одной микросхеме) может быть до 4-х независимых чипов. Пока программируется один чип можно выполнять пересылку данных в другой чип. Блоики данных поочередно пишутся то в один, то в другой чип. Наращивать производительность можно также путем включения чипов Flash памяти в параллель для увеличения разрядности передачи данных, как это делается в SSD носителях.
Все эти причуды поддерживаются на уровне драйвера носителя (драйвера блочного устройства), но файловая система ориентируется именно на такой драйвер.
Требования: совместимость с FAT
Решения:
Мы создали уровень трансляции нашей файловой системы в FAT. Ничего из присущих FAT структурных элементов: загрузочного блока, шапки, таблиц FAT и директорий не существует в нашей ФС. Наша ФС по запросу с ПК синтезирует блок данных такой, как если бы данные хранились в FAT. Размещение файлов на носителе описывается не таблицей, а списком цепочек. Если цепочка непрерывная - то это всего два числа: смещение на носителе и длина цепочки кластеров. Уровень совместимости не хранит данные о сгенерированной FAT. Трюк в том, что Операционная система Linux или Windows опрашивает FAT последовательно блок за блоком. Наша ФС последовательно подсовывает хосту то, что тот хочет видеть, а не то что есть на самом деле.
На самом деле... (продолжение следует)
URL трекбека (щелкните правой кнопкой мыши и скопируйте ссылку)