はじめに
YouTube専用の軽量アプリケーション「Cobalt」をRaspberry Pi 2で動作検証するため、QEMUを使用した仮想環境の構築を試みました。結果として、Raspberry Pi 2の仮想環境は正常に動作したものの、CobaltがGPU(VideoCore)に依存するため、最終的な実行には失敗しました。本記事では、その過程で得られた知見と課題を共有します。
実験環境・前提条件
- ホストOS: Ubuntu(QEMU 8.2.2使用)
- ターゲット: Raspberry Pi 2B
- 使用OS: Raspberry Pi OS(Buster、2021-05-07版)
- 目的: Cobaltアプリケーションの動作検証
QEMU環境の準備
QEMUのインストールと確認
システムを最新状態に更新し、QEMUをインストールします。
sudo apt-get update
sudo apt install -y qemu-system
qemu-system-arm --version
QEMU emulator version 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.7)
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers
qemu-system-arm -machine help | grep -i rasp
raspi0 Raspberry Pi Zero (revision 1.2)
raspi1ap Raspberry Pi A+ (revision 1.1)
raspi2b Raspberry Pi 2B (revision 1.1)
今回の対象であるraspi2b
がサポートされていることを確認できます。
Raspberry Pi OSイメージの準備
イメージファイルのダウンロード
Raspberry Pi公式サイトからRaspberry Pi 2対応のOSイメージを取得します。
公式ダウンロードページ: https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-32-bit
wget https://downloads.raspberrypi.com/raspios_armhf/images/raspios_armhf-2021-05-28/2021-05-07-raspios-buster-armhf.zip
イメージファイルの展開と準備
unzip 2021-05-07-raspios-buster-armhf.zip
これにより2021-05-07-raspios-buster-armhf.img
が作成されます。
ブートファイルの抽出
QEMUでの起動に必要なカーネルファイルとデバイスツリーファイルを抽出します。
sudo losetup --show -fP 2021-05-07-raspios-buster-armhf.img
$ lsblk /dev/loop1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop1 7:1 0 4G 0 loop
├─loop1p1 259:4 0 256M 0 part
└─loop1p2 259:5 0 3.8G 0 part
ブートパーティションをマウントし、必要ファイルをコピーします。
sudo mkdir /mnt/raspios
sudo mount /dev/loop1p1 /mnt/raspios
ファイル対応表
ファイル名 | 対応機種 |
---|---|
kernel7.img | Raspberry Pi 2、3、Zero 2 W など |
bcm2709-rpi-2-b.dtb | Raspberry Pi 2 Model B |
cp /mnt/raspios/kernel7.img /mnt/raspios/bcm2709-rpi-2-b.dtb .
クリーンアップ
sudo umount /mnt/raspios
sudo losetup -d /dev/loop5
この時点で、作業ディレクトリに以下3つのファイルが存在する状態になります:
$ ls
2021-05-07-raspios-buster-armhf.img bcm2709-rpi-2-b.dtb kernel7.img
QEMU仮想マシンの設定と起動
ディスクイメージの拡張
Cobaltアプリケーションのインストールに必要な容量を確保するため、イメージサイズを拡張します。
qemu-img resize -f raw 2021-05-07-raspios-buster-armhf.img 8G
起動スクリプトの作成
QEMUの起動設定を記述したスクリプトを作成します。
vi ./run.sh
chmod +x run.sh
#!/bin/sh
cd `dirname $0`
qemu-system-arm \
-m 1024 \
-M raspi2b \
-kernel kernel7.img \
-dtb bcm2709-rpi-2-b.dtb \
-drive format=raw,file=2021-05-07-raspios-buster-armhf.img \
-append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 dwc_otg.fiq_fsm_enable=0 bcm2708_fb.fbwidth=1280 bcm2708_fb.fbheight=720" \
-serial stdio \
-no-reboot \
-device usb-kbd \
-device usb-tablet \
-device usb-net,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::2222-:22
主要パラメータの説明:
-
-m 1024
: メモリ1GB割り当て -
-M raspi2b
: Raspberry Pi 2Bエミュレーション -
hostfwd=tcp::2222-:22
: SSH接続用ポートフォワーディング
仮想マシンの起動
./run.sh
ストレージ容量の拡張
現在の容量確認
初期状態では、ルートパーティション(/
)の空き容量が206MBしかありません。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 3.4G 3.0G 206M 94% /
devtmpfs 436M 0 436M 0% /dev
tmpfs 469M 0 469M 0% /dev/shm
tmpfs 469M 13M 456M 3% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 469M 0 469M 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 48M 205M 19% /boot
tmpfs 94M 4.0K 94M 1% /run/user/1000
パーティションテーブルの確認と変更
パーティション構成を確認します。
$ sudo fdisk /dev/mmcblk0
現在の構成を表示:
Command (m for help): p
Disk /dev/mmcblk0: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9d5a64c8
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/mmcblk0p2 532480 8404991 7872512 3.8G 83 Linux
パーティション構成の解析:
-
/dev/mmcblk0p1
: 256MB FAT32(ブートパーティション) -
/dev/mmcblk0p2
: 3.8GB Linux ext4(ルートファイルシステム) - パーティションテーブル形式: MBR(MS-DOS)
パーティションの再作成
既存のルートパーティションを削除し、拡張された領域を使用する新しいパーティションを作成します。
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
新しいパーティションを作成:
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-16777215, default 2048): 532480
Last sector, +/-sectors or +/-size{K,M,G,T,P} (532480-16777215, default 16777215):
Created a new partition 2 of type 'Linux' and of size 7.7 GiB.
既存のext4シグネチャを保持:
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: N
変更を保存:
Command (m for help): w
The partition table has been altered.
Syncing disks.
重要: この段階ではパーティションサイズのみが変更され、ファイルシステム自体はまだ拡張されていません。
システム再起動とファイルシステム拡張
パーティションテーブルの変更を確実に反映させるため、システムを再起動します。
sudo reboot
ファイルシステムをパーティションの最大サイズまで拡張:
sudo resize2fs /dev/mmcblk0p2
df -h
拡張結果の確認:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 7.6G 3.0G 4.3G 41% /
devtmpfs 436M 0 436M 0% /dev
tmpfs 469M 0 469M 0% /dev/shm
tmpfs 469M 6.3M 462M 2% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 469M 0 469M 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 48M 205M 19% /boot
tmpfs 94M 4.0K 94M 1% /run/user/1000
ルートパーティションの空き容量が206MBから4.3GBに増加しました。
Cobaltアプリケーションのデプロイ
バイナリファイルの転送
事前にビルドしたRaspberry Pi 2向けのCobaltバイナリを、SSHポートフォワーディング経由で転送します。
cd <COBALT_SRC>
export COBALT_SRC=${PWD}
rsync -avzLPh -e "ssh -p 2222" --exclude="obj*" --exclude="gen/" \
$COBALT_SRC/out/raspi-2_gold pi@localhost:~/
Cobaltの実行試行
cd raspi-2_gold/install/cobalt_loader
./cobalt_loader
発生した問題と根本原因
エラー内容
Cobaltの起動時に以下のエラーが発生しました:
[cobalt_loader/1157:0721/040315.461450:INFO:main.cc(76)] Starting application.
* failed to open vchiq instance
問題の分析
このエラーは、Cobalt がRaspberry PiのBroadcom GPU(VideoCore)との通信に必要な/dev/vchiq
デバイスファイルにアクセスできないことを示しています。
根本原因:
- ハードウェア依存性: Cobalt はRaspberry PiのVideoCore GPUを使用したハードウェアアクセラレーションに依存
- エミュレーション制限: QEMUはVideoCore GPUの完全なエミュレーションをサポートしていない
-
デバイスファイル不在:
/dev/vchiq
がエミュレーション環境では作成されない
結論と今後の展望
実験結果のまとめ
成功した項目:
- QEMU上でのRaspberry Pi 2環境の構築
- Raspberry Pi OSの正常起動
- ストレージ容量の拡張
- ネットワーク接続とファイル転送
失敗した項目:
- Cobaltアプリケーションの実行
- VideoCore GPUへのアクセス
技術的制約
CobaltがVideoCore GPUに依存する設計であるため、現在のQEMUエミュレーション環境では動作させることができませんでした。この制約は以下の理由によります:
- GPU専用ドライバーの不在: QEMUではBroadcom VideoCore用のドライバーが提供されていない
- ハードウェア抽象化の限界: GPUの低レベルアクセスはエミュレーションが困難
- リアルタイム性能要件: 動画再生に必要な性能がエミュレーション環境では不足
代替アプローチの検討
Cobalt のビルド時に GPU の使用を disable にする設定がないか確認したが、下記のコマンド出力でそれらしいオプションは見つからなかった
gn args out/raspi-2_gold --list | less
得られた知見
本実験により、以下の重要な知見を得ることができました:
- QEMUによるRaspberry Pi環境の構築手順の確立
- ハードウェア依存アプリケーションの仮想化における制約の理解
- 組み込みシステム開発における実機検証の重要性