7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Elixir Nervesでオレオレシリアル番号をMicroSDに焼く

Last updated at Posted at 2021-10-02

Nervesデバイスに SSH 接続する場合、初期設定では2つの方法があります

  • ssh nerves.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ファームウェアをダウンロードする

環境変数を設定

  • 設定可能な環境変数のリスト
  • 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

解説 by @torifukukaiou

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

解説 by @torifukukaiou

MicroSDカードに焼かれた情報

Nerves.Runtime.serial_number/0Nerves.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」での成果です

ありがとうございます

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?