ブログ

Armadillo Base OS:ビルドしたLinuxカーネル・DTBをSWUpdateを使って書き込む

at_takuma.fukuda
2022年1月10日 16時58分

ATDEでビルドしたLinuxカーネルやDTBをSWUpdateを使って書き込むまでの手順をご紹介します。

SWUpdate

SWUpdateとは

SWUpdateはStefano Babic, DENX software engineering, Germany によってオープンソースで開発が進められているソフトウェアです。ネットワーク/ストレージ経由でデバイスのソフトウェアを更新することができます。
Armadillo-IoT ゲートウェイ G4では、 SWUpdateを利用することで次のような機能を実現しています。

  • A/Bアップデート(アップデートの2面化)
  • リカバリーモード
  • ソフトウェアの圧縮、暗号化、署名付与
  • Web サーバー機能
  • hawkBit への対応
  • ダウングレードの禁止

swuイメージ

SWUpdateでソフトウェアの更新を行うために、swuイメージを用意します。
swuイメージは、SWUpdate独自のソフトウェアの配布フォーマットです。
SWUpdateでは、1回のアップデートは1つのswuイメージで行われます。

swuイメージには、次のようなものが含まれています。

  • アップデート対象のイメージファイル
  • アップデート対象のイメージファイルのチェックサム
  • アップデート前後に実行するスクリプト
  • 書き込み先ストレージの情報
  • U-Boot 環境変数の書き換え情報
  • ソフトウェアのバージョン情報
  • etc…

swuイメージを作成するために、mkswuというツールをご用意しています。
mkswuのインストールや鍵情報の作成などの基本操作については下記マニュアルをご参照ください
9.8.2. SWUイメージの作成
既にswupdate-mkimageを使ってswuイメージの作成を行われていた場合は、
鍵情報などをmkswuに引き継ぐことが出来ます。
上記リンク直下の「git のバージョンからアップデートする場合、 mkswu --import で以前使っていたコンフィグをロードしてください。」の部分をご参照ください。

descファイル

mkswuでswuイメージを作成するためにはdescファイルでの定義が必要となります。
descファイルでは様々なコマンドや変数が設定できます。
コマンドや変数については下記マニュアルに簡単に説明がございますのでご一読下さい。
9.8.5. mkswu の desc ファイル
また、「/usr/share/mkswu/examples/」内に様々なdescファイルのサンプルがありますので、
こちらをご活用いただくと、より簡単にオリジナルのdescファイルを作成できます。

LinuxカーネルとDTBの更新

ここから、実際にLinuxカーネルとDTBを更新するためのswuイメージの作成手順についてご紹介します。
この手順は以下を前提としております。
未完了の部分がございましたらマニュアルを参考にセットアップ願います。

  • ATDEがセットアップ済みであること
  • 書き込みたいLinuxカーネルとビルドツリーをビルド済みであること
  • mkswu がインストール済みであること
  • 署名鍵を生成済みであること
  • Armadilloに署名鍵を保存済みであること

desc ファイル作成とイメージファイル格納

Linuxカーネルとデバイスファイルを書き込むSWUファイルを作成するためのdescファイルは、あらかじめ用意されたスクリプトファイル「kernel_update_plain.install.sh」を使用することで自動生成することが出来ます。
このスクリプトファイルは「/usr/share/mkswu/examples」ディレクトリに格納されています。

※注意事項※
mkswu 4.10 以降から使えるようになったスクリプトなので、上記ディレクトリ内にスクリプトファイルが格納されていない場合は、以下のコマンドでmkswuを更新してください。

[PC ~]$ apt update && apt install mkswu

「kernel_update_plain.install.sh」スクリプトをLinuxカーネルのビルドディレクトリで実行することで、書き込むイメージファイルのコピーと desc ファイルの生成が行われます。

Linuxカーネルのビルドディレクトリに移動
[PC ~]$ cd linux-[VERSION]

生成するdesc ファイルのファイル名・ファイルパスを指定してスクリプト実行
この記事では「mkswu」ディレクトリの直下の「update-kernel.desc」としています
[PC ~/linux-[VERSION]]$ /usr/share/mkswu/examples/kernel_update_plain.install.sh ~/mkswu/kernel-update.desc
Installing kernel in /home/atmark/mkswu/kernel-update ...
'arch/arm64/boot/Image' -> '/home/atmark/mkswu/kernel-update/Image'
'arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dtb' -> '/home/atmark/mkswu/kernel-update/armadillo_iotg_g4.dtb'
: (省略)
  INSTALL arch/arm64/crypto/poly1305-neon.ko
  INSTALL drivers/block/loop.ko
