Chạy chương trình kiến trúc khác với QEMU¶
Trên máy dev x86, chạy được binary ARM/ARM64 hoặc cả container ARM mà không cần board. Cách này là giả lập (TCG) nên chậm hơn native, xem KVM & QEMU.
QEMU user-mode¶
Chạy một chương trình khác kiến trúc, syscall được dịch sang syscall của host.
sudo apt install qemu-user-static binfmt-support
aarch64-linux-gnu-gcc hello.c -o hello # biên dịch chéo
qemu-aarch64-static ./hello # chạy trực tiếp
Binary liên kết động cần thư viện của kiến trúc đích, chỉ cho QEMU thư mục sysroot bằng -L hoặc QEMU_LD_PREFIX:
binfmt_misc: chạy trong suốt¶
binfmt_misc là cơ chế của kernel để chọn trình thông dịch dựa trên magic number của file. Đăng ký qemu-<arch>-static ở đây thì chạy ./hello ARM64 như binary thường, và chroot/container ARM64 cũng chạy được.
ls /proc/sys/fs/binfmt_misc/ # các định dạng đã đăng ký
cat /proc/sys/fs/binfmt_misc/qemu-aarch64 # chi tiết một mục
Chroot vào rootfs ARM64:
Container khác kiến trúc¶
Đăng ký binfmt qua container (cần --privileged, chạy một lần sau mỗi lần reboot):
Sau đó chạy hoặc build cho nền tảng khác:
docker run --rm --platform linux/arm64 ubuntu:22.04 uname -m # aarch64
docker buildx build --platform linux/arm64 -t myapp:arm64 --load .
docker buildx build --platform linux/amd64,linux/arm64 -t user/myapp:latest --push .
Docker Desktop đã có sẵn cơ chế này.
Khi nào dùng, khi nào không¶
| Dùng | Không dùng |
|---|---|
| Chạy thử, chạy test nhanh cho binary ARM | Đo hiệu năng (QEMU chậm hơn nhiều lần) |
| Build image ARM cho CI không có runner ARM | Build cả hệ thống lớn như Yocto/Petalinux, nên cross-compile hoặc dùng máy ARM thật |
Chroot để cài gói vào rootfs ARM (apt install trong rootfs) |
Chương trình dùng tính năng kernel đặc thù (ioctl thiết bị, ptrace phức tạp) vì user-mode chỉ dịch syscall chung |
Với phát triển kernel, driver, boot cả hệ thống thì dùng QEMU system-mode (qemu-system-aarch64 -machine virt), xem KVM & QEMU.