はじめに
Raspberry Pi Connectは、遠隔地のRaspberry Piをブラウザから操作できるサービスです。
実は、遠隔地のラズパイへ更新を適用するリモートアップデート(OTA)機能も利用できます。
本記事では、OTAのセットアップとプログラムの更新手順を紹介します。
機能の詳細は、公式ブログおよび公式ドキュメントをご覧ください。
今回行うこと
対象ラズパイに配置したPythonプログラムを、OTAで差し替えます。
更新前:version 1.0 と表示
更新後:version 2.0 と表示
Raspberry Pi Connectの更新方式
Raspberry Pi Connectのリモートアップデートには、スクリプト方式とA/B方式があります。
スクリプト方式
シェルスクリプトを使ってファイルの差し替えやパッケージの更新などを行います。
通常のRaspberry Pi OSで利用できますが、更新に失敗した場合の自動復旧には対応していません。
A/B方式
更新前と更新後のシステムをストレージ上にそれぞれ保持します。
更新後のシステムで起動できない場合は、更新前のシステムへ戻せますが、専用のOSイメージとパーティション構成が必要です。
本記事では、スクリプト方式を使ってプログラムを更新します。
実行環境
操作用PC
- Windows 11
- WSL2(Ubuntu 22.04)
- Python 3
対象ラズパイ
- Raspberry Pi 4 Model B
- Raspberry Pi OS(64bit)Trixie
- Raspberry Pi Connect
今回は基本操作に集中するため、PCとラズパイは同じネットワークに接続します。
実際に遠隔地のラズパイを更新する場合は、対象ラズパイからアクセスできるWebサーバーやファイルストレージが必要です。
事前準備
Raspberry Pi Connectへサインインし、対象ラズパイをデバイス登録しておきます。
設定方法は、以下の記事をご覧ください。
1. 対象ラズパイをセットアップする
まず、更新前プログラム/opt/ota-sample/main.pyを作成します。
sudo install -d /opt/ota-sample && echo 'print("version 1.0")' | sudo tee /opt/ota-sample/main.py > /dev/null
作成したプログラムを実行し、version 1.0と表示されればOKです。
mtx@raspberrypi:~$ python3 /opt/ota-sample/main.py
version 1.0
次に、OTAを有効化するために必要なパッケージをインストールします。
sudo apt update
sudo apt install rpi-connect-ota -y
インストール完了後、OTAを有効化します。
rpi-connect ota on
※有効化時にパスワードを求められた場合は、対象ラズパイのユーザーのパスワードを入力します。
最後に、Raspberry Pi ConnectのWeb画面を更新し、対象ラズパイに「Deploy」ボタンが表示されればセットアップは完了です。
2. Windowsで更新用ファイルを作成する
ファイルの作成はWindowsで行い、アーティファクトの生成をWSLから実行します。
Raspberry Pi Connectでは、対象ラズパイへ配布する更新スクリプトやファイルをまとめたものをアーティファクトと呼びます。
Windowsにota-sampleフォルダを作成し、ファイルを配置していきます。(パス例:C:\Users\<ユーザー名>\ota-sample)
まずは、更新後のプログラムを作成します。
print("version 2.0")
次に、ラズパイで実行される更新処理スクリプトを作成します。
#!/bin/sh
set -eu
if [ -f /opt/ota-sample/main.py ]; then
cp -a /opt/ota-sample/main.py /opt/ota-sample/main.py.bak
fi
install -m 0644 main.py /opt/ota-sample/main.py
echo "Update finished"
スクリプト方式には自動復旧の仕組みがないため、update.shでは更新前のファイルを.bakとして残しています。
アーティファクト内のスクリプトは、対象ラズパイ上でroot権限により実行されるためsudoは不要です。
Windowsで作成する場合、update.shの改行コードはLFで保存してください。CRLFで保存すると、ラズパイで実行できない場合があります。
続いて、アーティファクトの構成を定義するファイルを作成します。
artefact:
name: ota-sample
version: 2.0
device_type: rpi
payloads:
- name: main.py
type: tmpfile
- name: update.sh
type: script
YAMLでは、artefactにアーティファクトの名前・バージョン・対象機器を、payloadsに含めるファイルとその処理方法を定義します。
今回は、main.pyを一時ファイル(tmpfile)、update.shを実行対象のスクリプト(script)として指定します。
payloadsは上から順に処理されるため、update.shの実行時にmain.pyを参照できるよう、main.pyを先に記述します。
現時点でファイル構成は以下のようになっていればOKです。
ota-sample/
├── main.py
├── update.sh
└── ota-sample.yaml
3. WSLでアーティファクトを生成する
手順2で作成したスクリプトなどをアーティファクトとしてまとめるのに、Raspberry Pi公式が提供するotamakerを使用します。
otamakerは内部でLinuxのコマンド(tar、zstd)を使用するため、WSL上で実行します。
WSLでota-sampleフォルダへ移動し、Raspberry Pi公式のutilsリポジトリからotamakerを取得します。
cd /mnt/c/Users/<ユーザー名>/ota-sample
wget https://raw.githubusercontent.com/raspberrypi/utils/master/otamaker/otamaker
次に、WSLのota-sampleフォルダで、otamakerを実行します。
python3 otamaker ota-sample.yaml
実行するとアーティファクトとSHA-256が出力されます。
Contents:
_contents_.yaml
main.py
update.sh
Artefact: ota-sample.tar.zst
SHA256: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SHA-256は、Raspberry Pi Connectへアーティファクトを登録する際に使用するのでメモしておいてください。
4. Windowsでアーティファクトを公開する
対象ラズパイがアーティファクトをダウンロードできるように、PCで簡易HTTPサーバーを起動します。
WSL2の既定のNAT構成では、WSL上でHTTPサーバーを起動しても、LAN内の対象ラズパイからそのままアクセスできません。
今回は設定を簡単にするため、Windows側でHTTPサーバーを起動します。
まず、Windowsのターミナルでota-sampleフォルダへ移動し、以下コマンドを実行します。
cd C:\Users\<ユーザー名>\ota-sample
python -m http.server 8000
PCのIPアドレスが192.168.1.10の場合、アーティファクトのURLは次のようになります。
http://192.168.1.10:8000/ota-sample.tar.zst
次に、対象ラズパイでアーティファクトへアクセスできることを確認します。
curl -I http://192.168.1.10:8000/ota-sample.tar.zst
正常にアクセスできる場合は、次のように200 OKが表示されます。
HTTP/1.0 200 OK
デプロイ前に確認しておくと、URLやネットワーク設定によるダウンロードエラーを切り分けやすくなります。
5. Raspberry Pi Connectでデプロイする
まず、アーティファクトを登録するためにRaspberry Pi Connectへサインインし、「Remote update」画面を開きます。
「New」を選択し、作成したアーティファクトを登録します。
- Name:
ota-sample - URI:
http://192.168.1.10:8000/ota-sample.tar.zst - SHA-256:
otamakerが出力した値
入力後、「Create artefact」を押すとアーティファクトが登録されます。
一度でもデプロイした、またはデプロイを試行したアーティファクトは履歴保持のため削除できません。
Raspberry Pi公式ドキュメント
次に、対象ラズパイへデプロイするためにRaspberry Pi Connectの「Devices」画面を開き、「Deploy」ボタンを選択します。
続いて、登録したota-sampleを選び、デプロイを実行します。
デプロイの状態は、次のように変化します。
Pending
↓
In Progress
↓
Succeeded
対象ラズパイがオフラインの場合はPendingのまま待機し、次回オンラインになったときに更新が始まります。
画面が更新されない場合は、ブラウザを再読み込みしてください。
6. 更新結果を確認する
まず、デプロイ結果がSucceededになったことを確認します。
次に、対象ラズパイでプログラムを実行します。
mtx@raspberrypi:~$ python3 /opt/ota-sample/main.py
version 2.0
表示がversion 2.0に変わっていれば、プログラムの更新は成功です。
更新スクリプトの標準出力などは、対象ラズパイのsystemdジャーナルに記録されます。
必要に応じて、次のコマンドで確認します。
journalctl -t rpi-ota-connector
今回の更新では、ログにUpdate finishedが記録されます。
mtx@raspberrypi:~$ journalctl -t rpi-ota-connector | grep finished
Jul 28 15:29:20 raspberrypi rpi-ota-connector[2034]: output: Update finished
後片付け
HTTPサーバーを停止する
WindowsのターミナルでCtrl+Cを押し、簡易HTTPサーバーを停止します。
OTAを無効化する
リモートアップデートを使用しない場合、対象ラズパイで以下コマンドを実行して無効化できます。
rpi-connect ota off
まとめ
Raspberry Pi Connectのリモートアップデートをセットアップし、スクリプト方式でPythonプログラムを差し替えました。
更新スクリプトを書き換えれば、パッケージの追加や設定ファイルの変更にも応用できます。







