覚書で読み飛ばし推奨。
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
ひょっとしたら「なんか足りないよ!」とかいわれるかもしれない。
その場合は「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 で動いたのであった。
なので、掲題の答えは「がんばれば動くが、手間が見合わない」ということでした。
そもそもWindowsのシリアルドライバ関係のトラブルがイヤで、Ubuntuにしたいのに、Virtual Here だと Wndows のドライバ避けられないじゃないか。(今気づく)
別に Ubuntu 準備したほうがマシ。つうかなぜChromeOSのサポートヤメた。
Defenderのこのあたりも、そのうちWSL2になんらかの変更が入るのでなかろうか。
その時にまたあらためて検討。
でも Virtual Here を勉強できたのはよかった。
コレ使うとインターネット越しにUSBデバイスつなげるってことだよね。
おもしれえ。