пятница, 3 декабря 2010 г.

LZMA сжатие в SquashFS-4.0

Это пост - продолжение двух предыдущих:
Создание LiveCD Slackware based: использование Squashfs
AUFS-2.1: установка и работа в связке с SquashFS
посвященых использованию сильно-сжатой файловой системы Squashfs в построении LiveCD.

Долгое время LZMA-сжатие для SquashFS было отдельным проектом Tomas'a Matejicek'a - основателя Slax-LiveCD. С принятием в основную ветку ядра Linux SquashFS четвертой версии, поддержка альтернативных алгоритмов сжатия легла на создателей SquashFS Филипа и Роберта Лоуферов(англ. Lougher). В настоящее время в ядро ревизии 2.6.36 включен алгоритм сверх-быстрого (Real-time) LZO сжатия. SquashFS версии 4.1 с поддержкой алгоритмов lzma и xz ожидается в ревизии ядра 2.6.37 или 2.6.38. Более подробно можно почитать на вики проекта дистрибутива "Федора"
https://fedoraproject.org/wiki/Features/LZMA_for_Live_Images
там же приведены ссылки на соответствующие треды.

Ближе к делу. Нам нужен будет пакет squashfs-tools с поддержкой lzma. Веб-адрес проекта:
http://squashfs.sourceforge.net
Последняя стабильная версия 4.1, в нем анонсирована поддержка lzma. Проблема в том, что при сборке используется LZMA SDK, который нужно брать здесь
http://www.7-zip.org/sdk.html

нам же, как пользователям Slackware, проще будет собрать squashfs-tools из рабочей версии, где осуществлена поддержка lzma на основе xz-пакета.

идем на страницу:
http://squashfs.cvs.sourceforge.net/viewvc/squashfs/squashfs/squashfs-tools
и мышкой жмем внизу на кнопку "Download tarball"

распаковываем архив:
# tar xvf squashfs-squashfs-tools.tar.gz

переходим в целевой каталог:
# cd ./squashfs-tools

и открываем текстовым редактором Makefile. На данный момент lzma и xz поддержка реализована, но пока отключена. Нужно раскомментировать(убрать решетку) следующие строки в Makefile:
#LZMA_XZ_SUPPORT = 1

#XZ_SUPPORT = 1

после чего сохраняем Makefile и запускаем сборку командами
# make clean
# make

на выходе получаем две утилиты mksquahsfs и unsquashfs. проверяем:
# ./mksquashfs --help

в конце справки должно будет вывести:
Compressors available:
gzip (default)
lzma
xz

значит все Ok
копируем в каталог /tmp/livecd содержимое диска полученного в прошлый раз в топике
AUFS-2.1: установка и работа с связке с SquashFS

и туда же копируем только что собраные утилиты mksquashfs и unsquashfs
# cp -v ./mksquashfs /tmp/livecd
# cp -v ./unsquashfs /tmp/livecd

размер полученного в прошлый раз размер образа initrd сжатого gzip алгоритмом:
54616064 байт

распакуем его:
# ./unsquashfs -d ./1 ./image
# cd ./1

сожмем на этот раз lzma алгоритмом:
# rm ../image
# ../mksquashfs . ../image -comp lzma
# ls -l ../image

47341568 байт. Разница более семи мегабайт, т.е. эффективность сжатия около 15%. Теперь пробуем еще раз, но с алгоритмом XZ
# rm ../image
# ../mksquashfs . ../image -comp xz
# ls -l ../image

47304704 байт. Разница в четвертом знаке, т.е. это доля процента. Думаю понятно, что этот алгоритм нас пока не будет интересовать. Как бы ещё так "прыгнуть выше головы", в смысле улучшить наше положение? Штудирование опций mksquashfs навело на следующие:
# rm ../image
# ../mksquashfs . ../image -comp lzma -b 512K
# ls -l ../image

44384256 байт. Ого!! итоговый результат более 10Мб, целых 20%! Увеличив размер блока файловой системы до 512Кбайт мы существенно уменьшили итоговый вес образа initrd. А вот сжатие с размером блока один мегабайт совершает чудо. размер initrd сокращается еще на мегабайт, до 43208704 и.. с таким образом Recovery-версия запускается на 96Мб оперативки. Это значит, что у меня есть вагон пространства до 128Мб для дополнительных программ. Кстати, эмпирическим путем наметилось правило: размер потребляемой оперативки равен размеру образа умноженному на два, плюс размер несжатого ядра. Как избавиться от умножения на два? хотелось бы мне знать..

Ах да. Для того чтобы загрузиться с новым initrd нужно еще ядро с поддержкой lzma для squashfs. Адрес проекта поддержки lzma для squashfs4.0:
http://git.kernel.org/?p=linux/kernel/git/pkl/squashfs-lzma.git;a=summary
оттуда можно выкачать исходники ядра 2.6.34-rc6 с lzma сжатием для Squashfs, отдельного патча к сожалению нет. Я собрал его с поддержкой AUFS и в итоге получил LiveCD на SquashFS-4.0 с LZMA сжатием. Таким образом, за счет использования SquashFS с LZMA сжатием, я снизил потребление оперативной памяти в Recovery-LiveCD c 256Мб до 96Мб.

скриншот

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

Отправить комментарий