: (省略)
  DEPMOD  [VERSION]
Updated /home/atmark/mkswu/kernel-update.desc version from 1 to [VERSION]
Done installing kernel, run `mkswu "/home/atmark/mkswu/kernel-update.desc"` next.

※注意事項※
descファイル生成時に指定したファイルが既に存在している場合、新しいファイルの生成に失敗することがありますので、
都度削除して生成し直すことをお勧めします。

swuイメージ作成

mkswuコマンドを実行し、swuイメージを作成します。
作成するファイルはデフォルトで desc ファイルと同じになりますので、この記事では「update-kernel.swu」とします。別のファイル名にしたい場合は 「-o <ファイル名>.swu」で設定してください。
また、先ほど作成したdescファイルの相対パスを引数に指定します。

[PC ~/mkswu]$  mkswu update-kernel.desc

実行してビルドが進むと、以下のメッセージが表示されますので、設定したパスワードを入力してください

Enter pass phrase for /home/atmark/mkswu/swupdate.key:

作成完了すると以下のメッセージが表示されます。

update-kernel.swu を作成しました

念のためlsコマンドでファイルが存在する事を確認してください。

[PC ~/mkswu]$ ls update-kernel.swu 
update-kernel.swu

SWUpdate実行

SWUpdateによるファイル書き込みの一例をご紹介します。
この記事ではUSBメモリを使った方法をご案内します。
その他の方法についてはマニュアルをご参照ください。

USBメモリ準備

USBメモリをATDEの動作しているPCに接続し、ATDEからUSBメモリにアクセスできるようにしてください。
VMWare WorkStation 15 PlayerでATDEが動作している場合、
Player->取り外し可能デバイス->任意のUSBメモリ->接続を選択してください。
東芝製USBメモリを使用した場合は、以下のようになります。 接続が完了すると、自動的にUSBメモリがマウントされます。
mountコマンドでファイルフォーマットを確認してください。

[PC ~/mkswu]$ mount
(中略)
/dev/sdb1 on /media/atmark/XXXXXXXX type vfat ←vfatでフォーマットされていることが確認出来ます。 (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)

vfatもしくはext4でフォーマットされていれば、そのままファイルのコピーに進みます。
ファイルフォーマットが違っている、また自動マウントされない等の場合は、
以下のページを参考にセットアップしてください。
ATDE上でUSBメモリ/SDカードのパーティションを作成・フォーマットする方法

swuイメージファイルのコピー

以下のようにコマンドを実行して、マウントされたUSBメモリにswuイメージファイルをコピーしてください。

[PC ~/mkswu]$ cp update-kernel/update-kernel.swu /media/atmark/XXXX/
[PC ~/mkswu]$ ls /media/atmark/XXXX/update-kernel.swu 
/media/atmark/XXXX/update-kernel.swu

ファイルコピー完了したら、umountコマンドを実行してUSBメモリをアンマウントしてください

[PC ~/mkswu]$ umount /dev/sdb1

アンマウント出来れば、USBメモリをPCから取り外せます。

SWUpdate自動実行

ファイルをコピーしたUSBメモリをArmadillo-IoT G4に接続すると、自動的にSWUpdateによるファイル更新が実行されます。
ファイル更新が完了すると再起動が行われます。
このとき、以下のような理由でSWUpdateが失敗する事がありますので、ご注意ください。

  • Armadillo-IoT G4内の鍵情報とswuイメージの鍵情報の不一致
  • Armadillo-IoT G4にパスワード未設定のアカウントがある

自動実行が行われなかった時

ArmadilloとPCをUSBケーブルで接続し、コンソールで以下のコマンドを実行すると、
実行ログを確認することが出来ます。

[armadillo]$ grep -i swupdate /var/log/messages

また、以下の手順で手動でSWUpdateを実行して、全てのログを確認することも出来ます。

USBメモリのマウント
[armadillo]$ mount /dev/sda1 /mnt
SWUpdate実行
[armadillo]$ swupdate -i /mnt/update-kernel.swu

表示されるログでは、正常動作であっても強調表示のためにERRORとして表示されているものもあります。
最後まで動作を確認し、ログの詳細を確認してください。