前々回・前回と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を使うと、新しいデバイスが追加された際に、何らかの処理を行わせることができます。
この機能を使って、/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の再コンパイルを済ませておいたものとします。
そして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というファイルを利用します。
やることは/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デバイスを使う予定がある方は設定しておくことをオススメします。
コメント