Cramfs (Compressed ROM File System)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:02, 7 мая 2019.
Cramfs
Cramfs config.jpg
Полное название Compressed ROM File System
Содержимое каталога B+ дерево
Распределение файлов Bitmap
Limits
Макс. размер тома 16 Тб
Макс. размер файла 1 Эб (8 [Тб в 32 битных системах)
Макс. количество файлов 232−3 (~4 млрд.)
Макс. длина имени файла 4032 байт, до 255 Linux VFS
Разрешенные символы
в именах файлов
Все байты, кроме NUL и '/'
Features
Даты зарегистрирован изменение (mtime), изменением метаданных (ctime), доступ (atime)
Диапазон дат 14 декабря 1901 – 18 января 2038
Дата резолюции 1 с
Вилка Расширенные атрибуты
Прозрачное сжатие Нет
Транспорантное шифрование Нет
Другие
Операционная система Linux
Compressed ROM file system (cramfs) — свободная сжатая файловая система для Linux для встраиваемых систем основанных на ПЗУ. Разработана для простоты обращения и эффективного использования свободного места.

Cramfs доступна только для чтения (хотя есть патчи, добавляющие поддержку временной модификации данных), ограничена размером 256*106 байт для файловой системы (и 16*106 байт на файл), а также не поддерживает 16/32-разрядные идентификаторы пользователя и группы.

Образ cramfs создаётся с помощью утилиты mkcramfs.

В отличие от сжатого образа обычной файловой системы, образ cramfs может быть использован как есть, то есть без предварительного разархивирования. По этой причине некоторые дистрибутивы Linux использовали cramfs как initrd-образ или установочный образ (например, SUSE Linux), где размер памяти ограничен.

Cramfs считается устаревшей, в качестве замены предлагается использовать squashfs.[Источник 1]

Особенности

У данной файловой системы есть следующие особенности:

  • Данные, индексы, каталоги и списки блоков хранятся сжатыми
  • Файлы делятся на фрагменты, и эти фрагменты сохраняются как смещения в сплошные блоки (fblocks), содержащие данные, что означает, что части разных файлов сжимаются вместе для эффективного сжатия, а одинаковые фрагменты сжимаются только один раз.
  • Дублирующие иноды, файлы и даже повторяющиеся фрагменты файлов обнаруживаются и сохраняются только один раз без дополнительных накладных расходов
  • Поддерживается большинство типов inode, распознаваемых Linux.
  • Сжатие LZMA используется для fblocks. В общем случае LZMA сжимается лучше, чем gzip и bzip2.
  • Будучи файловой системой, файлы на томе cromfs могут быть произвольно доступны в произвольном порядке; всеми возможными средствами, включая память.
  • Работает на 64-битных и 32-битных системах.

Ограничения

Cramfs содержит определённые ограничения:

  • Максимальный размер файла: 264 байта (16777216 ТБ), но 256 ТБ с настройками по умолчанию.
  • Максимальное количество файлов в каталоге: 230
  • Максимальное количество inodes (все файлы, dirs и т. д.): 260, но зависит от размеров файлов
  • Максимальный размер файловой системы: 264 байта (16777216 ТБ)
  • Нет . или .. в каталогах (не касается Linux).
  • cromfs и mkcromfs медленнее, чем их аналоги.
  • Драйвер cromfs потребляет много памяти. Он не подходит для систем с ограниченным размером.
  • Максимальная длина имени файла: 4294967295 байт
  • Максимальная длина символьной ссылки: 65535 байт
  • Будучи файловой системой пользовательского пространства, она может не подойти для корневых файловых систем аварийного восстановления, крошечных Linux и установочных дисков.
  • Для устройств inodes предполагается только одна жесткая ссылка. (Это не влияет на эффективность сжатия).

Усиленное сжатие

Чтобы улучшить сжатие, можно воспользоваться следующим:

  • Не изменять --lzmafastbytes. Значение по умолчанию - 273, что является максимально возможным.
  • Указывать значения для -lzmabits, таких как -lzmabits 2,0,3. Это сделает фазу окончательного сжатия значительно быстрее.
  • Регулировать размер блока --bsize в mkcromfs. Если файлы имеют много идентичного контента, используется граница в качестве значения размера блока. Желательно использовать небольшое значение (500-5000), но не большее значение (20000-400000). Слишком небольшие значения, тем не менее, делают inodes большими.
  • Коррекция размера fblock -fsize в mkcromfs. Большие значения вызывают почти всегда лучшее сжатие. Однако большие значения также увеличивают потребление памяти при установке файловой системы. Значение по умолчанию (2097152).
  • Регулировка параметра --autoindexperiod (-A). Меньшее значение увеличит шансы mkcromfs найти идентичный блок из того, что уже обработано (если данные имеют такую ​​возможность). Поиск того, что два блока идентичны, всегда означает лучшее сжатие.
  • Сортировка файлов. Файлы, имеющие аналогичный или частично идентичный контент, должны обрабатываться друг другого.
  • Регулировка параметра --bruteforcelimit (-c). Для больших значений потребуется mkcromfs для проверки большего количества fblocks для каждого блока, который он кодирует (делая кодирование намного медленнее), в надежде, что он улучшит сжатие.
  • --bruteforcelimit - способ практически умножить значение -fsize (таким образом, улучшая сжатие) на целочисленный коэффициент без увеличения использования памяти cromfs или использования памяти. Рекомендуется использовать, если нет необходимости, чтобы mkcromfs был быстрым.
  • Верхним пределом значений для параметра -c является количество fblocks в результирующей файловой системе.
  • Регулировка значения -lzmabits. Это влияет на фазу сжатия mkcromfs (последняя фаза после блокировки).

Архитектура

Как и любая другая файловая система, cramfs состоит из базовых элементов. Ниже представлены данные элементы и описание каждого из них:

Inode

Каждый объект в файловой системе (со стороны пользователя) является «inode». Это включает символические ссылки, каталоги, файлы, фиксы и записи устройств. Индекс содержит атрибуты файла и его содержимое, но не его имя. (Имя содержится в списке каталогов вместе со ссылкой на inode.) Это традиционный способ в системах Unix.

Когда файл «жестко привязан» к нескольким местоположениям в файловой системе, inode не копируется. Номер inode просто указан в нескольких каталогах.

Символьная ссылка является совершенно новым inode, не связанным с файлом, на который он указывает.

Block

Содержимое каждого файла (обозначается индексом) делятся на «блоки». Размер этого блока контролируется параметром командной строки --bsize. Например, если файл имеет размер 10000 байт, а размер bsize равен 4000, файл содержит три блока: 4000 + 4000 + 2000 байт. Таким образом, inode содержит три номера блоков, которые относятся к записям в таблице блоков. Только обычные файлы, символические ссылки и каталоги имеют «содержимое», которое необходимо хранить. Например, записи устройств не имеют связанного содержимого. Содержимое каталога представляет собой список имен файлов и номеров inode. Каждый раз, когда mkcromfs хранит новый блок, генерируется новый номер кадра, чтобы обозначить этот конкретный блок (этот номер хранится в inode), а новый локатор данных хранится для описания того, где находится блок (локатор хранится в блок-таблица). Если mkcromfs повторно использует ранее созданный локатор данных, необходимо сохранить только номер блока.

Атрибуты файлов и содержимое файла хранятся отдельно. В cromfs inode содержит массив номеров блоков, необходимых для нахождения фактического содержимого файла.

FBlock

Fblock - это блок хранения в файловой системе cromfs. Это физический контейнер данных блока для нескольких файлов. Когда mkcromfs создает новую файловую систему, он разбивает каждый файл на блоки, и для каждого из этих блоков он определяет, к какому fblock они идут. Максимальный размер fblock задается параметром командной строки -fsize. Каждый fblock сжимается отдельно, поэтому несколько больших fblocks сжимаются лучше, чем многие маленькие fblock. Cromfs автоматически создает столько fblocks, сколько необходимо для хранения содержимого всей создаваемой файловой системы. Фблок - это просто хранилище. Независимо от размеров блоков и fblock, fblock может содержать любое количество блоков, от 1 до верхнего (без верхнего предела). Это полезно для перекрытия блоков, и это важный источник мощности cromfs.

Номер блока и таблица блоков

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

Локатор данных

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

Индексирование блоков (только mkcromfs)

Когда mkcromfs хранит блоки, он запоминает, где он хранит их, поэтому, если он позже найдет идентичный блок в другом файле (или том же файле), ему не нужно будет снова искать fblocks, чтобы найти лучшее место размещения. Индекс представляет собой карту хешей блоков для локаторов данных и номеров блоков.

Параметр --autoindexperiod (-A) может использоваться для расширения этого механизма, который в дополнение к уже закодированным блокам запоминает больше мест в этих fblocks - создавайте «на всякий случай» локаторы данных для будущего использования, но не фактически сохраните их в таблице блоков, если они не будут использованы позже. Это помогает сжатию, когда количество искавшихся fblocks (-bruteforcelimit) невелико по сравнению с количеством генерируемых fblocks за счет стоимости памяти, потребляемой mkcromfs, а также может увеличить скорость mkcromfs (но также и медленнее).

Случайный период сжатия (только mkcromfs)

Когда mkcromfs запускается, он создает временный файл для каждого fblock результирующей файловой системы. Если результирующая файловая система велика, эти fblocks будут занимать еще больше места. Чтобы сохранить дисковое пространство, mkcromfs сжимает эти fblocks, когда они не доступны. Однако, если ему нужно снова получить к ним доступ (для поиска содержимого для соответствия), он должен будет сначала распаковать их. Это сжатие + декомпрессия может потреблять много времени. Это не помогает размеру результирующей файловой системы; он сохраняет только временное дисковое пространство. Если не важно временное дисковое пространство, можно использовать опции --randomcompressperiod большое количество (например, 10000), чтобы предотвратить ненужное декомпрессирование + сжатие fblocks снова и снова. Это улучшит скорость mkcromfs.

Параметр --decompresslookups связан. Если используется параметр --randomcompressperiod, также нужно включить --decompresslookups. Временные файлы записываются туда, куда указывает переменная окружения TEMP. TMP также распознается.

Хранение инод

Все иноды файловой системы также хранятся в файле вместе. Этот файл упакован как любой другой файл, разбитый на блоки и разбросанный в fblocks. Этот список локатора данных этого файла хранится в специальном inode, называемом «inotab», но он не отображается ни в одном каталоге. «Inotab» имеет свое место в файле cromfs.[Источник 2]

Источники

  1. The Best Linux Blogging Software // Namesys. [2018]. Дата обновления: 05.05.2018. URL: http://www.namesys.com/#nodelayout (дата обращения: 08.10.2018).
  2. Cromfs: Compressed ROM filesystem for Linux (user-space) // bisqwit [2018]. Дата обновления: 08.01.2014. URL: https://bisqwit.iki.fi/source/cromfs.html (дата обращения: 08.10.2018).