среда, 27 августа 2008 г.

Squashfs lzma ядра 2.6.25+

Файловая система squashfs известна всем, кто хоть раз пытался создать миниатюрный LiveCD, размеров в несколько десятков мегабайт или меньше. Squashfs сжимает с помощью zlib образ, который мы ей скармливаем. Подмонтировав этот образ мы уже и не разберем на первый взгляд сжатый он или нет (работа с ним происходит достаточно быстро).


Плата за такие плюшечки - файловая система будет монтироваться "только для чтения". Однако, если очень надо, обойти это можно с помощью unionfs (ищите тут).

Специально для LiveCD на основе православной Слаки - SLAX было написано дополнение к классической squashfs, заставляющее её понимать образы сжатые более "могучим" алгоритмом - lzma.

Но, как это часто бывает, кроме хорошего родилось еще множество граблей, среди них:
- релизный squashfs поддерживает ядра вплоть до 2.6.24
- штатными методами чтение образов сжатых lzma алгоритмом компилируется в виде модулей ядра, а это чревато созданием initrd, если в squashfs сжата корневая файловая система.

Проблема номер раз с поддержкой squashfs новых ядер решается легко, т.к. работа над squashfs идет, просто релизов пока не выпускалось. Для решения проблемы достаточно применить squashfs-patch-2.6.25 на ядро, предварительно пропатченное патчем для 2.6.24го ядра. Проверялось это на 2.6.26 ядре, так что название патча не должно вас смущать. :)

Итак, squashfs у нас уже есть и можно пользоваться, но мы хотим, чтобы он сжимал с помощью алгоритма lzma. Для этого берем архивчик sqlzma3.3-XXX-2.tar.bz2 распаковываем и читаем sqlzma.txt. Если вас вполне устроит сборка этого хозяйства в виде модулей, то просто действуйте инструкции, оно работает. ;) Если же хотите вкомпилять это в ядро, то следуйте моей инструкции:
- выполняйте первые пункты штатной инструкции по скачке и патчингу архива проекта sevenzip (это и есть lzma)
- далее, вас попросят пропатчить пропатченное squashfsом ядро. патч бы успешно применился, если бы мы сами ядрышко не патчили патчем для поддержки 2.6.25 ядра. чтобы он применился без ошибок, необходимо в файле fs/squashfs/inode.c заменить строку с версией модуля
printk(KERN_INFO "squashfs: version бла бла бла
на
printk(KERN_INFO "squashfs: version 3.3 (2007/10/31) "
и еще одну в конце файла на
MODULE_DESCRIPTION("squashfs 3.2-r2-CVS, a compressed read-only filesystem");
Или наоборот - подправить патч от lzma.
- после успешного применения патча, редактируем fs/squashfs/Makefile, добавляем в конце:
obj-$(CONFIG_SQUASHFS) += unlzma.o sqlzma.o
unlzma-y += module.o
sqlzma-y += uncomp.o
- копируем в fs/squashfs недостающие файлы:
LzmaDecode.c
LzmaDecode.h
LzmaTypes.h
module.c
sqlzma.h
sqmagic.h
uncomp.c
в каждом из этих файлов проверяем корректность путей в директивах include.

Все, теперь вы скорее всего успешно скомпиляете ядро в котором будет мега-squashfs. :)

Все эти телодвижения (сразу после патчинга ядра squashfsом с поддержкой новых ядер) я оформил в виде патча, который и прилагаю sqlzma.patch
.

Комментариев нет: