WSL2でLinux版Betaflight Configuratorは使えるのか?

覚書で読み飛ばし推奨。

Betaflight Configurator のサポートから ChromeOS が外れた!マジで!
WSL2でUSBシリアル使えると Configurator系がUbuntuで使えて助かるかもな。
さらにArduinoとかも使えるってことになるし。
という思いつきからこの話は始まる。

WSLではUSBシリアルが使えたのだけど、WSL2からは使えなくなった。
かわりにといったらなんだが、WSL2からはGUIが使えるようになった。
なので「GUIで動いてUSBシリアルを使う」ってのが現時点動かない。
これを何とかできないか。
手順としては、1.WSL2でGUIを使えるようにし、2.WSL2でUSBシリアルを使えるようにする、という2段階になる。やってみた。

■WSL2でGUIを使う
WSL2からGUI使えるってことになってはいるんだけど。
xrdpでリモートデスクトップひっぱるとか、VcXsrvで.bashrcにdisplay設定を書き込むとか、いろいろ紐付けがめんどくさかった。
いずれもWindows 側で受け口を作って、Ubuntu側から引っ張るのだが、実はWSLでは割り当てられるIPアドレスが都度かわる。
WSL/WSL2を立ち上げて、PowerShell から ipconfig すると vEthernet という形でIPアドレスが割り当てられていることがわかる。
/etc/resolv.confを見ると、namesaver として上記の vEthernet のアドレスが割り当てられている。
つまり、WSL側から見て、ホストのWindowsは nameserver のIPアドレスで、そこのXサーバに向けて接続するという方法だった。
ところが割り当てられる都度変わるのでめんどくさい。
そういうスクリプトを組んで工夫してたりしていた。
今回改めてなんか良い方法ないかと探していたら、MobaXterm の方法を知った。
https://qiita.com/vega77/items/f00323e8ce64bfa1fdd6
左上にある「Session」のアイコンから「WSL」を選択。
「Run method」を「Localhost connection」に変更。
右上にある「Settings」のアイコンから「X11」のタブで「X11 remote access」を「full」に。
これだけ。あとは該当の Session で使いたい WSL2 を選択し、そちらのターミナルから実行すればよい。
実行すると MobaXterm の Xserver が動くというシカケ。すごいラク。やったー。
Ubuntu側のGUIを動かすために必要な手順はコチラ。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libgl1-mesa-dev xorg-dev

おなじみの目玉を出して実験。

$ sudo apt install x11-apps
$ xeyes
出た。

これで動くようになった。
せっかくなので、deb版の Betaflight Configurator を動かすところまでやってみよう。

$ sudo apt install gconf-service gconf-service-backend gconf2-common libgconf-2-4
$ wget https://ci.betaflight.tech/job/BetaFlight_Configurator/lastSuccessfulBuild/artifact/release/betaflight-configurator_10.8.0_amd64.deb
$ sudo dpkg -i betaflight-configurator_10.8.0_amd64.deb

そして起動。

$ /opt/betaflight/betaflight-configurator/betaflight-configurator
画像
こいつ・・動くぞ。10.8.0というバージョンが見えます。

ひょっとしたら「なんか足りないよ!」とかいわれるかもしれない。
その場合は「sudo apt –fix-broken install」とかで足りないパッケージをいれよう。
お作法によると、DFUモードの設定と、デバイスにユーザの追加とかがある。
そのあたりは git で確認。
https://github.com/betaflight/betaflight-configurator
設定してもこの段階ではシリアル使えないので、どうやってもつながらないけど。
とにかく WSL2 で Betaflight Configurator が動くところまでは行った。

■WSL2でUSBシリアルを使う
UFEIセキュアブート外してUSB/IPを使うという方法があったが、セキュリティ的にどうだろ。
そこで Virtual Here という USBデバイスを OverIP するツールで実現しているのを発見。
https://contentsviewer.work/Master/WSL/Tips/WSL2-USB/WSL2-USB
具体的にはWSL2のカーネルドライバをビルドして、WSL2のカーネルに追加。
Windows側に Virtual Here のサーバを、WSL2側に Virtual Here のクライアントを入れ、それで接続してやる。
大変詳しいページなのでなぞっていけばできるが、コチラのページといくつか違ったところ。

1.Ubuntu20.04 LTS ベースでやった。
2.kernel Version が 4.19.84 だったので読み替えた。
3.Serial Convererは FTDI に加えて(いつもの) CP210x を追加した。(menuconfig)
4.どうしてもWSL側からWindows側が見つからないので、WindowsDefenderをイジった。

1と2はまあいい。
3の menuconfig 追加はコチラ。

Device Drivers->USB support->USB Serial Converter support->USB CP210x family of UART Bridge Controllers [M]

そして4。ココでちょっとハマった。
これはXサーバの時にも問題になっていたアレ。(それで先にクドクド説明した)
これのせいでDNSが引けないというトラブルもちょいちょい聞いたりします。
調べた結果、Windows側の Firewall であるところの、WindowsDefender が閉じてて WSL からアクセスさせないということになってる。
Dockerとか使うのに、Windows側から WSL 側のポート開放とかの話はよくあるしよく聞く。
WSL側からホストである Windows側へってあんまりニーズないのか知らなかった。
まあとにかく今回発見した。
元ネタは git のどこかの issue で見たのだけど、再度探したら見つからなくて、とにかく内容的にはコチラ。
https://www.howtogeek.com/howto/windows-vista/allow-pings-icmp-echo-request-through-your-windows-vista-firewall/
セキュリティ具合は各自納得できるレベルで調整。

この処置で、あれだけつながらなかった Virtual Here がサクっとつながり、WSL側の/dev/ttyACM0につながる。/dev/ttyACM0 は chmod 666 とかするの忘れずに。
なお Virtual Here 無料版はデバイス接続1個まで。
万難を排し、ついに deb版の Betaflight Configurator が WSL2 で動いたのであった。

画像
つないだのはいつものMeteor65。今回導入したアプリが勢揃い。

なので、掲題の答えは「がんばれば動くが、手間が見合わない」ということでした。
そもそもWindowsのシリアルドライバ関係のトラブルがイヤで、Ubuntuにしたいのに、Virtual Here だと Wndows のドライバ避けられないじゃないか。(今気づく)
別に Ubuntu 準備したほうがマシ。つうかなぜChromeOSのサポートヤメた。
Defenderのこのあたりも、そのうちWSL2になんらかの変更が入るのでなかろうか。
その時にまたあらためて検討。

でも Virtual Here を勉強できたのはよかった。
コレ使うとインターネット越しにUSBデバイスつなげるってことだよね。
おもしれえ。