はじめに
Nervesは、組み込みElixirアプリケーションのための強力なフレームワークです。その中でも特筆すべき機能の一つがOTA(Over The Air)でのファームウェア更新です。
Nervesデバイスにファームウェアを書き込む方法は大きく2通りあります:
-
mix uploadタスクを使う方法 -
upload.shスクリプト(mix firmware.gen.scriptで生成)を使う方法
mix upload タスク
NervesでビルドしたファームウェアをSSH経由でデバイスに送信する最もシンプルな方法が、mix upload タスクです。
まず、通常の流れは以下の通りです:
MIX_TARGET=rpi4 mix firmware
MIX_TARGET=rpi4 mix upload nerves.local
これで、デバイスにOTA(Over The Air)でファームウェアが転送されます。
ほとんどの場合は問題なく動作しますが、以下のようなケースで失敗することがあります:
- SSH秘密鍵にパスフレーズが設定されていて、対話的入力が求められる
- デバイスのホスト鍵が更新された(例:SDカードを焼き直したあと)
その場合、mix upload はSSHのパスワードや鍵確認のプロンプトに応答できないため、以下のようなエラーになります:
このような場合は、次に紹介する upload.sh が便利です。
upload.sh スクリプト
mix upload に代わるもう一つの方法が、upload.sh スクリプトです。こちらは、mix firmware.gen.script コマンドで生成されるシェルスクリプトで、SSHを使ってファームウェアを送信するという点では同じですが、ターミナルでの対話が可能なため、より柔軟に動作します。
以下の点で mix upload よりも信頼性が高く、安心して使えます:
- SSHパスワードや秘密鍵のパスフレーズの入力に対応
- デバイスのホスト鍵が変わった場合でも柔軟に接続できる
- 任意の
.fwファイルやホスト名を指定可能 - 複数デバイスに使い回せるため、自動化や量産にも向いている
まず、Nervesプロジェクト内で以下を実行してスクリプトを生成します:
mix firmware.gen.script
その後、以下のように実行します:
./upload.sh nerves.local
mixタスクの定義元
Nervesでは、 mix firmware.* 系のタスクは nerves 本体で提供されています。
一方、mix uploadやmix firmware.gen.scriptは、ssh_subsystem_fwup というパッケージで提供されています。
私はいつも upload.sh を使う派です。mix upload でエラーが出るたびに焦ってしまうので……記憶力にもあまり自信がなくて😅
おわりに
Nervesを使えば、複雑な仕組みを用意しなくても、Elixirで書いた組み込みアプリケーションをOTAで簡単に更新できます。
mix upload は手軽に使えますが、SSHまわりでの対話が必要な場合に躓くことがあります。そんなときは mix firmware.gen.script で生成される upload.sh を使えば、柔軟に対応できて安心です。
