備忘録: WSL2 Ubuntuに Nervesの開発環境をセットアップしてみる


5月に WSL2 - Windows Subsystem for Linux 2 が正式リリースされたそうだ。
どの程度使えるモノだろうかと、ちょっと Nervesの開発環境をセットアップしてみることにした。その備忘録

1.前準備

Windows10はアップデート済みで、WSL2のセッティングも終わっているとする。

WSL2にインストールする Linuxディストリビューションはポピュラーな Ubuntuにする。Microsoft Storeを開き、キーワード「WSL」で検索すると、下図のようにバージョン付きとバージョン無しの合わせて3つの Ubuntuが見つかった。バージョン無しの Ubuntuはその時点での最新のバージョンだそうなので、今回はコレを選んでみた - 実体は 20.04 LTSか

WSL2 Ubuntuのターミナルと Windowsのコマンドプロンプト/PowerShellを行き来する作業では、Windows Terminalが便利なのでコレもインストールしておく。

念のために、Ubuntuの WSLバージョンが "2"となっていることを確認しておこう。
…OKだ

powershell
PS C:\Users\shozo> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         2

2.Nervesのセットアップ

WSL2上では Linux-Ubuntu 20.04が動いているので、Nervesの開発環境のセットアップ手順は Ubuntuのそれとなんら変わらない。違いは、作成した NervesファームウェアをSDカードに書き込む時に Windows版 fwupが必要になることぐらいかな。どうやら WSL2からは SDドライブに直接アクセス出来ないようだ。

以下、Nerves ProjectのHPに掲載されているNerves installationに沿ってセットアップを進める。

2.1.debパッケージのインストール

まず、Erlang/Elixirをビルドする為に必要な debパッケージをインストールする。

bash
sudo apt update -y
sudo apt install build-essential automake autoconf git squashfs-tools ssh-askpass pkg-config curl
sudo apt install libssl-dev libncurses5-dev bc m4 unzip cmake python

Nervesを利用するだけなら上のパッケージのインストールだけで十分。
後述する Erlangのビルドの際中に、「いくつかライブラリが足りないとぞ」とワーニングが出るが、気にする必要はないようだ。

しかし、Nervesとは別に Erlang単体のフル活用も考えているならば、下記のパッケージをインストールしてワーニングを消しておこう。今回は、Erlangで wxWidgetsをちょっと触ってみたかったので、これらのパッケージもインストールした。

bash
sudo apt install openjdk-8-jdk unixodbc-dev libwxgtk3.0-gtk3-dev xsltproc fop libxml2-utils

次にfwupをインストールする。先にも触れた通り、UbuntuとWindowsの両方で行う。

bash
wget https://github.com/fhunleth/fwup/releases/download/v1.8.0/fwup_1.8.0_amd64.deb
sudo apt install ./fwup_1.8.0_amd64.deb
powershell
choco install fwup /y

2.2.Erlang/Elixirのビルド

Nervesの開発では、プリ・ビルドされたバイナリ(nerves_system_rpi3など)を使用しているため、Erlang/Elixirのバージョンとの依存関係が発生する。そこで、Erlang/Elixirのバージョンを管理するために asdf version managerが利用されている。

ということで asdfのインストールから始める。

bash
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.7.1
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc # optional
source ~/.bashrc

次に Erlang/Elixirのプラグインを取得し、Erlang/Elixirそれぞれをビルド&インストールする。

先に触れた通り、ODBCやwxWidgetsの debパッケージをインストールしていない場合は、Erlangのビルドでワーニングが出るが気にする必要はないようだ。

注)nerves_system_rpi3 v1.12.0からは Erlang/OTP 23に依存するので、erlang 23.0.2を選択しよう。

bash
asdf plugin-add erlang
asdf plugin-add elixir
asdf install erlang 23.0.2
asdf install elixir 1.10.3-otp-23
asdf global erlang 23.0.2
asdf global elixir 1.10.3-otp-23

最後に、mix回りのセットアップと sshの鍵を作成する。これで Nerves開発環境のセットアップは一通り終わりだ。

bash
mix local.hex
mix local.rebar

mix archive.install hex nerves_bootstrap

ssh-keygen

3.試しにBlinkyをビルドしてみる

さて、WSL2 Ubuntu上の Nerves開発環境がちゃんと使えるか試してみよう。
そうだなぁ、ターゲット・アプリは nerves_examplsの blinkyを使おう。

bash
git clone https://github.com/nerves-project/nerves_examples.git
cd nerves_examples/blinky

export MIX_TARGET=rpi
mix deps.get
mix firmware

ビルドは、依存モジュールやアーカイブのダウンロードを含め、ネイティブな Ubuntu上と変わらずにすんなりと通った。

では、SDカードへの書き込みは?

bash
mix burn

Windows側で、管理者承認のダイアログがポップアップして一瞬ドキッとしたが、すべて「はい」で応えれば「とっとっとっとっとっ」と無事SDカードへの書き込みが出来た。まぁ、難点は SDドライブの名称が、"\.\PhysicalDrive1"と物理ディスク名で表示されるところかな

4.まとめ

WSL2 Ubuntuで Nervesしてみたら、驚いたことにネイティブな Ubuntu上での操作性と殆ど変わらなかった。さらに、VS code & Remote WSL拡張で WSL2に接続すれば、ファイルの編集はもちろんターミナルで mixを叩くこともでき超快適であった。これまで Windows派は Nervesをしたくても蚊帳の外だったが、WSL2で道が拓けたんじゃなかろうかと思う。
感無量

PS. おっと、upload.shによるネットワークファームウェアアップデートは試してなかった(汗)