4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NervesのOTAファームウェア更新:mix uploadとupload.sh

Posted at

はじめに

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のパスワードや鍵確認のプロンプトに応答できないため、以下のようなエラーになります:

image.png

このような場合は、次に紹介する 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 uploadmix firmware.gen.scriptは、ssh_subsystem_fwup というパッケージで提供されています。

私はいつも upload.sh を使う派です。mix upload でエラーが出るたびに焦ってしまうので……記憶力にもあまり自信がなくて😅

おわりに

Nervesを使えば、複雑な仕組みを用意しなくても、Elixirで書いた組み込みアプリケーションをOTAで簡単に更新できます。

mix upload は手軽に使えますが、SSHまわりでの対話が必要な場合に躓くことがあります。そんなときは mix firmware.gen.script で生成される upload.sh を使えば、柔軟に対応できて安心です。

4
0
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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?