今回は、QEMU で Arm の組み込み Linux を動かしていきたいと思います。
これまで、STM32 を動かしていたのは、本家の QEMU ではなく、xPackプロジェクトの QEMU Arm でした。
今回は、Linux なので、本家の QEMU をインストールして、開発環境の構築と、簡単なものを動かしてみたいと思います。
それでは、やっていきます。
はじめに
「QEMUを動かす」の記事一覧です。良かったら参考にしてください。
・第2回:STM32(ARM Cortex-M)をQEMUで動かす(ソースコード確認編)
・第3回:STM32(ARM Cortex-M)をQEMUで動かす(スタートアップルーチン編)
・第4回:STM32(ARM Cortex-M)をQEMUで動かす(リンカスクリプト編)
・第5回:STM32(ARM Cortex-M)のELFファイルの内容を確認する
・第6回:STM32(ARM Cortex-M)のELFファイル⇔バイナリの変換を行う
・第7回:STM32(ARM Cortex-M)のバイナリから構築したELFファイルをQEMUで動かす
・第8回:QEMUのビルドに必要なxpm(xPack Project Manager)について学ぶ
・第9回:QEMUをソースからビルドして動かす
・第10回:QEMUのソースコードを変更してSTM32の動作を変える
・第11回:QEMUに似たRenodeというOSSの組込みデバイスエミュレータを試す
・第12回:QEMUに似たRenodeでSTM32をGDBを使ってデバッグする
・第13回:QEMUに似たRenodeでSTM32をバイナリファイルで動かす
・第14回:QEMUに似たRenodeをソースからビルドする
・第15回:QEMUに似たRenodeでVSCodeを使ってデバッグする
・第16回:QEMUに似たRenodeでVSCodeを使ってRenode自体をデバッグする
・第17回:QEMUで組み込みLinux(Buildroot+BusyBox)をやってみる ← 今回
まず、QEMU のインストールからやっていきます。
環境は、VirtualBox の Ubuntu 22.04 です。
QEMU のインストール
本家 QEMU のサイトです。
DOWNLOAD に進みます。

Linux を選択すると、Ubuntu 用のインストール方法が書かれているので従います。
qemu-system が QEMU の本体です。
qemu-user-static は、ユーザモードの QEMU で、Arm のバイナリ(クロスコンパイルした Arm のプログラム、HelloWorld とか)を単体で動かすことが出来るというものです。今回は使わないですが、一応入れておきます。

$ sudo apt-get install qemu-system $ sudo apt-get install qemu-user-static
無事にインストールできました。
試しに、qemu と入力して、タブを押してみると、いっぱい出ました。
$ qemu- qemu-aarch64-static qemu-mipsel-static qemu-system-aarch64 qemu-system-ppc64le qemu-aarch64_be-static qemu-mipsn32-static qemu-system-alpha qemu-system-riscv32 qemu-alpha-static qemu-mipsn32el-static qemu-system-arm qemu-system-riscv64 qemu-arm-static qemu-nbd qemu-system-avr qemu-system-rx qemu-armeb-static qemu-nios2-static qemu-system-cris qemu-system-s390x qemu-cris-static qemu-or1k-static qemu-system-gnuarmeclipse qemu-system-sh4 qemu-debootstrap qemu-ppc-static qemu-system-hppa qemu-system-sh4eb qemu-hexagon-static qemu-ppc64-static qemu-system-i386 qemu-system-sparc qemu-hppa-static qemu-ppc64le-static qemu-system-m68k qemu-system-sparc64 qemu-i386-static qemu-pr-helper qemu-system-microblaze qemu-system-tricore qemu-img qemu-riscv32-static qemu-system-microblazeel qemu-system-x86_64 qemu-io qemu-riscv64-static qemu-system-mips qemu-system-x86_64-microvm qemu-m68k-static qemu-s390x-static qemu-system-mips64 qemu-system-x86_64-spice qemu-make-debian-root qemu-sh4-static qemu-system-mips64el qemu-system-xtensa qemu-microblaze-static qemu-sh4eb-static qemu-system-mipsel qemu-system-xtensaeb qemu-microblazeel-static qemu-sparc-static qemu-system-nios2 qemu-x86_64-static qemu-mips-static qemu-sparc32plus-static qemu-system-or1k qemu-xtensa-static qemu-mips64-static qemu-sparc64-static qemu-system-ppc qemu-xtensaeb-static qemu-mips64el-static qemu-storage-daemon qemu-system-ppc64
今回のターゲットは、qemu-system-arm なので、バージョンを調べます。
$ qemu-system-arm -version xPack QEMU emulator version 8.2.2 (v8.2.2-xpack) Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers
v8.2.2 でした。これでインストールは完了です。
QEMUで組み込みLinuxを下調べする
本家 QEMU のドキュメントページです。
対応してる machine を調べてみます。たくさん出ますが、興味があるものだけ貼っておきます。
$ qemu-system-arm -machine help Supported machines are: mcimx6ul-evk Freescale i.MX6UL Evaluation Kit (Cortex-A7) mcimx7d-sabre Freescale i.MX7 DUAL SABRE (Cortex-A7) raspi0 Raspberry Pi Zero (revision 1.2) raspi1ap Raspberry Pi A+ (revision 1.1) raspi2b Raspberry Pi 2B (revision 1.1) vexpress-a15 ARM Versatile Express for Cortex-A15 vexpress-a9 ARM Versatile Express for Cortex-A9 virt QEMU 8.2 ARM Virtual Machine (alias of virt-8.2) virt-8.2 QEMU 8.2 ARM Virtual Machine
ここからどう進めようかと、いろいろ検索して探してみると、はてなブログの方で、BuildRoot と BusyBox で、QEMU を起動されてる方がいたので、こちらを参考にさせて頂きます。
では、今回は、vexpress-a9 をターゲットにしたいと思います。
QEMU のドキュメントの vexpress-a9 のページのリンクも貼っておきます。
ChatGPT の vexpress-a9 の解説です。
vexpress-a9 は、ARM社が提供する Versatile Express(V2P-CA9)開発ボードの一つで、Cortex-A9 プロセッサを搭載しています。このボードは、SoC(System on Chip)の設計やソフトウェア開発、システム検証などのためのプラットフォームとして広く使用されています。
Buildrootのダウンロードとビルドと起動
Buildroot の公式サイトです。
Buildrootのドキュメント
上のメニューの Document は、Buildroot のドキュメントページです。少し見てみます。
- Buildroot とは、クロスコンパイルを使用して組み込みシステム用の完全な Linux システムを構築するプロセスを簡素化、および、自動化するツール
- root ではなく、通常のユーザで実行すべき
- make の並列実行はサポートしていないので、j オプションは不要(実験的なサポートあり)
- Buildroot の出力は、単一のディレクトリ output に保存される
Buildrootのダウンロード
ダウンロードページに進みます。

