仮想環境で組込みの開発環境を整備する話。
昨日Windows環境で苦労したZephyr
RTOSのx86向けコンパイルは、VM上のLinuxでビルドしたらあっさり動いてしまった(Windowsを投げ捨てたくなったのは内緒)。とはいえ、普段使いにおいてはWindowsのほうが便利なので、Windows
+ Linux(VM)の環境構築の可能性を模索した。とくにハードウェアを使う組み込み開発に使うことを想定している。
残念ながら2019年8月現在、Hyper-VからUSBメモリを認識させることはできないようだ。
よって、posixの開発環境を構築する場合の選択肢は次の通り
- Hyper-Vを無効にし、VirtualBoxを使う。WSLを捨てる。
- VMからI/Oへのアクセスを諦める。VirtualBox 6.0を使う。
- お金と空間を犠牲にし、Linuxマシンを調達する。
- Linuxとのデュアルブート環境を構築する。
- Mac+Windows(VM)を構築する
私は2を採用するつもりだ。
WSLを捨てるべきか
Hyper-Vを無効化すればVirtualBoxでいい感じに仮想環境が使える。面白い選択肢ではないが、今すぐVirtualBoxで解決したい問題があるならこれが正解な気がする。
WSLはWindows環境でLinuxを使える、手軽なVMみたいな機能だ。Cygwin・MSYSで代用できそうだが、Linux標準のパッケージを使えるのは魅力的だし、OS標準機能になっているのも簡単でいい。I/Oが遅い、一部のシステムコールが未実装という点でガッツリLinuxを使うには適していないので、Linuxにしかない(ちょっとした)便利なツールをWindowsのものとして使うべきだろう。
結局WSLのデメリットは解決できなかったようで、その解決策としてWSL2という別物が発表された。WSL2はHyper-V上でLinuxを動作させており、VM上に自力でLinuxを用意するのと大きな差はない。とはいえ、OSがVMの壁を意識せずに使えるように取り計らってくれるので使い勝手はいいはずだ。
ただ、WSL2でもホストOSのオーディオデバイス・USBデバイスはゲストOSで当面はサポートされないようだ。[1]
Hyper-VとRDPの話
Hyper-VのゲストOSでUSBデバイスを使う方法は主に2種類らしい。
一つはUSB over Ethernet/IPというもので、USBデバイスをネットワーク越しにアクセスするものだ。今回私は試していないが、うまくアクセスできているという報告がある。仮想シリアルポートやドライバを必要とするようなUSBデバイスをIP越しに使えるかまでは分かっていない。多分そのうち試すかもしれない。USBメモリのようなマスストレージデバイスなら行けそうな気がする。
もう一つはRDP(リモートデスクトッププロトコル)を使って接続し、USBデバイスをゲストOSへリダイレクト/パススルーするものだ。Windows RemoteFXに含まれる機能だ。RDPは元々Windows間のリモート通信に使われていたのでLinuxは対象外なのだが、LinuxマシンにxrdpをインストールすることでWindowsマシンからRDPで接続できるようになる。
さらに、マイクロソフトが公開しているlinux-vm-toolsをゲストLinuxにインストールすることで拡張セッション("Enhanced session")が有効になる。これによりHyper-Vの画面解像度の上限(1920x1080)を超えたり、ホスト<->ゲスト間でのコピペができるようになる。WSL2もRDPをベースの技術として使っている。
ただ、ここに上がっているようにRDP通信によるUSBリダイレクトは2019年でサポートされていないので、HyperV + Linux + RDPの方法ではUSBデバイスは使えない。WSL2でも使えないのだから、きっとそういう事情なのだろう。WSL2でUSBデバイスが使えるようになっている頃には拡張セッションでUSBリダイレクトが使えるようになっていると期待したい。
VirtualBox 6.0に期待
こんど試す。でも、T480(i7)で動かない報告あり。T480s(i5)はどうなんだろう。
Linuxマシンを買う
割とあり。でも開発環境が分散されるのは管理が面倒なんです。
Macを買っていたら・・・
要求スペック的に20万を軽く超える上[2]、macはBSDベースだからdockerをネイティブで動かせないことを考えると、あまりメリットを見いだせなかった。当時はバタフライキーボードの問題が騒がれていて、高い買い物に躊躇したせいもある。それに組込み開発だとMac向けにドライバが提供されていないこともたまーにある。
デュアルブート
LinuxがWindowsをぶっ壊しそうなのでなし。