交叉编译与 QEMU 启动最小 Linux:一个“32 位内核跑 64 位程序“的启动陷阱(srvC)
交叉编译与 QEMU 启动最小 Linux一个32 位内核跑 64 位程序的启动陷阱srvC本篇基于 srvCphase5真实实操是整个系列里最值得收藏的一篇。我们交叉编译 BusyBox 与内核、制作 initramfs 根文件系统、用 QEMU 把 ARM 和 x86 的最小 Linux 都跑了起来但 x86 启动一路报error -2→error -8排查过程把initramfs 启动失败的几乎所有经典坑都踩了一遍。1. 目标与链路一条完整的在 QEMU 里跑起 Linux链路是BusyBox(根文件系统_app) Linux内核 根文件系统(initramfs) QEMU(机器模拟)ARM 侧交叉编译静态 ARM BusyBox → 编译multi_v7_defconfig内核 →vexpress-a15板型 QEMU 启动x86 侧用宿主机静态 x86_64 BusyBox → 编译tinyconfig内核 →qemu-system-x86_64启动2. ARM 链路一次成功ARM BusyBox 交叉编译关掉会导致 glibc 2.39 不兼容的CONFIG_TC静态链接sed-is/^CONFIG_TCy/# CONFIG_TC is not set/.configmakeCROSS_COMPILEarm-linux-gnueabihf--j8# 产出约 1.5M 的静态 ARM busybox可在 qemu-arm-static 下直接运行内核与设备树makeARCHarm multi_v7_defconfigmakeARCHarmCROSS_COMPILEarm-linux-gnueabihf--j8zImage# 同时得到 arch/arm/boot/dts/arm/vexpress-v2p-ca15_a7.dtbQEMU 启动vexpress-a15qemu-system-arm-Mvexpress-a15-cpucortex-a15-m512M\-kernellinux-6.6.151/arch/arm/boot/zImage\-dtbvexpress-v2p-ca15_a7.dtb\-initrdrootfs-arm.cpio.gz-appendconsolettyAMA0 rdinit/init-nographic启动后/init跑演示脚本打印进程列表并干净关机71 0 0:00 ps 演示命令执行完毕, 系统即将关机... [ 2.522735] reboot: Power downARM 侧multi_v7_defconfig默认开了BINFMT_ELF/BINFMT_SCRIPT所以脚本化的/init直接就能跑。3. x86 链路第一道坎error -2x86 侧用宿主机的静态 busybox 做根文件系统qemu-system-x86_64一启动却卡在 initRun /init as init process Failed to execute /init (error -2) Run /sbin/init as init process Starting init: /sbin/init exists but couldnt execute it (error -40) Run /etc/init as init process Run /bin/init as init process Run /bin/sh as init process Kernel panic - not syncing: No working init found. Try passing init option to kernel.error -2是ENOENT文件/解释器找不到。第一直觉是initramfs 里的软链接指错了路径。BusyBox 的busybox --install -s会在bin/、sbin/下生成大量指向 busybox 的软链接如果目标写成绝对宿主机路径如/root/lab/phase5/rootfs-x86/bin/busybox在内存根文件系统里当然找不到。抽取 cpio 检查真实目标确认确实不对修正为相对目标# bin/* 指向同目录兄弟 busyboxsbin/* 指向 ../bin/busyboxforlinbin/*;do[-L$l]ln-sfbusybox$l;doneforlinsbin/*;do[-L$l]ln-sf../bin/busybox$l;done修正后bin/sh - busybox、sbin/init - ../bin/busybox都在重打 cpio 再启动——还是失败只是报错从-2变成了-8。4. 第二道坎error -8内核没开二进制加载器-8是ENOEXEC执行格式错误。抽内核配置一看问题在tinyconfig默认把二进制加载器都关了$grep-EBINFMT_ELF|BINFMT_SCRIPTlinux-src/.config CONFIG_BINFMT_ELF# CONFIG_BINFMT_ELF is not setCONFIG_BINFMT_SCRIPT# CONFIG_BINFMT_SCRIPT is not set内核根本不认识 ELF 和#!脚本自然跑不了 busybox也跑不了/init脚本。打开它们并重建./scripts/config--enableCONFIG_BINFMT_ELF ./scripts/config--enableCONFIG_BINFMT_SCRIPTmakeolddefconfigmake-j$(nproc)bzImage再启动报错仍-8。说明还有更深的根因。5. 终极根因32 位内核 vs 64 位 BusyBox继续抽配置决定性的一条出现了$grep-ECONFIG_X86_32|CONFIG_64BITlinux-src/.configCONFIG_X86_32y# ← 内核被编成了 32 位而根文件系统里的 busybox 是64 位 ELFx86-64。一个 32 位内核去exec一个 64 位程序正是ENOEXEC——它压根不认这个格式。宿主机的chroot测试能跑主机是 64 位内核更反证了这一点$chroot/tmp/inspect_x86 /bin/sh-cecho CHROOT_OKCHROOT_OK修复把内核翻回 64 位重建 bzImagemakeclean ./scripts/config--disableCONFIG_X86_32 ./scripts/config--enableCONFIG_64BIT# 同时保留 ELF/SCRIPT/INITRD/DEVTMPFS_MOUNTmakeolddefconfigmake-j$(nproc)bzImage6. 终见曙光qemu-system-x86_64-m512M-kernellinux-src/arch/x86/boot/bzImage\-initrdrootfs-x86.cpio.gz-appendconsolettyS0 rdinit/init-nographic--- 当前进程 --- PID USER COMMAND 1 0 {init} /bin/sh /init ← /init 脚本作为 1 号进程运行 25 0 {ps} /bin/sh /init 演示命令执行完毕, 系统即将关机... reboot: System haltedx86 的最小 Linux 终于干净启动并关机。7. 排错决策树收藏initramfs 启动失败按错误码顺藤摸瓜错误码含义优先排查error -2(ENOENT)文件/解释器找不到/init软链接目标、#!解释器在 initramfs 内是否存在error -8(ENOEXEC)执行格式错误内核是否开CONFIG_BINFMT_ELF/BINFMT_SCRIPT内核位数与根文件系统里 ELF 的位数是否匹配32-bit 内核 ≠ 64-bit 程序一句话先查软链接再查BINFMT_*最后一定核对内核架构和根文件系统里程序的架构是否一致。8. 小结ARM 用multi_v7_defconfig默认配置即开箱可用x86 用tinyconfig需手动补BINFMT_ELF/SCRIPT并确认是 64 位内核initramfs 的软链接必须是相对路径、且指向 initramfs 内部存在的文件“32 位内核跑 64 位 busybox” 这种架构错配表现就是顽固的ENOEXEC靠chroot对比即可快速定位。下一篇进 srvD自己写内核模块、字符设备与 platform 总线驱动。

