■はじめに
7月に開催された「Nervesトレーニング in福岡」を受講してきました。
fukuokaex.connpass.com
事前に指示のあった環境構築での不備で色々詰まってしまい、ハンズオン前半の時間を浪費してしまったので、ハマリどころと回避策をまとめました。
ここでの説明概要
以下の手順を紹介しています。
- Erlang & Elixirを、コンパイルでは無くパッケージからインストールする方法
- VirtualBoxでNervesデバイスを認識できない場合に、RaspberryPiから書き込む方法
- Nervesデバイスに書き込みが出来なくなったときに、ファームを丸ごと初期化する方法
■Nervesとは
Nervesは、組込みソフトウェア開発にElixirを使用するためのフレームワークです。
nerves-project.org
elixirschool.com
設備の制御に使われるPLCやラダー言語の置き換えが出来る可能性を秘めており、最近ぼちぼちと勉強しています。
開発環境としてMacやLinuxが推奨されていますが、WindowsではVirtualBoxなどの仮想環境上に、UbuntuLinuxで開発環境を構築する事になります。
Erlang & Elixirのインストールは、ソースからのコンパイルで手順が紹介されてますが、非力なPCだと、VirtualBox上でのコンパイルは非常に困難です。
(私の場合は、メモリ不足でコンパイルが最後まで終わらない・・・ホストPCもメモリが少ないので小手先対策はキリが無い)
ここでは、手引きにて紹介されている方法の中で、Erlang & ElixirのインストールをDebianパッケージから行う方法をまとめました。
■実行環境
- Windows10
- 本体メモリ4G
- Oracle Virtual Box 6
- メモリ1G
- Ubuntu Linux 18.04
■Nerves開発環境の準備
Erlang & Elixirのインストール
下準備
こちらを参考に、パッケージを取得する準備をします
~$ cd Download ~/Download$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb ~/Download$ sudo apt-get update
インストールするErlang & Elixirパッケージのバージョン確認
現在のNervesの推奨バージョンは、Erlang OTPは21系,Elixirは1.8.1が指定されています。
(バージョンを合わせておかないと、mixでビルドするときにエラーとなります)
こちらの手順通りにインストールしてしまうと、(現時点で最新の)22系が入ってしまいます。
ここでは、バージョン指定してパッケージをインストールする手順をまとめました。
まずは、実際にインストール可能なバージョンを調べます。
Erlang
~$ apt-cache showpkg esl-erlang | head -20 Package: esl-erlang Versions: 1:22.0.4-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1:22.0.3-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1:22.0.2-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1:22.0.1-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1:22.0-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1:21.3.8.4-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) (/var/lib/dpkg/status) 1:21.3.8.3-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1:21.3.8.2-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1:21.3.8.1-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) ・・・
21系列の最終版は「1:21.3.8.4-1」ですので、バージョンを指定してパッケージをインストールします。
~$ sudo apt install esl-erlang=1:21.3.8.4-1
Elixir
~$ apt-cache showpkg elixir | head Package: elixir Versions: 1.9.0-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-i386_Packages) 1.8.2-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1.8.1-2 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) 1.8.1-1 (/var/lib/apt/lists/binaries.erlang-solutions.com_debian_dists_bionic_contrib_binary-amd64_Packages) (/var/lib/dpkg/status) ・・・
1.8.1系列の最終版は「1.8.1-2」ですので、バージョンを指定してパッケージをインストールします。
~$ sudo apt install elixir=1.8.1-1
きちんとインストールされているかは、下記で確認できます.
~$ iex Erlang/OTP 21 [erts-10.3.5.3] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe] Interactive Elixir (1.8.1) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> :observer.start :ok iex(2)>
■パッケージインストール以降の手順
以降は、そのままの手順で進められます。
こちらの流れに従って、進めて下さい。
■その他の覚え書き
(その1)ラズパイからNervesデバイスにファームウェアを書き込む
「Nervesトレーニング in福岡」では、私の環境では結局、VirtualBoxからNervesデバイスを認識することが出来ませんでした。
たまたま持ち込んでいたRaspberryPi3+(Raspbian)からは、正常にSSH通信までできたので、ソフト開発・ビルドまではUbuntu on VirtualBox、書き込みはRaspbianから行って、何とかハンズオンを継続しました。
あまりスマートな回避策では無いのですが、似たような状況に逢った場合に、ご参考下さい。
インストール
pi@raspi3:~ $ cd Download pi@raspi3:~/Download $ wget https://github.com/fhunleth/fwup/releases/download/v1.3.1/fwup_1.3.1_armhf.deb pi@raspi3:~/Download $ sudo dpkg -i fwup_1.3.1_armhf.deb
書き込み実行例
ワークフォルダを、予めRaspberryPiにコピーしておきます。
(SCPとかで丸ごとコピー、あるいは、sshfs or sambaで共有とか)
pi@raspi3:~ $ ./upload.sh Path: ./_build/rpi0_dev/nerves/images/nerves_team_device.fw Product: nerves_team_device 0.1.0 UUID: 509b4be2-5b70-58fd-d8a3-cae6ccd01052 Platform: rpi0 Uploading to nerves.local... Warning: Permanently added '[nerves.local]:8989,[172.31.168.185]:8989' (RSA) to the list of known hosts. Running fwup... fwup: Upgrading partition A |====================================| 100% (23.58 / 23.58) MB Success! Elapsed time: 14.991 s Rebooting... Received disconnect from 172.31.168.185 port 8989:11: Terminated (shutdown) by supervisor Disconnected from 172.31.168.185 port 8989 pi@raspi3:~ $
(その2)ファームの書き直し
色々いじっていて、書き込めなくなったり、sshでログインできなくなったりしたら、おとなしくファームを初期化しましょう。
(私の場合は、sshの公開鍵をNervesデバイスに設定し忘れて、ログインできなくなった・・・)
Nervesデバイスから、SDカードを取り出して、RaspberryPiに接続します。
SDカードの認識は、 fwup コマンドが勝手に探してくれます。
~ $ sudo fwup class_firmware.fw
class_firmware.fw
は、ハンズオンで配布されるファイル「Lonestar-Nerves.zip」の中の下記フォルダに保管されてます。
\Lonestar-Nerves\Lonestar\class_firmware.fw
以上、ご参考頂けると幸いです。