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として表示されているものもあります。
最後まで動作を確認し、ログの詳細を確認してください。