相关新闻

信号上升边与系统带宽

信号上升边与系统带宽

摘要:电磁干扰无处不在,每个设计人员又必须面对。为了有效抑制,通常要从解决信号完整性问题入手。本内容摘录自《信号完整性与电源完整性分析》,从时域由浅入深的过渡到频域,并从此角度阐述了信号上升边与系统带宽的内…

2026/10/14 6:39:15 阅读更多 →
如何在5分钟内上手steampy:从安装到发送第一个交易报价

如何在5分钟内上手steampy:从安装到发送第一个交易报价

如何在5分钟内上手steampy:从安装到发送第一个交易报价 【免费下载链接】steampy A Steam trading library for python 3 项目地址: https://gitcode.com/gh_mirrors/st/steampy steampy是一个强大的Python Steam交易自动化库,能帮助开发者轻松实…

2026/10/14 6:39:33 阅读更多 →
零基础入门OneDiffusion:3分钟上手文本生成图像(Text-to-Image)全流程

零基础入门OneDiffusion:3分钟上手文本生成图像(Text-to-Image)全流程

零基础入门OneDiffusion:3分钟上手文本生成图像(Text-to-Image)全流程 【免费下载链接】OneDiffusion Official implementation of OneDiffusion paper (CVPR 2025) 项目地址: https://gitcode.com/gh_mirrors/one/OneDiffusion OneDi…

2026/10/8 22:14:34 阅读更多 →

最新新闻

纯Python实现猜数字游戏:从零到避坑的完整指南

纯Python实现猜数字游戏:从零到避坑的完整指南

猜数字游戏大概是很多人的第一个编程项目。它不像计算器那样枯燥,也不需要复杂的界面,但一套完整流程走下来,变量、输入输出、条件判断、循环、异常处理这些编程入门核心概念全部能练到。我最近又把这个小项目从头写了一遍,用最基…

2026/10/14 6:39:29 阅读更多 →
Vibe Coding工具链选型四步框架:效率提升27%与成本控制24倍

Vibe Coding工具链选型四步框架:效率提升27%与成本控制24倍

1. 效率提升27%背后的真实账本先把结论摆出来:同样一个中等复杂度的业务模块,用对工具链和用错工具链,交付效率差距能拉到27%左右,而综合成本差距可以到24倍。这个数字不是拍脑袋来的,是我在三个不同类型的项目里反复测…

2026/10/14 6:39:29 阅读更多 →
两个模型同价,真正拉开成本的是那个默认值

两个模型同价,真正拉开成本的是那个默认值

📋 目录 一、两个模型,一个价二、纠错一:跑量模型不等于更便宜三、纠错二:贵的是 quality,而且它默认不贵四、逐档成本表,和一个反直觉的发现五、纠错三:分辨率不是按像素收费六、参考图才是隐…

2026/10/14 6:39:29 阅读更多 →
Vibe Coding工具选型与四步实施框架:效率提升27%与成本差24倍背后的工程实践

Vibe Coding工具选型与四步实施框架:效率提升27%与成本差24倍背后的工程实践

1. 效率数字背后的真实账本先把标题里两个数字拆开看。效率提升27%这个量级,放在任何研发团队里都算得上可观,但它不是凭空冒出来的——它通常来自编码环节中重复劳动被压缩、上下文切换次数减少、以及试错周期缩短这三块的叠加。而成本差24倍这个说法&a…

2026/10/14 6:39:29 阅读更多 →
新手入门3D视觉(一)WSL2+Ubuntu22.04+PCL环境配置

新手入门3D视觉(一)WSL2+Ubuntu22.04+PCL环境配置

「零基础转行工业 3D 视觉」系列第一篇。 本文记录我用 WorkBuddy 把第 1 周环境搭起来的完整过程:3 个步骤,手动敲的命令不超过 3 条。 全程用到的 3 个脚本放在文末附件里,可以直接下载复用。开始之前:一条最重要的提醒不要装 V…

2026/10/14 6:39:29 阅读更多 →
深度学习损失函数选型实战:从MSE到Focal Loss的原理与踩坑

深度学习损失函数选型实战:从MSE到Focal Loss的原理与踩坑

损失函数这玩意儿,说起来是深度学习里最基础的组件之一,但恰恰是很多同学在实战里翻车最频繁的地方。我带项目的时候经常看到有人模型结构抄得挺像样,学习率调度也配了一堆,可训练出来的结果就是不对,Loss 曲线跟心电图…

2026/10/14 6:38:29 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →