hotch-potch, Note to self

いろいろ作業記録

Nerves開発環境の準備・VM+Ubuntu環境でErlang & Elixirをパッケージインストール

■はじめに

7月に開催された「Nervesトレーニング in福岡」を受講してきました。
fukuokaex.connpass.com
事前に指示のあった環境構築での不備で色々詰まってしまい、ハンズオン前半の時間を浪費してしまったので、ハマリどころと回避策をまとめました。

ここでの説明概要

以下の手順を紹介しています。

  • Erlang & Elixirを、コンパイルでは無くパッケージからインストールする方法
  • VirtualBoxでNervesデバイスを認識できない場合に、RaspberryPiから書き込む方法
  • Nervesデバイスに書き込みが出来なくなったときに、ファームを丸ごと初期化する方法

■Nervesとは

Nervesは、組込みソフトウェア開発にElixirを使用するためのフレームワークです。

nerves-project.org
elixirschool.com

設備の制御に使われるPLCやラダー言語の置き換えが出来る可能性を秘めており、最近ぼちぼちと勉強しています。

開発環境としてMacLinuxが推奨されていますが、WindowsではVirtualBoxなどの仮想環境上に、UbuntuLinuxで開発環境を構築する事になります。

Erlang & Elixirのインストールは、ソースからのコンパイルで手順が紹介されてますが、非力なPCだと、VirtualBox上でのコンパイルは非常に困難です。
(私の場合は、メモリ不足でコンパイルが最後まで終わらない・・・ホストPCもメモリが少ないので小手先対策はキリが無い)


ここでは、手引きにて紹介されている方法の中で、Erlang & ElixirのインストールをDebianパッケージから行う方法をまとめました。

■実行環境

■Nerves開発環境の準備

Erlang & Elixirをインストールするまでの手順

ここまでは、こちらの章を参考に進めて下さい。

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


以上、ご参考頂けると幸いです。