【问题标题】:Is there a way to add kexec functionality to busybox initrd?有没有办法将 kexec 功能添加到busybox initrd?
【发布时间】:2019-10-29 14:35:22
【问题描述】:

我的板上有 3 MB 的 SPI 闪存,我可以将 bzImage、busybox initrd 和 coreboot ROM 打包到这个 SPI 闪存中。我还可以启动到 shell,全部使用 ROM kernel-as-bootloader。

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

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

编辑

This post 表明busybox 中可能有kexec 支持,但我找不到任何痕迹。事实上,busybox 的request to add kexec-tools 是十多年前完成的。但是当我在busybox中执行grep时,我没有看到它的痕迹。

【问题讨论】:

    标签: linux-kernel embedded-linux buildroot initrd initramfs


    【解决方案1】:

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

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

    以下Buildroot defconfig 会生成一个正好为 1.4MB 的 initramfs。

    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 更大的内核,仅此而已。 (我确实还有大约 150 KB 的空间)
    • 我将 buildroot defconfig 放入我的答案中。这为您提供了确切的标志。
    • 但也许您没有使用 Buildroot (buildroot.org)?我以为你这样做了,因为你使用了 buildroot 标签。
    • 我将 Buildroot 配置和其余答案更改为使用 x86_64 而不是 ARM。它仍然是 1.4MB,尽管 kexec 二进制文件本身在 x86_64 上大了 3 倍(x86 是一个疯狂的架构)。我还没有尝试过,但是您可以通过构建 i386 而不是 x86_64 来使其稍微小一些 - 请注意,您也需要为此使用 i386 工具链。
    • 是的,我没有使用 Buildroot,但对任何解决方案都持开放态度。我去了github.com/horms/kexec-tools 并做了一个构建,它只给了我 1.4 MB 的 kexec 图像,这太大了。您的 buildroot 解决方案似乎很有希望,但我不确定是否在 buildroot 上下文中使用上述配置,因为我是第一次使用 buildroot 用户。我在 buildroot 的根目录中创建了一个 .config 文件,并在其上进行了 menuconfig 并保存然后进行了制作。我有一个大小可以接受的 1.2 MB rootfs.cpio。我将对其进行测试并更新结果。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多