ブログ

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

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

ATDEでビルドしたLinuxカーネルやDTBを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.7.2. SWUイメージの作成
既にswupdate-mkimageを使ってswuイメージの作成を行われていた場合は、
鍵情報などをmkswuに引き継ぐことが出来ます。
上記リンク直下の「git のバージョンからアップデートする場合、 mkswu --import で以前使っていたコンフィグをロードしてください。」の部分をご参照ください。

descファイル

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

LinuxカーネルとDTBの更新

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

  • ATDEがセットアップ済みであること
  • 既に書き込みたいLinuxカーネルとDTBがビルド済であること
  • swupdate-mkimageがダウンロード済みであること
  • 署名鍵を生成済みであること
  • Armadilloに署名鍵を保存済みであること

ディレクトリ作成

Linuxカーネルイメージ、DTBファイル、descファイルを格納するディレクトリを作成します。
ディレクトリ名には任意の名称を設定します。この記事では「mkswu」ディレクトリの直下に「update-kernel」というディレクトリ名としています。

[PC ~/mkswu]$ mkdir update-kernel

イメージファイル格納

作成したディレクトリに、ビルドしたLinuxカーネルイメージファイルとDTBファイルを格納します。
この記事では、「Linuxカーネルイメージ:Image」と「DTB:armadillo_iotg_g4.dtb」を書き込むこととします。

descファイル作成

LinuxカーネルとDTBを書き込むためのdescファイルを作成します。
「/usr/share/mkswu/examples/」内のkernel_update_plain.descをコピーして作成します。
descファイルには任意の名称を設定します。この記事では「update-kernel.desc」というファイル名とします。

[PC ~/mkswu]$ cp /usr/share/mkswu/examples/kernel_update_plain.desc update-kernel/update-kernel.desc

コピーしたファイルを編集します。

[PC ~/mkwsu]$ vi update-kernel/update-kernel.desc
# write over files in /boot
# any different version from current system's (based on sw-versions)
# will be installed
swdesc_files --version extra_os.kernel 5.10.0-1 --dest /boot \
        "Image" "armadillo_iotg_g4.dtb"←ここで書き込みたいファイルのファイルパス(descファイルからの相対パス、もしくはフルパス)を記載します。
 
# add the kernel to files to be preserved on OS update
swdesc_command --version extra_os.kernel 5.10.0-1 \
        'grep -qE "^POST /boot" /etc/swupdate_preserve_files || echo -e "POST /boot\nPOST /lib/modules" >> /etc/swupdate_preserve_files'

2022年1月30日現在、当社から配布しているArmadillo-IoT G4向けのArmadillo Base OSには、/bootディレクトリに「armadillo.dtb」という名前で、「armadillo_iotg_g4.dtb」へのシンボリックリンクが配置されています。
このため、この手順ではビルドしたDTBファイルを「armadillo_iotg_g4.dtb」というファイル名に変更しています。

swuイメージ作成

mkswuコマンドを実行し、swuイメージを作成します。
実行時に-oオプションで作成するパッケージのファイル名を指定します。
作成するファイルは任意のファイル名を指定できます。この記事では「update-kernel.swu」とします。
また、先ほど作成したdescファイルの相対パスを引数に指定します。

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

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

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

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

Successfully generated 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.desc /media/atmark/XXXX/
[PC ~/mkswu]$ ls /media/atmark/XXXX/update-kernel.desc 
/media/atmark/XXXX/update-kernel.desc

ファイルコピー完了したら、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]$ tail /var/log/messages

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

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

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