技术知识库

binfmt_misc 与 QEMU user-mode 如何支持跨架构 chroot

binfmt_misc 与 QEMU user-mode 如何支持跨架构 chroot

摘要

chroot 只改变进程看到的根目录,不模拟 CPU,也不会把 x86_64 变成 ARM64。binfmt_misc 可以按 ELF 特征把 ARM64 可执行文件交给 qemu-aarch64;QEMU user-mode 翻译用户态指令并把系统调用转交主机内核,从而让 ARM64 Debian 程序在 x86_64 主机上完成配置。

三个组件各自负责什么

chroot
└── 改变路径视图:/ 指向目标 rootfs

binfmt_misc
└── 识别 ELF 架构并选择解释器

qemu-aarch64
└── 翻译 ARM64 用户态指令,转发系统调用

因此“能够 chroot 进去”并不是挂载了一个完整虚拟机,也没有启动目标 Linux 内核。此时仍使用主机内核,只是执行目标架构用户程序。

执行链

chroot ... /bin/bash
        ↓
主机内核识别 ARM64 ELF
        ↓ binfmt_misc
/usr/bin/qemu-aarch64
        ↓ 指令翻译
ARM64 bash 运行,系统调用由主机 Linux 内核处理

/proc、/sys、/dev 和 /run 需要临时挂入目标目录,包安装脚本才能看到必要的内核接口和设备。制作镜像前必须卸载这些主机挂载,避免把运行时挂载误当成 rootfs 普通内容。

与 QEMU system-mode 的区别

  • QEMU user-mode:只运行异构用户程序,使用主机内核;适合 debootstrap second stage 和 chroot 配置。
  • QEMU system-mode:模拟整台机器,运行自己编译的内核和虚拟设备;用于最终启动验证。

关联