Формат сжатия BTRFS - PullRequest
       73

Формат сжатия BTRFS

1 голос
/ 17 марта 2020

Я пытаюсь проанализировать поведение процесса записи BTRFS. Мне нужно создать простую тестовую программу, которая создает (на уровне пользователя, очевидно) те же самые сжатые двоичные объекты, что и те же самые двоичные объекты, сгенерированные модулем BTRFS на физическом жестком диске.

Каковы точные этапы записи файлов при сжатии файловая система BTRFS? Разделяются ли файлы по страницам / экстентам? Как определяются размеры файловой страницы? Определен ли процесс сжатия c? Как определяется размер страницы файла? Некоторые файловые страницы имеют размер не более 128 КБ (максимальный объем), несмотря на большое свободное пространство. Как так? Какое точное правило сжатия? Некоторые файловые страницы не сжимаются, несмотря на высокую степень сжатия. Почему?

Мое открытие (и дополнительные вопросы) после прочтения некоторой документации и исходного кода (linux / fs / btrfs / zlib. c & linux / fs / btrfs / inode. c) и тестирование FS с небольшими файлами (размером менее 10 КБ): (поправьте меня)

* Меньшие файлы делятся на страницы размером 4096 байт для дальнейшего сжатия. Сжатые капли являются смежными. С zlib файл меньшего размера сохраняется только как 1 большой двоичный объект (который начинается с 0x785E). Большие файлы сохраняются в виде отдельных смежных объектов. С zlib файл большего размера сохраняется как несколько больших двоичных объектов 0x785E. Каковы этапы фрагментации таких больших файлов перед сжатием? Как определяются размеры фрагментов?

* Если размер файла меньше размера сектора (512 байт), файл сохраняется как необработанный файл. Правильно?

* Если при попытке сжатия не удается сохранить не менее 1x PAGE_SIZE пространства (т. Е. Не менее 4096 байт), файл сохраняется как необработанный файл и помечается как несжимаемый. Правильно?

Псевдокод процесса записи был бы хорош. Пожалуйста, извините за мое незнание спецификации BTRFS. Заранее благодарю за помощь.

ОБНОВЛЕНИЕ: После проведения дальнейших тестов я уже могу ответить на некоторые из моих собственных вопросов.

ОБНОВЛЕНИЕ: Я обнаружил еще один угловой случай, когда файловые страницы не имеют размера 128KiB. Мне все еще нужно знать точное правило процесса сжатия.

ОБНОВЛЕНИЕ: я изменил свои вопросы. Отвечая на мои предыдущие вопросы:

(a) Да, файлы разбиты на страницы размером обычно 128 КБ; Некоторые страницы меньше. Некоторые небольшие файлы (я до сих пор не знаю их условий - насколько они малы?) Сохраняются в сжатом или необработанном виде во встроенных экстентах.

(b) (Я до сих пор не знаю ответа на этот вопрос ) Обычно, если есть много свободного места, размер файла составляет 128 КБ. В некоторых случаях (несмежное свободное пространство и другие неизвестные условия, которые еще предстоит определить), некоторые файловые страницы задаются с кратностью 0x1000 байт (4096 байт).

(c) Функция сжатия является детерминированной c. Однако, поскольку идентичные файлы в разных операционных средах обрабатываются по-разному (разные размеры файловых страниц, разная маркировка сжатия), сжатые большие двоичные объекты одинаковых файлов на разных дисках отличаются друг от друга на разных дисках. Если бы файлы обрабатывались в одной и той же среде, их сжатые двоичные объекты были бы одинаковыми на разных дисках.

Основное правило:

Файл должен быть разделен на несколько страниц размером 128 КБ. (По крайней мере с zlib) Каждая страница должна быть разделена на 4096-байтовые шаги (не более 128 шагов на страницу). Проверка эвристики сжатия (чтобы убедиться, что сжатый вывод меньше необработанного ввода) начинается с 3-го шага до конца страницы - для первых 2-х шагов проверка не выполняется. Начиная с 3-го шага во время сжатия l oop, если сжатый вывод больше, чем необработанный ввод, процесс сжатия текущей страницы отменяется, и текущая страница должна быть сохранена как необработанный блоб.

В случае успеха страница сохраняется в виде сжатого большого двоичного объекта. По умолчанию в настройках zlib большой двоичный объект начинается с 0x785E. Сжатый большой двоичный объект дополняется до 0x00.

Правило стороны:

Если файл меньше 512 байт и хранится во встроенном экстенте, файл должен быть сохранен в необработанном виде.

Если размер сжатого файла Размер секторов (по умолчанию 512 байт) меньше размера исходного файла, выходные данные сжатия принимаются, в противном случае выходные данные сжатия отбрасываются и файл помечается как несжимаемый.

Если свободного места очень много если файла недостаточно, то файл нужно разделить на неравные страницы - некоторые страницы не будут иметь размер 128 КБ.

...