Help us understand the problem. What is going on with this article?

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

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

1.前準備

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

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

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

MicrosoftStore.png

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

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"と物理ディスク名で表示されるところかな:sweat:

4.まとめ

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

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

ShozF
C/C++,Python,Perl,TCL/TkときどきClojure マシンビジョン系プログラマの筈… RTOSを使用したマルチタスクシステムが得意かな
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away