aarch64 のプラットフォームで Web カメラを使う機会があるので、エミュレーターで何とかできないか試してみた。
前提
Windows 11 Pro -> x86_64 Ubuntu 18.04 on VirtualBox -> aarch64 Ubuntu 18.04 on QEMU という感じに重ねて、 USB パススルーで Windows から QEMU まで Web カメラを繋げていく。
- ホスト OS: Windows 11 Pro 21H2
- VirtualBox: バージョン 6.1.28 r147628 (Qt5.6.2)
- ゲスト OS: Ubuntu 18.04
- QEMU: QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.38)
- 各 Ubuntu のインストール手順は省略。最小構成でインストールしている。
VirtualBox のゲストに、ホストの USB を繋げる方法は、Windows 11 上の VirtualBox で、 Ubuntu 18.04 に Web カメラを繋げる - mikoto2000 の日記 の記事参照。
aarch64 版 Ubuntu 18.04 の準備
cortex-a57 の virt VM を作る。
QEMU のインストール
これで、 QEMU の VM を作成・実行するためのコマンド一式がインストールされる。
aarch64 Ubuntu 18.04 ネットブート ISO イメージのダウンロード
arm64 版 Ubuntu のネットブートインストーラーのダウンロードページ から、 mini.iso
をダウンロード。
wget http://ports.ubuntu.com/ubuntu-ports/dists/bionic-updates/main/installer-arm64/current/images/netboot/mini.iso
aarch64 VM 用のディスクイメージ生成
qemu-img
コマンドでディスクイメージを作成する。
QEMU 用 UEFI イメージの取得
QEMU 用の UEFI イメージを、 Linaro が公開しているのでそれをダウンロード。
USB パススルーのための情報取得
lsusb
で、 Web カメラの Vendor ID, Product ID を特定する。
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 019: ID 1bcf:2281 Sunplus Innovation Technology Inc.
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
今回の場合、 Vendor ID: 0x1bcf, Product ID: 2281 のものが Web カメラ。
USB パススルーをするときに使うので、それぞれをメモ。
aarch64 の QEMU で Ubuntu 18.04 をインストール
ここまでで調達した、インストーラー、UEFI, ディスクイメージを使って QEMU を起動。
sudo qemu-system-aarch64 \
-M virt \
-cpu cortex-a57 \
-m 4096 \
-bios ./QEMU_EFI.fd \
-drive if=none,file=storage.qcow2,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-cdrom ./mini.iso \
-nographic
aarch64 の QEMU で Ubuntu 18.04 を実行
インストールが完了したら、 VirtualBox にパススルーした USB カメラを、 QEMU にパススルーしながら実行する。
sudo qemu-system-aarch64 \
-M virt \
-cpu cortex-a57 \
-m 4096 \
-bios ./QEMU_EFI.fd \
-drive if=none,file=storage.qcow2,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-device nec-usb-xhci,id=usb \
-device usb-host,bus=usb.0,vendorid=0x1bcf,productid=0x2281 \
-nographic
aarch64 版 Ubuntu で USB が認識されていることを確認
ここでもやはり lsusb
で確認。
mikoto@ubuntu:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 1bcf:2281 Sunplus Innovation Technology Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Vendor ID: 0x1bcf, Product ID: 0x2281 の、 Web カメラが認識されていることがわかる。
V4L2 の動作確認
ffmpeg を使って、 Web カメラの画像を録画できることを確認する。
aarch64 版 Ubuntu 18.04 に ffmpeg をインストール
ffmpeg でカメラから画像生成
q
で録画を停止して、 ls
すると、 jpeg 画像が大量に吐き出されている。
QEMU 上の ffmpeg で生成したファイルを抽出
QEMU を停止し、 x86_64 Ubuntu 上で以下コマンドを実行
# qcow2 ファイルをマウント
sudo modprobe nbd
sudo mkdir /mnt/tmp
sudo qemu-nbd -c /dev/nbd0 ./storage.qcow2
sudo mount -o ro /dev/nbd0p2 /mnt/tmp/
/mnt/tmp
に aarch64 Ubuntu のディスクがマウントされるので、 吐き出された jpeg を回収、 Windows と共有しているディレクトリへコピーして Windows 上で jpeg ファイルを確認。
OK.
ディレクトリの共有方法は Windows 11 上の VirtualBox で、 Ubuntu 18.04 とフォルダー共有を行う - mikoto2000 の日記 参照。
# 後始末
sudo umount /mnt/tmp/
sudo killall qemu-nbd
こんな画像が大量に吐き出されていた。
以上。
0 件のコメント:
コメントを投稿