Linux kernel 有没有办法将kexec功能添加到busybox initrd?

Linux kernel 有没有办法将kexec功能添加到busybox initrd?,linux-kernel,embedded-linux,buildroot,initrd,initramfs,Linux Kernel,Embedded Linux,Buildroot,Initrd,Initramfs,我的主板上有3MB的SPI闪存,我可以将bzImage、busybox initrd和coreboot ROM打包到这个SPI闪存中。我还能够引导到shell,所有这些都使用ROM内核作为引导加载程序 我在USB设备上有更大的内核。我还能够检测USB并安装它。但问题是busybox似乎没有kexec实用程序。我无法使用任何其他initrd包,因为由于内存限制,我的cpio(未压缩)大小不应超过1.4 MB。有kexec支持,但最小图像大小很容易达到3MB,或者至少,我找不到一种方法来构建小于该大

我的主板上有3MB的SPI闪存,我可以将bzImage、busybox initrd和coreboot ROM打包到这个SPI闪存中。我还能够引导到shell,所有这些都使用ROM内核作为引导加载程序

我在USB设备上有更大的内核。我还能够检测USB并安装它。但问题是busybox似乎没有kexec实用程序。我无法使用任何其他initrd包,因为由于内存限制,我的cpio(未压缩)大小不应超过1.4 MB。有kexec支持,但最小图像大小很容易达到3MB,或者至少,我找不到一种方法来构建小于该大小的图像

因此,有没有一种方法可以将kexec支持添加到busybox(编译静态二进制文件并复制到initrd?)或任何其他initrd包中,以满足1.4MB大小的需要

编辑


表明busybox中可能有kexec支持,但我找不到任何痕迹。事实上,对busybox的测试是十多年前完成的。但是当我在busybox中执行grep时,我没有看到它的踪迹。

来自kexec工具的kexec二进制文件大约需要300KB(x86_64,带-Os)。即使它被添加到busybox中,它也不会比这个小很多,因为它确实需要做相当复杂的事情,而这些事情在busybox中其他任何地方都做不到

如果您甚至没有300KB的空间,那么您可能应该删除busybox本身的配置选项以节省空间。使用uClibc,您还可以删除一些不需要的选项,如wchar和线程。确保使用静态链接,这样可以节省一点空间

下面的defconfig生成的initramfs正好为1.4MB

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

kexec工具中的kexec二进制文件大约需要300KB(x86_64,带-Os)。即使它被添加到busybox中,它也不会比这个小很多,因为它确实需要做相当复杂的事情,而这些事情在busybox中其他任何地方都做不到

如果您甚至没有300KB的空间,那么您可能应该删除busybox本身的配置选项以节省空间。使用uClibc,您还可以删除一些不需要的选项,如wchar和线程。确保使用静态链接,这样可以节省一点空间

下面的defconfig生成的initramfs正好为1.4MB

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

我希望它用于x86_64平台。当我尝试构建它时,kexec二进制文件的大小是1.4MB,带有-O2标志。你能分享你使用的确切标志吗?我确信有一种方法可以将其剥离,因为唯一的目标是从磁盘上kexec更大的内核,而不是别的。(我确实还有大约150KB的空间)我在答案中添加了buildroot defconfig。这提供了确切的标志,但也许您没有使用Buildroot()?我以为你这么做是因为你使用了buildroot标记。我更改了buildroot配置,并将答案的其余部分改为使用x86_64而不是ARM。它仍然是1.4MB,尽管在x86_64上,kexec二进制本身要大3倍(x86是一个疯狂的体系结构)。我还没有尝试过,但是你可以通过构建i386而不是x86_64来稍微缩小它-注意,你也需要使用i386工具链来实现这一点。是的,我没有使用Buildroot,但可以接受任何解决方案。我去做了一个构建,只给了我1.4MB的kexec图像,太大了。您的buildroot解决方案似乎很有希望,但我不确定是否在buildroot上下文中使用上述配置,因为我是第一次使用buildroot。我在buildroot的根目录中创建了一个.config文件,并在其上进行了menuconfig、保存和make。我有一个1.2MB rootfs.cpio,大小可以接受。我将测试它并更新结果。谢谢。我想要它用于x86_64平台。当我尝试构建它时,kexec二进制文件的大小是1.4MB,带有-O2标志。你能分享你使用的确切标志吗?我确信有一种方法可以将其剥离,因为唯一的目标是从磁盘上kexec更大的内核,而不是别的。(我确实还有大约150KB的空间)我在答案中添加了buildroot defconfig。这提供了确切的标志,但也许您没有使用Buildroot()?我以为你这么做是因为你使用了buildroot标记。我更改了buildroot配置,并将答案的其余部分改为使用x86_64而不是ARM。它仍然是1.4MB,尽管在x86_64上,kexec二进制本身要大3倍(x86是一个疯狂的体系结构)。我还没有尝试过,但是你可以通过构建i386而不是x86_64来稍微缩小它-注意,你也需要使用i386工具链来实现这一点。是的,我没有使用Buildroot,但可以接受任何解决方案。我去做了一个构建,只给了我1.4MB的kexec图像,太大了。您的buildroot解决方案似乎很有希望,但我不确定是否在buildroot上下文中使用上述配置,因为我是第一次使用buildroot。我在buildroot的根目录中创建了一个.config文件,并在其上进行了menuconfig、保存和make。我有一个1.2MB rootfs.cpio,大小可以接受。我将测试它并更新结果。谢谢