Сжать последний ядро с помощью upx

Вопрос или проблема

Мне просто интересно, как сжать последний (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 и более поздних.

Подготовка к сжатию

  1. Сборка ядра: Прежде всего, убедитесь, что ядро собрано с нужными параметрами. Для обеспечения совместимости с UPX, необходимо задать правильные настройки в конфигурации ядра.

  2. Проверка конфигурации: Используя команду, приведенную в вашем запросе:

    $ zcat /proc/config.gz | grep -i lzma

    Убедитесь, что у вас установлены следующие параметры:

    CONFIG_HAVE_KERNEL_LZMA=y
    CONFIG_DECOMPRESS_LZMA=y

    Эти параметры обеспечивают поддержку LZMA для вашего ядра, что может быть критически важно для успешной работы UPX.

Использование UPX для сжатия

Следующий шаг — сжать образ ядра. В качестве примера возьмём процесс сжатия образа bzImage, который вы собирали с помощью команды:

make bzImage
  1. Сжатие с использованием 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

Тестирование и загрузка ядра

  1. Загрузка сжатого ядра: Чтобы убедиться, что сжатый образ загрузится без ошибок, используйте 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, важно правильно настроить конфигурацию ядра, выбрать подходящий метод сжатия и тщательно протестировать результат. Изучив особенности параметров конфигурации и методы сжатия, вы сможете добиться эффективного уменьшения размера образа ядра без ущерба для его работоспособности.

Оцените материал
Добавить комментарий

Капча загружается...