技术知识库
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:模拟整台机器,运行自己编译的内核和虚拟设备;用于最终启动验证。