Skip to content

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:

qemu-aarch64-static -L /usr/aarch64-linux-gnu ./hello

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:

sudo cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/
sudo chroot rootfs /bin/bash

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):

docker run --privileged --rm tonistiigi/binfmt --install all

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.

Tham khảo