前回 は、QEMU で Arm の組み込み Linux(Buildroot+BusyBox+U-Boot)で、initramfs を追加しました。
これまで、今回は、initramfsを追加していきます。
それでは、やっていきます。
はじめに
「QEMUを動かす」の記事一覧です。良かったら参考にしてください。
QEMUを動かすの記事一覧
以下は、Buildroot の Documentation のリンクです。
https://buildroot.org/downloads/manual/manual.html
ここで使用する環境は、VirtualBox に入れた Ubuntu 22.04 です。
Buildroot を使います。Buildroot に含まれている U-Boot と、QEMU を使います。
これまで進めてきた各環境については以下の通りです。
ツール |
設定値 |
Buildroot |
qemu_arm_vexpress_defconfig |
U-Boot |
vexpress_ca9x4 |
QEMU |
vexpress-a9 |
これまで使ってきた vexpress とは、Arm 社の Versatile Express という開発ボードをターゲットとしたものでした。
今回からは、QEMU が仮想環境用として提供している virt という開発ボード(実際には存在しないのでプラットフォームの方が適切?)に変更します。
今後は、QEMU 環境で、ネットワークも使っていきたいので、ターゲットも仮想環境を想定したものが都合が良さそうということで、変更することにしました。
また、ARM 32bit にしようと思ったのですが、Buildroot のコンフィグを virt で検索すると、ARM 64bit しかありませんでした。アドレスが長いので少し気が進みません(笑)。
各ツールの設定値については以下のように変更になります。
ツール |
設定値 |
Buildroot |
qemu_aarch64_virt_defconfig |
U-Boot |
qemu_arm64_defconfig |
QEMU |
virt(virt-8.2) |
それでは、やっていきます。
Buildrootのビルド
Buildroot については、https://daisuke20240310.hatenablog.com/entry/buildroot で準備したものと同じもの(buildroot-2024.02.3.tar.gz)を使用します。
解凍して、defconfig を検索します。
$ tar zxvf buildroot-2024.02.3.tar.gz
$ cd buildroot-2024.02.3/
$ find . -name '*defconfig' | grep virt
./configs/qemu_riscv64_virt_efi_defconfig
./configs/qemu_riscv64_virt_defconfig
./configs/qemu_riscv64_nommu_virt_defconfig
./configs/qemu_riscv32_virt_defconfig
./configs/qemu_aarch64_virt_defconfig
冒頭で言ったように、Arm 32bit の virt 用のコンフィグがありませんでした。仕方ないので、Arm 64bit を使います。
Buildroot はクロスコンパイラを自動で準備してくれるため、環境変数の設定などが無くてもビルドできます。
また、Buildroot は並列コンパイルをサポートしていないので、-j を付けても意味がありません。
$ make qemu_aarch64_virt_defconfig
$ make 2>&1 | tee 20240713-make.log
1時間程度で完了しました。
Buildrootを起動する
早速、起動していきます。
$ cd output/images/
$ ./start-qemu.sh
Booting Linux on physical CPU 0x0000000000 [0x410fd034]
Linux version 6.1.44 (daisuke@daisuke-VirtualBox) (aarch64-buildroot-linux-gnu-gcc.br_real (Buildroot 2024.02.3) 12.3.0, GNU ld (GNU Binutils) 2.40)
random: crng init done
Machine model: linux,dummy-virt
efi: UEFI not found.
Zone ranges:
DMA [mem 0x0000000040000000-0x0000000047ffffff]
DMA32 empty
Normal empty
Movable zone start for each node
Early memory node ranges
node 0: [mem 0x0000000040000000-0x0000000047ffffff]
Initmem setup node 0 [mem 0x0000000040000000-0x0000000047ffffff]
(省略)
OK
Welcome to Buildroot
buildroot login:
無事に起動しました。
ユーザ名は root
で、パスワードはありません。シャットダウンは BusyBox の poweroff を使います。
buildroot login: root
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 (vda): re-mounted. Quota mode: disabled.
The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes
Requesting system poweroff
reboot: Power down
start-qemu.shを確認する
以前も start-qemu.sh を確認しました。同じだと思いますが、一応見ておきます。
最後の1行は見にくいので改行を入れています。
$ cat start-qemu.sh
BINARIES_DIR="${0%/*}/"
cd "${BINARIES_DIR}"
mode_serial=false
mode_sys_qemu=false
while [ "$1" ]; do
case "$1" in
--serial-only|serial-only) mode_serial=true; shift;;
--use-system-qemu) mode_sys_qemu=true; shift;;
--) shift; break;;
*) echo "unknown option: $1" >&2; exit 1;;
esac
done
if ${mode_serial}; then
EXTRA_ARGS='-nographic'
else
EXTRA_ARGS=''
fi
if ! ${mode_sys_qemu}; then
export PATH="/home/daisuke/svn_/qemu/linux2/buildroot-2024.02.3/output/host/bin:${PATH}"
fi
exec qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -smp 1 ¥
-kernel Image \
-append "rootwait root=/dev/vda console=ttyAMA0" \
-netdev user,id=eth0 \
-device virtio-net-device,netdev=eth0 \
-drive file=rootfs.ext4,if=none,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 \
${EXTRA_ARGS} "$@"
カーネルのファイル名が zImage から Image になりました。あと、ルートファイルシステムが、ext2 から ext4 になりました。
QEMU の起動パラメータを改めて見てみます。
以下の2行は、ネットワークのインタフェースの定義です。
-netdev user,id=eth0 \
-device virtio-net-device,netdev=eth0 \
また、以下の2行は、ルートファイルシステムをマウントするためのパラメータです。
-drive file=rootfs.ext4,if=none,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0 \
Buildrootを起動してネットワークを確認する
では、再度、Buildroot を起動します。
ネットワークを確認していきます。
まず、インタフェースを確認します。
IPアドレスは、10.0.2.15 です。VirtualBox の Ubuntu 22.04 と同じ IP アドレスですが、たまたまでしょうか。
eth0 Link encap:Ethernet HWaddr 52:54:00:12:34:56
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fec0::5054:ff:fe12:3456/64 Scope:Site
inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1290 (1.2 KiB) TX bytes:1291 (1.2 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
その他の情報を見ます。
nameserver 10.0.2.3
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
なるほど、続いて、ping を実行してみます。
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=255 time=11.690 ms
64 bytes from 8.8.8.8: seq=1 ttl=255 time=7.859 ms
^C
PING google.co.jp (172.217.175.227): 56 data bytes
64 bytes from 172.217.175.227: seq=0 ttl=255 time=13.967 ms
64 bytes from 172.217.175.227: seq=1 ttl=255 time=15.197 ms
^C
繋がりました。インターネットに繋がっているようです。
また、10.0.2.2、10.0.0.3 は、反応がありました。
続いて、wget を試してみます。
wget: not an http or ftp url: https://daisuke20240310.hatenablog.com/entry/initramfs
調べてみると、BusyBox の wget は SSL をサポートしてないとのことです。
Connecting to www.google.co.jp (142.250.199.99:80)
saving to 'index.html'
index.html 100% |********************************| 20468 0:00:00 ETA
'index.html' saved
index.html
Google のトップページの index.html は取得することが出来ました。
今回は以上です。
おわりに
今回は、virt ボードを使って、ARM 64bit の Buildroot を動かしました。
この環境で何ができるかをもう少し調査してみます。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。