如何将vmlinux.elf重新打包为bzimage及生成VGA Normal模式镜像
针对IoT设备Linux内核bzImage修改与打包问题的解决方案
问题1:将修改后的vmlinux.elf重新打包为bzImage
核心思路是利用同版本内核源码的构建环境,匹配原始镜像的编译配置,步骤如下:
- 下载与原始
bzimage_origin版本完全一致的Linux内核源码(需包含对应patch级别) - 从原始镜像提取内核配置:
./scripts/extract-ikconfig bzimage_origin > .config - 初始化编译配置:
make olddefconfig - 生成编译依赖与工具:
make prepare make scripts - 将修改后的
vmlinux.elf_patched替换内核源码根目录下的vmlinux文件 - 执行打包命令生成目标bzImage:
生成的文件位于make bzImagearch/[对应架构]/boot/bzImage(x86架构为arch/x86/boot/bzImage)
问题2:用recreate-zImage生成VGA Normal模式的bzImage
针对打包后视频模式变为"Prompt for Videomode"的问题,需强制锁定VGA配置,避免脚本自动覆盖:
方案1:修改脚本与内核配置
- 找到
recreate-zimage.sh中自动生成/覆盖.config的代码段(通常是调用make defconfig或make menuconfig的部分),注释该逻辑,改用从原始bzimage_origin提取的.config - 手动修改提取的
.config,添加以下配置项:
其中CONFIG_DEFAULT_VGA=y CONFIG_VGA_CONSOLE=y CONFIG_VIDEO_OUTPUT_CONTROL=yCONFIG_DEFAULT_VGA=y是强制启用Normal VGA模式的关键 - 在脚本末尾添加配置锁定逻辑,防止被重置:
echo "CONFIG_DEFAULT_VGA=y" >> .config
方案2:强制指定启动参数
如果脚本修改受限,可直接在打包后的镜像中添加启动参数:
- 在内核镜像的启动参数段中加入
vga=normal,强制内核使用Normal VGA模式 - 或在
rebuild_kernel.sh中修改传递给内核的启动参数,固定追加vga=normal
复现场景下的修正步骤
在Ubuntu 18.04环境复现问题后,额外执行:
- 用
extract-ikconfig从原始bzimage_origin提取.config,替换脚本默认使用的配置文件 - 在
.config中设置CONFIG_DEFAULT_VGA=y - 修改
rebuild_kernel.sh,在配置生成步骤后添加echo "CONFIG_DEFAULT_VGA=y" >> .config - 重新执行
rebuild_kernel.sh
内容的提问来源于stack exchange,提问作者kiritsugu2023
相关产品推荐
相关产品推荐

