VirtualBox で動かした Ubuntu にホストマシンの Web カメラを認識させる

環境において、Ubuntu 仮想マシンから、ホストマシンである MacBookPro のウェブカメラを認識させたいと思い、やり方を調べた。

目次

VirtualBox Extension Pack をインストールする

まずは以下から VirtualBox の Extension Pack をダウンロードする。

VirtualBox を開き、メニューバー → 設定 → 拡張機能 と進み、「拡張パッケージ」としてダウンロードした Zip ファイルを追加し、インストールする。

USB オプションを有効にする

仮想マシンの設定で、仮想 USB を有効にする必要がある。今回は Vagrantfile で設定している前提なので、以下のように Vagrantfile を記述する。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box           = "bento/ubuntu-18.04"
  config.vm.synced_folder   "./shared", "/home/vagrant/shared"
  config.vm.provider :virtualbox do |vb|
    vb.gui    = true    # デスクトップ環境を使うので GUI を有効にする
    vb.memory = "8192"
    vb.cpus   = 4
    vb.customize [
      "modifyvm"          , :id,
      "--vram"            , "256",
      "--clipboard"       , "bidirectional",
      "--accelerate3d"    , "on",
      "--hwvirtex"        , "on",
      "--nestedpaging"    , "on",
      "--largepages"      , "on",
      "--ioapic"          , "on",
      "--pae"             , "on",
      "--paravirtprovider", "kvm",
      "--usb"             , "on",   # ← コレを追加する
    ]
  end
  
  # 初期構築スクリプト
  config.vm.provision :shell, :inline => <<-EOL
    # 日本語化設定
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.BAK
    sudo sed -i 's/archive.ubuntu.com/jp.archive.ubuntu.com/g' /etc/apt/sources.list
    wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
    wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
    sudo wget https://www.ubuntulinux.jp/sources.list.d/bionic.list -O /etc/apt/sources.list.d/ubuntu-ja.list
    sudo apt update -y
    sudo apt upgrade -y
    sudo apt install -y $(check-language-support -l ja) language-pack-ja ubuntu-defaults-ja  manpages-ja manpages-ja-dev
    sudo apt install -y fonts-noto fonts-ipafont fonts-ipaexfont fonts-vlgothic fonts-takao
    sudo apt install -y ubuntu-desktop gnome-tweak-tool
    sudo update-locale LANG=ja_JP.UTF-8
    sudo timedatectl set-timezone Asia/Tokyo
    # デフォルトのエディタを vim に変更
    sudo update-alternatives --set editor /usr/bin/vim.basic
EOL
end

"--usb", "on" と記述すると、USB 1.1 が有効になる。あわせて、--usbehci で 2.0、--usbxhci で 3.0 を有効にできるようだ。

ココまで実施したら、$ vagrant reload を実行して VM を再起動する。

なお、Vagrant で VirtualBox を起動している最中は、設定がロックされているようなので、次のようなコマンドでは USB を ON にできなかった。

$ VBoxManage modifyvm "Ubuntu_default_0000000000000_00000" --usb on
VBoxManage: error: The machine 'Ubuntu_default_0000000000000_00000' is already locked for a session (or being unlocked)
VBoxManage: error: Details: code VBOX_E_INVALID_OBJECT_STATE (0x80bb0007), component MachineWrap, interface IMachine, callee nsISupports
VBoxManage: error: Context: "LockMachine(a->session, LockType_Write)" at line 554 of file VBoxManageModifyVM.cpp

仮想 USB が有効になっているかどうかは、VM 起動後、メニューバー → 仮想マシン → 設定 → 「ポート」タブ → 「USB」タブ → 「USB コントローラーを有効化」にチェックが入っているかどうかでも確認できる。

VirtualBox VM に Web カメラをアタッチする

$ vagrant reload を実行して VirtualBox VM を再起動し、仮想 USB が有効になったら、VM に Web カメラをアタッチする。

まずは次のコマンドで VirtualBox VM 名を控えておく (この例だと "Ubuntu_default_0000000000000_00000")。

# VM 名を控える
$ VBoxManage list runningvms
"Ubuntu_default_0000000000000_00000" {56aaa777-8888-4444-9999-260000000000}

続いて、ホストマシンが認識しているウェブカメラを確認し、ID を控える (この例だと 0x142000000aaaaa00)。コレは MacBookPro 本体に内蔵されている Web カメラだ。

# ウェブカメラの ID (`0x14…` のヤツ) を控える
$ VBoxManage list webcams
Video Input Devices: 1
.1 "FaceTime HD Camera"
0x142000000aaaaa00

両方の情報を控えたら、次のようにコマンドを組み立て、VM に Web カメラをアタッチする。

# アタッチする         ↓ VM 名                                           ↓ Web カメラ ID
$ VBoxManage controlvm "Ubuntu_default_0000000000000_00000" webcam attach 0x142000000aaaaa00

コレでアタッチ成功。もしも仮想 USB が有効になっていない場合は、次のようなエラーが出るはずなので、よく確認して VirtualBox VM を再起動すること。

# 以下は USB が有効になっていない場合に出る
$ VBoxManage controlvm "Ubuntu_default_0000000000000_00000" webcam attach 0x142000000aaaaa00
VBoxManage: error: Attach emulated USB webcam (VERR_PDM_NO_USB_HUBS)
VBoxManage: error: Details: code VBOX_E_VM_ERROR (0x80bb0003), component ConsoleWrap, interface IConsole, callee nsISupports
VBoxManage: error: Context: "WebcamAttach(path.raw(), settings.raw())" at line 2150 of file VBoxManageControlVM.cpp

コレで、MacBookPro のカメラを VirtualBox Ubuntu が認識し使えるようになった。試しに以下のようなテストサイトを VirtualBox 内のブラウザで開き、ウェブカメラが認識されているか確認してみよう。

コレでよきよき。