2021/04/04

WSL2で仮想GPIOのアクセス権設定

 WSL2では、systemdが動かないのでudevが動いていないため、sysfsのGPIOのアクセス権が設定がされません。

 このため、GPIO操作するために毎度rootになるか、いちいちchmod,chownしないといけません。
 これは結構面倒なので、何とかしたいと思います。

 その前に、sysfsのgpio周りを、RaspberryPIと同じアクセス権設定にしたいと思います。
 まず準備として、gpioグループを作り、ログインユーザーをgpioグループへ追加します。
$ sudo groupadd gpio
$ sudo gpasswd $USER gpio

 idコマンドでgpioグループに入ったことが確認できます。

 そして、udevを使う場合は、gpio用のルールファイルを作っておきます。
 以下のファイルを /etc/udev/rules.d に 99-gpio.rules の名前で保存します。
SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660"
SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\
        chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\
        chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\
        chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\
'"


 さて、それでは、アクセス権の設定方法は以下のいずれかが考えられます。
  1. daemonizeとgenieをインストールし、systemdをPID=1で動かす
  2. udevだけ無理やり動かす
  3. スクリプトを作ってexport/unexportで毎回設定する
 1の方法は、インターネットで「WSL2 systemd」で検索するとやり方がでてきます 。
 でも、なんか、ゴチャゴチャ入れたくないなぁ、と思います。

 2の方法ですが、試してみると、PID=1でなくても、動作するようです。
$ /etc/init.d/udev start


 すると、「インタラクティブシェルから実行されてます。多分、意図したことではないので、60秒待ちます。Ctrl+Cで止めてね。」というような文言がでてきますが、かまわず60秒待ちます。その後、

となってudevの起動が成功します。
後は gpio-mockup を modprobe で起動すれば、RaspberryPI で操作するのと同じ感じにできます。

udev起動時に60秒止められるのが嫌なら、/etc/init.d/udev スクリプト内で sleep(60)しているところを消してしまえばいいです(自己責任でお願いします)
 /etc/init.d/udev スクリプトから一部抜粋


 3の方法は、export/unexportするときに、全てのアクセス権を1つずつ設定していくようなスクリプトを作ればよいのでしょうが、そこまでするなら、sysfsインターフェースのgpioは使うのをやめたほうが良いでしょう。新しいgpioインターフェースにしましょう。

 以上が私なりの方法でした。
 まさか、WSL2がsystemd動いていないとは、思いませんでした。
 dockerはどうなんでしょうね。WSLやめてdockerにしようか。。。

1 件のコメント:

  1. 「sleep(60)の削除」の代わりに、標準入力を/dev/nullにリダイレクトして起動するのはどうでしょう?

    返信削除