WSL2でのUSBカメラのパーミッションをなんとかする

WSL2でのUSBカメラのパーミッションをなんとかするWSL
スポンサーリンク

前々回前回とWSL2でUSBカメラを使う方法を紹介してきました。

今回はWSL2でUSBカメラを使う際の課題の1つであるパーミッション問題をなんとかしたいと思います。

スポンサーリンク

パーミッション問題

WSL2でUSBカメラを使う際のパーミッション問題とは、USBカメラを接続した際にできるデバイスノードのパーミッションがルート権限を持ったユーザのみ利用できる状態になっていることです。

具体的には/dev/video*は次のようになってしまいます。

$ ls -l /dev/video*
crw------- 1 root root 81, 0  4月 23 23:06 /dev/video0
crw------- 1 root root 81, 1  4月 23 23:06 /dev/video1

これでは一般ユーザは利用できないので、カメラを使うアプリを利用する際には、手動でパーミッションを変更する必要があります。

sudoコマンドを利用して、ルート権限でアプリを実行する手もあります。

パーミッションを変えるのはそれほど面倒ではないのですが、問題なのはUSBカメラが認識される毎に元に戻ってしまうと言うことです。

USBカメラを抜き差ししたり、WSL2を起動する度に、パーミッションを変えるのはなかなか面倒です。

スポンサーリンク

udevの導入

Linuxで/dev以下のデバイスノードを管理するツールとして「udev」というものがあります。

udev - Wikipedia

udevを使うと、新しいデバイスが追加された際に、何らかの処理を行わせることができます。

この機能を使って、/dev/video*が生成された際に、パーミッションを変更しようというのが今回のやりたいことになります。

まずはじめにudevをインストールします。

$ sudo apt-get install udev

続いてudevを手動で開始します。

$ sudo service udev start



It has been detected that the command

        /etc/init.d/udev

has been run from an interactive shell.
It will probably not do what you expect, so this script will wait
60 seconds before continuing. Press ^C to stop it.
RUNNING THIS COMMAND IS HIGHLY DISCOURAGED!

本来、udevは手動で起動するものではないので、このように警告が表示されます。

しかし、ここのメッセージに書かれているように60秒待てば処理が継続されudevが起動されます。

 * Starting hotplug events dispatcher systemd-udevd                                                             [ OK ]
 * Synthesizing the initial hotplug events (subsystems)...                                                      [ OK ]
 * Synthesizing the initial hotplug events (devices)...                                                         [ OK ]
 * Waiting for /dev to be fully populated...                                                                    [ OK ]

これでudevの導入はOKです。

USBカメラを接続してみる

udevが起動している状態でUSBカメラをWindows PCに接続してみましょう。

もちろん、前準備として前々回と前回の記事を参考に、USBIPD-WINの導入とLinux kernelの再コンパイルを済ませておいたものとします。

WSL2でUSBカメラを使う - 前編
今回はWSL2のUbuntuでUSBデバイスを認識できるようにしてみます。WSL2は仮想マシンのようなものなので物理的なUSBポートは有りませんが、USBIPD-WINというツールを使うことでWindowsに接続されたUSBデバイスを認識することができます。ただWSL2のLinux kernelにはUSBカメラのドライバが含まれていないため、USBカメラを使うにはもう一工夫必要です。
WSL2でUSBカメラを使う - 後編
今回はWSL2でUSBカメラを使えるようにしてみます。WSL2のLinux KernelはV4L2やUVCが有効になっていないため、USBカメラを利用するにはLinux Kernelを自分でコンパイルして差し替える必要があります。Linux Kernelを変更すればUSBIPD-WINと組み合わせることによってWSL2でUSBカメラを利用することができます。ただ転送速度に難があるようなのが残念です。

そしてWindows側でusbipdコマンドを使ってUSBカメラをアタッチした後に、WSL側で/dev/video*を確認すると・・・

$ ls -l /dev/video*
crw-rw---- 1 root video 81, 0  4月 25 20:28 /dev/video0
crw-rw---- 1 root video 81, 1  4月 25 20:28 /dev/video1

ちゃんとグループがvideoになっており、グループでの読み書きも可能になっています。

従って、ユーザがvideoグループに所属していれば、USBカメラを利用できることになります。

Ubuntuでは最初に作成したユーザは自動的にvideoグループに属しているようです。

udevの起動を自動化する

これでパーミッション問題は解決したわけですが、WSL2を起動する度にudevを毎回手動で開始するのは少々面倒です。

そこでWSL2の起動時に自動的にudevを有効にしましょう。これを行うためには/etc/wsl.confというファイルを利用します。

UbuntuをWindows11上で動かす その11: wsl.confによる設定
今回はwsl.confというファイルを使って、WSL2の起動時にネットワークドライブの自動マウントと、sshサーバ・xrdpに自動起動を設定します。WSL2ではsystemdが動いていないため起動時の自動起動は面倒かと思ったのですが、この設定フィアルで簡単に行うことができました。WSL2で動かしておきたいサービスがある方は活用して見てください。

やることは/etc/wsl.confのbootセクションの「command」で「service udev start」を実行するようにするだけです。

私の場合はsshサーバ等も起動する様にしているので、次のような記述となりました。

[boot]
command = "service ssh start ; service xrdp start ; service cron start; service udev start"

これで次回のWSL2の起動時にはudevが有効になっているはずです。

まとめ

今回はWSL2のLinuxでudevを有効にすることにより、USBカメラを利用する際のパーミッション問題を解決してみました。

最近のWSL2では起動時に実行するコマンドを簡単に設定できるので、起動時にudevを有効にすることも簡単です。WSL2でUSBデバイスを使う予定がある方は設定しておくことをオススメします。

コメント