👏

RAUCとHawkbitでOTA配信システムを作ってみる

2024/03/24に公開

RAUCとYoctoでアップデートできる環境ができたので、これをOTAで配信できる方法を作ってみます。

Hawkbitサーバの構築

ubunutu 22.04だとsnapで簡単に構築できます。以下の通りsnapを使ってインストールします。

sudo snap install hawkbit

インストールが終わったらhawkbitの設定を行います。必要な設定は以下の通り。

項目 設定値 説明
address 0.0.0.0 接続先アドレス。0.0.0.0を指定すると他から接続できるようになる
port 8800 接続ポート番号
username "admin" ユーザー名。デフォルトはadmin
password "admin" パスワード。デフォルトはadmin

設定を変更するには以下のコマンドを使って行います。

sudo snap set hawkbit address=0.0.0.0

設定の確認は以下のコマンドで行います。

sudo snap get -d hawkbit

出力結果は以下のようになります。

{
        "address": "0.0.0.0",
        "password": "admin",
        "port": 8800,
        "username": "admin"
}

設定が終わったらIPアドレスとポート番号を指定してWebブラウザでアクセスします。
正常に動作していれば以下のようにログイン画面が表示されます。

設定したユーザー名、パスワードでログインします。ログインが成功すると設定画面が表示されます。

ターゲットからのアクセス方法の設定

次にターゲットからHawkbitサーバにアクセスするための方法を設定します。[System Configuration]-[Authentication Configuration]の中の[Allow targets to authenticate directly with their target security token]のチェックをつけ、保存します。(保存は下までスクロールしてディスクのアイコンをクリック)

ターゲットの作成

アップデータを配信するターゲットを作成します。
[Deployment]を選び、下図の赤丸にある+アイコンをクリックします。

下記のダイアログが表示されるので必要な項目を記載して[Save]をクリックします。
Controller IDは後で設定するrauc-hawkbit-updaterの設定ファイルの[target_name]と同じものを記載します。ここではデフォルト設定であるtest-targetを設定します。[Name]と[Description]には管理しやすい情報を記載します。

ターゲットを作成すると、Security Tokenが作成されます。これを後程説明する設定ファイルのauth_tokenに設定します。

rauc-hawkbit-updaterの組み込み

※yocto側の操作です。
lovcal.confにrauc-hawkbit-updater/raucが追加されているか確認します。

IMAGE_INSTALL:append = " rauc-hawkbit-updater"

rauc-hawkbit-updaterの設定ファイルの修正

※Raspberry Pi 4Bのイメージ上での操作です。

/etc/rauc-hawkbit-updater/config.confの内容を修正します。
hawkbit_server、auth_tokenの部分を修正します。以下にデフォルトの内容を記載しておきます。

[client]
# host or IP and optional port ← ここ修正
hawkbit_server            = 10.10.0.254:8080

# true = HTTPS, false = HTTP
ssl                       = false

# validate ssl certificate (only use if ssl is true)
ssl_verify                = false

# Tenant id
tenant_id                 = DEFAULT

# Target name (controller id)
target_name               = test-target

# Security token ←ここ修正
auth_token                = cb115a721af28f781b493fa467819ef5

# Or gateway_token can be used instead of auth_token
#gateway_token             = cb115a721af28f781b493fa467819ef5

# Temporay file RAUC bundle should be downloaded to
bundle_download_location  = /tmp/bundle.raucb

# Do not download bundle, let RAUC use its HTTP streaming feature instead
#stream_bundle             = true

# time in seconds to wait before retrying
retry_wait                = 60

# connection timeout in seconds
connect_timeout           = 20

# request timeout in seconds
timeout                   = 60

# time to be below "low_speed_rate" to trigger the low speed abort
low_speed_time            = 0

# average transfer speed to be below during "low_speed_time" seconds
low_speed_rate            = 0

# reboot after a successful update
post_update_reboot        = false

# debug, info, message, critical, error, fatal
log_level                 = message

# Every key / value under [device] is sent to HawkBit (target attributes),
# and can be used in target filter.
[device]
mac_address               = ff:ff:ff:ff:ff:ff
hw_revision               = 2
model                     = T1

設定の変更が終わったら以下のコマンドでサービスを再起動します。

systemctl restart rauc-hawkbit-updater.service

再起動後、以下のコマンドを実行し、サービスが正常に動作していることを確認します。

systemctl status rauc-hawkbit-updater.service

実行結果は以下の通り。

● rauc-hawkbit-updater.service - HawkBit client for Rauc
     Loaded: loaded (/lib/systemd/system/rauc-hawkbit-updater.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-03-19 09:14:14 UTC; 1min 20s ago
   Main PID: 326 (rauc-hawkbit-up)
     Status: "Init completed, start polling HawkBit for new software."
      Tasks: 1 (limit: 3931)
     CGroup: /system.slice/rauc-hawkbit-updater.service
             └─ 326 /usr/bin/rauc-hawkbit-updater -s -c /etc/rauc-hawkbit-updater/config.conf

Mar 19 09:14:14 raspberrypi4-64 systemd[1]: Started HawkBit client for Rauc.
Mar 19 09:14:15 raspberrypi4-64 rauc-hawkbit-updater[326]: Checking for new software...
Mar 19 09:14:15 raspberrypi4-64 rauc-hawkbit-updater[326]: No new software.

Updateファイルの登録

[Upload]を選択し、Software Moduleの+(下図の赤い丸の部分)をクリックします。

クリックすると下図のようなダイアログが表示されるので、項目を記載します。
記載が終わったら[Save]をクリックして保存します。

保存が終わったら、先ほど作成したSoftware Moduleが選択されていることを確認します。選択されていたら画面左下側にある[Drop Files to Upload]と記載があるところに作成したバンドルをドラッグ&ドロップで指定します。指定するとファイルのアップロードが始まります。

画面の右側にアップロードしたファイルが表示されます。このようにしてSoftware Moduleと実際のアップデートファイルの紐づけを行います。

Distributionの登録

[Distributions]をクリックし、Distributionsのパネルにある+アイコンをクリックし、ディストリビューションを作成します。

作成後、右側のSoftware Moduleから配布するイメージを選択し、作成したDhisutributuiionの項目にドラッグします。

確認ダイアログが表示されるので、OKをクリックすると紐づけが行われます。

ターゲットへのデプロイ

[Deployment]を選択します。先ほど作成したTargetとDistributionが表示されていることを確認します。

Distributionで配信するものを選択し、配信するターゲットにドラッグします。

配信方法を選択するダイアログが表示されます。方法を指定し、OKをクリックします。

クリックすると配信動作が設定され、指示された通りに配信が行われます。
配信の状況は画面左側の[Action history for xxx](xxxはターゲットの名前)

これでRaspberry Piにアップデートが配信されます。

その他

  • rauc-hawkbit-updaterの設定でstream_bundle=trueとすると、hawkbitサーバからHTTP Streamを使ってアップデートを行うようになります。
  • rauc-hawkbit-updaterの設定でpost_update_reboot=trueと設定するとアップデートが終わった後再起動を自動で行います。
  • 外部からアップデートの状況を見る場合、RAUCがD-bus経由でいろいろ情報をお知らせしてくれるのでそれを見るのがよさそう

以上でアップデートの配信システムが構築できました。
結構複雑なので、簡単なものであれば独自のバージョン管理+RAUCだけのほうが楽かもしれません。そこは規模と台数で検討してください。

Discussion