Есть ли способ добавить функциональность kexec в busybox initrd?

У меня на плате 3 МБ флэш-памяти SPI, и я могу упаковать bzImage, busybox initrd и coreboot ROM в эту флэш-память SPI. Я также могу загрузиться в оболочку, используя ядро ​​ПЗУ в качестве загрузчика.

У меня больше ядро ​​на USB-устройстве. Я также могу обнаружить USB и смонтировать его. Но проблема в том, что в busybox нет утилиты kexec. Я не могу использовать какой-либо другой пакет initrd, потому что размер моего cpio (несжатого) не должен превышать 1,4 МБ из-за нехватки памяти. U-root имеет поддержку kexec, но минимальный размер образа легко достигает 3 МБ или, по крайней мере, Я не мог найти способ построить его меньше, чем этот размер.

Следовательно, есть ли способ добавить поддержку kexec в busybox (скомпилировать статический двоичный файл и скопировать в initrd?) или любой другой пакет initrd, который может удовлетворить потребность в размере 1,4 МБ?

ИЗМЕНИТЬ

В этом сообщении предполагается, что в busybox может быть доступна поддержка kexec, но я не смог найти его следы. На самом деле запрос на добавление kexec-tools в busybox был сделан более десяти лет назад. Но когда я сделал grep в busybox, я не увидел его следов.


person Insane Coder    schedule 29.10.2019    source источник


Ответы (1)


Бинарный файл kexec из kexec-tools занимает около 300 КБ (x86_64 с -Os). Даже если бы он был добавлен в busybox, он не стал бы намного меньше, потому что ему нужно делать довольно сложные вещи, которые больше нигде не делаются в busybox.

Если у вас не осталось даже 300 КБ, вам, вероятно, следует удалить параметры конфигурации из самого busybox, чтобы сэкономить место. С uClibc вы также можете удалить некоторые параметры, которые вам не нужны, например wchar и threading. Убедитесь, что вы используете статическую ссылку, это экономит немного места.

Следующий Buildroot создает файл initramfs размером ровно 1,4 МБ.

BR2_x86_64=y
BR2_x86_corei7=y
BR2_STATIC_LIBS=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
BR2_TOOLCHAIN_EXTERNAL_URL="https://toolchains.bootlin.com/downloads/releases/toolchains/x86-64-core-i7/tarballs/x86-64-core-i7--uclibc--stable-2018.11-1.tar.bz2"
BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_1=y
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
BR2_PACKAGE_KEXEC=y
BR2_PACKAGE_KEXEC_ZLIB=y
BR2_TARGET_ROOTFS_CPIO=y
# BR2_TARGET_ROOTFS_TAR is not set
person Arnout    schedule 29.10.2019
comment
Я хотел это для платформы x86_64. Когда я пытался собрать его, размер только двоичного файла kexec составлял 1,4 МБ с флагом -O2. Не могли бы вы поделиться точными флагами, которые вы используете? Я уверен, что есть способ разобрать его, так как единственная цель состоит в том, чтобы кексировать большее ядро ​​с диска, и ничего больше. (У меня осталось примерно 150 КБ свободного места) - person Insane Coder; 30.10.2019
comment
Я поместил defconfig buildroot в свой ответ. Это дает вам точные флаги. - person Arnout; 30.10.2019
comment
Но, может быть, вы не используете Buildroot (buildroot.org)? Я думал, что вы это сделали, потому что вы использовали тег buildroot. - person Arnout; 30.10.2019
comment
Я изменил конфигурацию Buildroot и остальную часть ответа, чтобы использовать x86_64 вместо ARM. Он по-прежнему 1,4 МБ, хотя сам бинарник kexec в 3 раза больше на x86_64 (x86 - безумная архитектура). Я не пробовал, но вы можете сделать его немного меньше, создав i386 вместо x86_64 - обратите внимание, что для этого вам также нужно использовать набор инструментов i386. - person Arnout; 30.10.2019
comment
Да, я не использовал Buildroot, но открыт для любого решения. Я пошел на github.com/horms/kexec-tools и сделал сборку, которая дала мне 1.4 МБ только изображения kexec, что слишком много. Ваше решение buildroot кажется многообещающим, но я не был уверен в использовании приведенной выше конфигурации в контексте buildroot, поскольку я впервые пользуюсь buildroot. Я создал файл .config в корне buildroot и поверх него сделал menuconfig и сохранил, а затем сделал make. У меня есть файл rootfs.cpio размером 1,2 МБ, размер которого приемлем. Я проверю это и обновлю результаты. Спасибо. - person Insane Coder; 31.10.2019