我有3MB的SPI闪存在我的板上,我可以将bzImage,busybox,initrd和coreboot ROM打包到这个SPI闪存中。我也能够引导到shell,所有使用ROM内核作为引导加载程序.
我在USB设备上有更大的内核。我也能够检测到USB和挂载它。但问题是,busybox似乎没有kexec实用程序。我不能使用任何其他initrd包,因为由于内存限制,我的cpio (未压缩的)大小不应该超过1.4MB。U根支持kexec,但是最小的映像大小很容易达到3MB,或者至少我无法找到一种方法来构建小于该大小的图像。
因此,是否有方法将kexec支持添加到busybox (编译静态二进制文件并将其复制到initrd )?或者任何其他可以满足1.4MB大小需要的initrd包?
编辑
这个职位建议在busybox中可能有kexec支持,但是我找不到它的任何踪迹。事实上,请求添加kexec-工具 to busybox是十多年前完成的。但是当我在垃圾箱里做grep的时候,我没有看到任何痕迹。
发布于 2019-10-29 20:06:20
来自kexec工具的kexec二进制文件大约需要300-Os (x86_64和-Os)。即使将其添加到busybox中,它也不会变得更小,因为它确实需要做一些非常复杂的事情,而这些事情在busybox中其他地方都没有完成。
如果您甚至没有剩下300 to,那么您可能应该从busybox中删除配置选项,以节省空间。使用uClibc,您还可以删除一些不需要的选项,如wchar和线程。确保您使用静态链接,这样可以节省一点空间。
下面的建筑工配置生成一个精确的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发布于 2022-08-16 14:43:08
我们可以为kexec构建一个busybox版本,生成一个220 K静态链接二进制,如下所示:
muslstrip去除二进制文件(也许它可以进一步减小二进制文件的大小?)./configure --without-<FEATURE>禁用未使用的功能KEXEC_VERSION=2.0.24
KEXEC=kexec-tools-$KEXEC_VERSION
curl -LO https://mirrors.edge.kernel.org/pub/linux/utils/kernel/kexec/$KEXEC.tar.xz
tar xf $KEXEC.tar.xz
cd $KEXEC
CC=musl-gcc LDFLAGS=-static ./configure \
--without-lzma \
--without-xen \
--sbindir=/bin
make
strip build/sbin/kexec
file buils/sbin/kexec # -> [...] statically linked, stripped
du -h build/sbin/kexec # -> 220K [...]还是不太好但是是的..。让我们知道,如果你能缩小它更多:)
https://stackoverflow.com/questions/58609597
复制相似问题