2021年10月24日日曜日

QEMU + aarch64 版 Ubuntu 18.04 で USB パススルーして V4L2 を試す

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 のインストール

sudo apt-get install -y 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-img create -f qcow2 storage.qcow2 50G

QEMU 用 UEFI イメージの取得

QEMU 用の UEFI イメージを、 Linaro が公開しているのでそれをダウンロード。

wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd

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 をインストール

sudo apt-get install -y ffmpeg

ffmpeg でカメラから画像生成

sudo ffmpeg -f v4l2 -s 352x288 -i /dev/video0 -f image2 ./output-%6d.jpeg

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 件のコメント:

コメントを投稿