あまり分かってませんが、安全そうな long term support の tar.gz にしようと思います。
$ wget https://buildroot.org/downloads/buildroot-2024.02.3.tar.gz $ wget https://buildroot.org/downloads/buildroot-2024.02.3.tar.gz.sign $ sha256sum buildroot-2024.02.3.tar.gz ece7844cb9485422705c2b7f3dc07521fd2fbd1a612e835d204b200234103ca3 buildroot-2024.02.3.tar.gz $ cat buildroot-2024.02.3.tar.gz.sign SHA256: ece7844cb9485422705c2b7f3dc07521fd2fbd1a612e835d204b200234103ca3 buildroot-2024.02.3.tar.gz $ tar zxvf buildroot-2024.02.3.tar.gz $ cd buildroot-2024.02.3/ $ find . -name '*vexpress*' ./configs/qemu_arm_vexpress_tz_defconfig ./configs/qemu_arm_vexpress_defconfig ./board/qemu/arm-vexpress ./board/qemu/arm-vexpress-tz ./boot/vexpress-firmware ./boot/vexpress-firmware/vexpress-firmware.mk ./boot/vexpress-firmware/vexpress-firmware.hash
Buildrootのビルド
Arm Linux 用のクロスコンパイラをインストールするのを忘れてました。
$ sudo apt install gcc-arm-linux-gnueabi
まず、.config を作ります。検索で見つかった qemu_arm_vexpress_defconfig を使います。
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- qemu_arm_vexpress_defconfig
ログを見たところ、"/usr/bin/gcc" が使われていたので、ARCH と CROSS_COMPILE の環境変数の設定はいらなかったようです。
今回は最小構成にしようと思うので、早速カーネルをビルドします。
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
だいぶかかりました。約1時間ぐらいでしょうか。
Buildrootの起動
QEMU の場合は、起動するためのスクリプト「output/images/start-qemu.sh」が作られています。
これを実行するだけで起動できるのか試してみます。
$ output/images/start-qemu.sh VNC server running on 127.0.0.1:5900 Booting Linux on physical CPU 0x0 Linux version 6.1.44 (daisuke@daisuke-VirtualBox) (arm-buildroot-linux-gnueabihf-gcc.br_real (Buildroot 2024.02.3) 12.3.0, GNU ld (GNU Binutils) 2.40) #1 SMP Tue Jun 18 23:14:53 JST 2024 CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache OF: fdt: Machine model: V2P-CA9 Memory policy: Data cache writeback Reserved memory: created DMA memory pool at 0x4c000000, size 8 MiB OF: reserved mem: initialized node vram@4c000000, compatible id shared-dma-pool cma: Reserved 16 MiB at 0x6f000000 Zone ranges: Normal [mem 0x0000000060000000-0x000000006fffffff] Movable zone start for each node Early memory node ranges node 0: [mem 0x0000000060000000-0x000000006fffffff] Initmem setup node 0 [mem 0x0000000060000000-0x000000006fffffff] (省略) Welcome to Buildroot buildroot login:
無事に起動しました。
ユーザは root で、パスワード無しでログインできます。
# which ls /bin/ls # ls -alF /bin/ls lrwxrwxrwx 1 root root 7 Jun 18 13:59 /bin/ls -> busybox*
デフォルトで、BusyBox が使われているようです。
BusyBox の場合、shutdown コマンドではなく、poweroff コマンドで終了します。
# poweroff # Stopping network: OK Stopping klogd: OK Stopping syslogd: OK Seeding 256 bits and crediting Saving 256 bits of creditable seed for next boot umount: devtmpfs busy - remounted read-only EXT4-fs (mmcblk0): re-mounted. Quota mode: disabled. The system is going down NOW! Sent SIGTERM to all processes Sent SIGKILL to all processes Requesting system poweroff Flash device refused suspend due to active operation (state 20) Flash device refused suspend due to active operation (state 20) reboot: Power down
終了すると、起動したコンソールに制御が戻ってきます。
今回はここまでにします。
おわりに
今回は、簡単な手順で、QEMU の組み込み Linux を起動するところまでやってみました。
Buildroot のロゴは、黄色いヘルメットのようです。ありがたくアイキャッチ画像に使わせて頂きました。
次回は、u-boot の組み込みなど、やってみたいと思います。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。