1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

YouTubeアプリCobalt を動かすためのRaspberry Pi 2仮想環境構築がうまくいかなかったメモ

Posted at

はじめに

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

image.png

image.png

ストレージ容量の拡張

現在の容量確認

初期状態では、ルートパーティション(/)の空き容量が206MBしかありません。

Raspberry Piで実行
$ 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

パーティションテーブルの確認と変更

パーティション構成を確認します。

Raspberry Pi
$ sudo fdisk /dev/mmcblk0

現在の構成を表示:

fdisk コマンド内で下記を実行する
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.

重要: この段階ではパーティションサイズのみが変更され、ファイルシステム自体はまだ拡張されていません。

システム再起動とファイルシステム拡張

パーティションテーブルの変更を確実に反映させるため、システムを再起動します。

Raspberry Pi
sudo reboot

ファイルシステムをパーティションの最大サイズまで拡張:

Raspberry Pi
sudo resize2fs /dev/mmcblk0p2
df -h

拡張結果の確認:

Raspberry Pi
$ 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デバイスファイルにアクセスできないことを示しています。

根本原因:

  1. ハードウェア依存性: Cobalt はRaspberry PiのVideoCore GPUを使用したハードウェアアクセラレーションに依存
  2. エミュレーション制限: QEMUはVideoCore GPUの完全なエミュレーションをサポートしていない
  3. デバイスファイル不在: /dev/vchiqがエミュレーション環境では作成されない

結論と今後の展望

実験結果のまとめ

成功した項目:

  • QEMU上でのRaspberry Pi 2環境の構築
  • Raspberry Pi OSの正常起動
  • ストレージ容量の拡張
  • ネットワーク接続とファイル転送

失敗した項目:

  • Cobaltアプリケーションの実行
  • VideoCore GPUへのアクセス

技術的制約

CobaltがVideoCore GPUに依存する設計であるため、現在のQEMUエミュレーション環境では動作させることができませんでした。この制約は以下の理由によります:

  1. GPU専用ドライバーの不在: QEMUではBroadcom VideoCore用のドライバーが提供されていない
  2. ハードウェア抽象化の限界: GPUの低レベルアクセスはエミュレーションが困難
  3. リアルタイム性能要件: 動画再生に必要な性能がエミュレーション環境では不足

代替アプローチの検討

Cobalt のビルド時に GPU の使用を disable にする設定がないか確認したが、下記のコマンド出力でそれらしいオプションは見つからなかった

gn args  out/raspi-2_gold --list | less

得られた知見

本実験により、以下の重要な知見を得ることができました:

  • QEMUによるRaspberry Pi環境の構築手順の確立
  • ハードウェア依存アプリケーションの仮想化における制約の理解
  • 組み込みシステム開発における実機検証の重要性

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?