Nervesデバイスに SSH 接続する場合、初期設定では2つの方法があります
-
ssh nerves.local
- Nervesデバイスがネットワーク上に 1 台だけの場合、これが便利
- 簡単に
nerves.local
の名前をorenonerves.local
にすることも可能
-
ssh nerves-<4 digit serial#>.local
- Nervesデバイスがネットワーク上に複数ある場合、シリアル番号の下 4 桁で識別できてヨシ
$ ssh nerves.local
$ ssh nerves-1cef.local
手持ちのボードの数が増えてくるとそれらを識別する必要が出てきます
「シリアル番号の下 4 桁」が手っ取り早く便利なのですが、暗記するのが難しいという問題があります
シリアル番号を自分で指定できれば、より便利になると思いますし、直感的に各デバイスにアクセスできる気がします
やり方
安定のNerves Livebookのファームウェアを利用して自分の好きなシリアル番号をMicroSDに焼き付ける方針にしました
そうすることにより、自分で provisioning.conf
を設定することが不要になります
当初、既存の Nerves プロジェクトに provisioning.conf
ファイルを追加し、Nerves Livebookをみようみまねで設定しようとしましたが、うまくいきませんでした
かなり前のバージョンNerves v1.2.0から provisioning.conf
ファイルを設定できるようになったようなので、Nerves Livebook でなくてもできるはずなのですが。。。
準備
@torifukukaiou (also known as Awesome さん)の記事が参考になると思います
Nerves Livebookファームウェアをダウンロードする
-
ここからお手持ちのターゲットに合致する
.fw
ファイルを選択 - 解説 by @torifukukaiou
環境変数を設定
- 設定可能な環境変数のリスト
-
NERVES_SERIAL_NUMBER
に自分の好きな文字列を指定すると、その文字列が「シリアル番号下 4 桁」の代わりに使用されます
export NERVES_SERIAL_NUMBER='mn40'
USB ガジェットモードまたは Ethernet ケーブルを利用して接続する場合にはなくてもよいのですが、この段階(MicroSD を焼く前)WiFi の設定も MicroSDに渡して置くと後に Wifi の設定が不要になり便利です
export NERVES_WIFI_SSID='my-wifi-id'
export NERVES_WIFI_PASSPHRASE='my-wifi-password'
Nerves Livebookファームウェアを MicroSDカードに焼く
- 前項で準備した環境変数とともにダウンロードしたNerves Livebookファームウェアを MicroSDカードに焼きます
$ cd place/the/fw/file/is/located
$ fwup nerves_livebook_rpi4.fw
Use 15.98 GB memory card found at /dev/rdisk3? [y/N] y
100% [====================================] 51.94 MB in / 59.50 MB out
Success!
Elapsed time: 10.123 s
MicroSDカードをターゲットに挿入し電源 ON
焼き上がったMicroSDカードをターゲット(Raspberry Pi)に挿入し電源 ON
通信のテストをおこないます
ping nerves.local
(初期設定)とping nerves-mn40.local
(カスタム)のどちらでも接続されると思います
$ ping nerves.local
PING nerves.local (10.0.0.179): 56 data bytes
64 bytes from 10.0.0.179: icmp_seq=0 ttl=64 time=13.355 ms
64 bytes from 10.0.0.179: icmp_seq=1 ttl=64 time=9.767 ms
64 bytes from 10.0.0.179: icmp_seq=2 ttl=64 time=9.744 ms
...
$ ping nerves-mn40.local
PING nerves-mn40.local (10.0.0.179): 56 data bytes
64 bytes from 10.0.0.179: icmp_seq=0 ttl=64 time=3.113 ms
64 bytes from 10.0.0.179: icmp_seq=1 ttl=64 time=9.616 ms
64 bytes from 10.0.0.179: icmp_seq=2 ttl=64 time=2.579 ms
...
ssh 接続
$ ssh root@nerves-mn40.local
MicroSDカードに焼かれた情報
Nerves.Runtime.serial_number/0
とNerves.Runtime.KV.get_all/0
等を用いて、書き込まれた設定を確認できます
後に別のファームウエアをアップロードしてもMicroSDカードに焼かれた情報は保持されるようです
iex> Nerves.Runtime.serial_number
"mn40"
iex> Nerves.Runtime.KV.get_all
%{
...
"nerves_serial_number" => "mn40",
"wifi_force" => "",
"wifi_passphrase" => "xxxx",
"wifi_ssid" => "xxxx"
}
iex> :inet.gethostname
{:ok, 'nerves-mn40'}
iex> MdnsLite.Info.dump_records
<interface_ipv4>.in-addr.arpa: type PTR, class IN, ttl 120, nerves-mn40.local
<interface_ipv6>.ip6.arpa: type PTR, class IN, ttl 120, nerves-mn40.local
_epmd._tcp.local: type PTR, class IN, ttl 120, nerves-mn40._epmd._tcp.local
_services._dns-sd._udp.local: type PTR, class IN, ttl 120, _epmd._tcp.local
_services._dns-sd._udp.local: type PTR, class IN, ttl 120, _sftp-ssh._tcp.local
_services._dns-sd._udp.local: type PTR, class IN, ttl 120, _ssh._tcp.local
_sftp-ssh._tcp.local: type PTR, class IN, ttl 120, nerves-mn40._sftp-ssh._tcp.local
_ssh._tcp.local: type PTR, class IN, ttl 120, nerves-mn40._ssh._tcp.local
nerves-mn40._epmd._tcp.local: type SRV, class IN, ttl 120, priority 0, weight 0, port 4369, nerves-mn40.local.
nerves-mn40._epmd._tcp.local: type TXT, class IN, ttl 120
nerves-mn40._sftp-ssh._tcp.local: type SRV, class IN, ttl 120, priority 0, weight 0, port 22, nerves-mn40.local.
nerves-mn40._sftp-ssh._tcp.local: type TXT, class IN, ttl 120
nerves-mn40._ssh._tcp.local: type SRV, class IN, ttl 120, priority 0, weight 0, port 22, nerves-mn40.local.
nerves-mn40._ssh._tcp.local: type TXT, class IN, ttl 120
nerves-mn40.local: type A, class IN, ttl 120, addr <interface_ipv4>
nerves-mn40.local: type AAAA, class IN, ttl 120, addr <interface_ipv6>
nerves.local: type A, class IN, ttl 120, addr <interface_ipv4>
nerves.local: type AAAA, class IN, ttl 120, addr <interface_ipv6>
:ok
別のファームウェアのアップロード
後に別のファームウェアをアップロードしたい場合でもMicroSDカードを抜き差し不要です
シリアル番号がMicroSDカードに焼き付けるられているので、それさえ覚えていれば通信でファームウェアのアップロードできるのです
# ファームウェアをアップロードするためのスクリプトを生成(PJごとに1回)
$ mix firmware.gen.script
# ファームウェアをビルド
$ mix firmware
# ファームウェアをアップロード
$ sudo ./upload.sh nerves-mn40.local
さいごに
手元にはラズパイが5台程ありますが、それぞれに名前をつけられて、管理しやすくなりました
# rpi0
mn00
mn01
mn02
...
# rpi4
mn40
...
以前は各デバイスに固定IPを割り当てていました時期もありました
Elixir のリモートもくもく会「autoracex」での成果です
ありがとうございます