土日の勉強ノート

AI、機械学習、最適化、Pythonなどについて、技術調査、技術書の理解した内容、ソフトウェア/ツール作成について書いていきます

QEMUで組み込みLinux(Buildroot+BusyBox)をやってみる

今回は、QEMU で Arm の組み込み Linux を動かしていきたいと思います。

これまで、STM32 を動かしていたのは、本家の QEMU ではなく、xPackプロジェクトの QEMU Arm でした。

今回は、Linux なので、本家の QEMU をインストールして、開発環境の構築と、簡単なものを動かしてみたいと思います。

それでは、やっていきます。

はじめに

「QEMUを動かす」の記事一覧です。良かったら参考にしてください。

QEMUを動かすの記事一覧

まず、QEMU のインストールからやっていきます。

環境は、VirtualBox の Ubuntu 22.04 です。

QEMU のインストール

本家 QEMU のサイトです。

www.qemu.org

DOWNLOAD に進みます。

QEMUのトップページ
QEMUのトップページ

Linux を選択すると、Ubuntu 用のインストール方法が書かれているので従います。

qemu-system が QEMU の本体です。

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

DOWNLOADページ
DOWNLOADページ

$ 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 のドキュメントページです。

www.qemu.org

対応してる 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 を起動されてる方がいたので、こちらを参考にさせて頂きます。

leavatail.hatenablog.com

では、今回は、vexpress-a9 をターゲットにしたいと思います。

QEMU のドキュメントの vexpress-a9 のページのリンクも貼っておきます。

qemu-project.gitlab.io

ChatGPT の vexpress-a9 の解説です。

vexpress-a9 は、ARM社が提供する Versatile Express(V2P-CA9)開発ボードの一つで、Cortex-A9 プロセッサを搭載しています。このボードは、SoC(System on Chip)の設計やソフトウェア開発、システム検証などのためのプラットフォームとして広く使用されています。

Buildrootのダウンロードとビルドと起動

Buildroot の公式サイトです。

buildroot.org

Buildrootのドキュメント

上のメニューの Document は、Buildroot のドキュメントページです。少し見てみます。

  • Buildroot とは、クロスコンパイルを使用して組み込みシステム用の完全な Linux システムを構築するプロセスを簡素化、および、自動化するツール
  • root ではなく、通常のユーザで実行すべき
  • make の並列実行はサポートしていないので、j オプションは不要(実験的なサポートあり)
  • Buildroot の出力は、単一のディレクトリ output に保存される

Buildrootのダウンロード

ダウンロードページに進みます。

Buildrootのダウンロードページ
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 の組み込みなど、やってみたいと思います。

最後になりましたが、エンジニアグループのランキングに参加中です。

気楽にポチッとよろしくお願いいたします🙇

今回は以上です!

最後までお読みいただき、ありがとうございました。