Вопрос или проблема
Мне просто интересно, как сжать последний (2.6.32 на момент написания) ядро с помощью UPX?
Это хорошо работало для более старых ядер, но теперь пересобранное с помощью UPX ядро не загружается, хотя стандартные методы сжатия (gzip, bzip2, lzma) работают нормально.
Должно быть связано с некоторыми параметрами конфигурации ядра.
$ zcat /proc/config.gz | grep -i lzma
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_DECOMPRESS_LZMA=y
Проверьте свою конфигурацию на вкладке Общие настройки в ядре
Мне удалось сжать ядро Linux 2.6.33.0 i386 bzImage и загрузить его с помощью qemu-system-i386. Подробности:
- Я построил bzImage с помощью
make bzImage
, используя значение по умолчаниюCONFIG_KERNEL_GZIP=y
в.config
. - Я использовал UPX 4.2.4, установленный как команда
upx
. - Я выполнил эти команды UPX для перезаписи bzImage, сжатого с помощью
CONFIG_KERNEL_GZIP=y
:upx -f --no-lzma --best arch/x86/boot/bzImage -o bzImage.nolzma.upx upx -f --lzma --best arch/x86/boot/bzImage -o bzImage.lzma.upx
- Я успешно загрузил все файлы ядра
bzImage
с помощью qemu-system-i386 версии 2.11.1:qemu-system-i386 -kernel bzImage.nolzma.upx -initrd ... ...
- Ядра, сжатые с помощью UPX, загружаются немного быстрее: примерно на 0,03 с. На этом размере декомпрессия LZMA не медленнее, чем декомпрессия NRV (
upx --no-lzma
). - Размеры файлов:
vmlinux
: 2 268 129 байт, включая символы (исполняемый файл i386 ELF-32, несжатый, не обрезанный, не может быть загружен с помощью qemu-system-i386)- 1 200 128 байт кода (.text)
- 237 131 байт инициализированных данных (.data)
- 1 008 053 байт неинициализированных данных (.bss)
- 1 437 259 байт для сжатия (всего .text и .data)
bzImage.nolzma.upx
: 805 200 байт (сжатие UPX NRV, загрузочный)bzImage.lzma.upx
: 726 608 байт (сжатие UPX LZMA, загрузочный)arch/x86/boot/bzImage
: 857 264 байт (сжатие gzip CONFIG_KERNEL_GZIP=y, загрузочный)arch/x86/boot/bzImage.lzma
: 728 896 байт (сжатие LZMA CONFIG_KERNEL_LZMA=y, загрузочный)
Ответ или решение
Чтобы сжать новую версию ядра Linux с использованием UPX, особое внимание стоит уделить конфигурационным параметрам ядра и самим процессам сжатия. В этом ответе я расскажу о ключевых моментах, которые помогут вам успешно выполнить эту задачу на примере ядра версии 2.6.32 и более поздних.
Подготовка к сжатию
-
Сборка ядра: Прежде всего, убедитесь, что ядро собрано с нужными параметрами. Для обеспечения совместимости с UPX, необходимо задать правильные настройки в конфигурации ядра.
-
Проверка конфигурации: Используя команду, приведенную в вашем запросе:
$ zcat /proc/config.gz | grep -i lzma
Убедитесь, что у вас установлены следующие параметры:
CONFIG_HAVE_KERNEL_LZMA=y CONFIG_DECOMPRESS_LZMA=y
Эти параметры обеспечивают поддержку LZMA для вашего ядра, что может быть критически важно для успешной работы UPX.
Использование UPX для сжатия
Следующий шаг — сжать образ ядра. В качестве примера возьмём процесс сжатия образа bzImage
, который вы собирали с помощью команды:
make bzImage
-
Сжатие с использованием UPX: После того как ваш файл
bzImage
готов, вы можете использовать UPX для сжатия:-
Для сжатия без использования алгоритма LZMA:
upx -f --no-lzma --best arch/x86/boot/bzImage -o bzImage.nolzma.upx
-
Для сжатия с использованием LZMA:
upx -f --lzma --best arch/x86/boot/bzImage -o bzImage.lzma.upx
-
Тестирование и загрузка ядра
-
Загрузка сжатого ядра: Чтобы убедиться, что сжатый образ загрузится без ошибок, используйте
qemu-system-i386
:qemu-system-i386 -kernel bzImage.nolzma.upx -initrd ...
или
qemu-system-i386 -kernel bzImage.lzma.upx -initrd ...
Если ваш сжатый образ успешно загружается в QEMU, значит процесс прошел успешно.
Итоги и анализ
После выполнения указанных шагов, вы должны увидеть уменьшение размера файла без значительной потери скорости загрузки. Обратите внимание на результаты сжатия:
bzImage.nolzma.upx
: 805 200 байтbzImage.lzma.upx
: 726 608 байтarch/x86/boot/bzImage
(gzip сжатие): 857 264 байтarch/x86/boot/bzImage.lzma
(LZMA сжатие): 728 896 байт
Эти данные показывают, что UPX действительно может предложить конкурентоспособный уровень сжатия и иногда даже более быструю загрузку.
Заключение
Для успешной компрессии ядра Linux с помощью UPX, важно правильно настроить конфигурацию ядра, выбрать подходящий метод сжатия и тщательно протестировать результат. Изучив особенности параметров конфигурации и методы сжатия, вы сможете добиться эффективного уменьшения размера образа ядра без ущерба для его работоспособности.