Armadilloフォーラム

swupdateを実行すると/usr/libexec/mkswu/post.shでエラーが発生する

tkhrosm

2024年7月16日 17時02分

お世話になっております。swupdateで内部スクリプトにてエラーが発生したため相談の連絡をいたしました。

環境
- 開発環境:ATDE9
- デバイス:Armadillo-IoT G4
- base-os:baseos-x2-3.19.2-at.5
- mkswu:5.3

swuファイルを作成してデバイスにてswupdate -i を実行したところ、以下のエラーが発生しました。

[ERROR] : SWUPDATE failed [0] ERROR : /usr/libexec/mkswu/post.sh: local: line 60: not in a function
[ERROR] : SWUPDATE failed [1] Installation failed (post)!
[INFO ] : No SWUPDATE running :  Waiting for requests...
[ERROR] : SWUPDATE failed [0] ERROR : SWUpdate *failed* !

エラーメッセージを参考に使用しているArmadillo-IoT G4の/usr/libexec/mkswu/post.shを確認したところ、

#!/bin/sh
~ 略 ~
case "$post_action" in
        ~ 略 ~
wait)
        stdout_info_or_error echo "swupdate waiting until external reboot"
        # tell the world we're ready to be killed
        touch /run/swupdate_waiting
        # marker in /tmp are kept for compatibility until 2025/04
        # touch -h isn't 100% race-free, use mktemp + mv instead... (ignore errors)
        local tmp
        tmp=$(mktemp /tmp/.swupdate_waiting.XXXXXX) && mv "$tmp" /tmp/.swupdate_waiting
        kill_old_swupdate
        ;;
        ~ 略 ~
esac

エラーメッセージの通り、"local tmp"が関数の外での使用となっていました。
そこで該当する行を含むcase分を関数化して呼び出す形に書き換えたところ、swupdateが通るようになりました。

本エラーの原因となる開発に心当たりがないため根本的な解決ができず、対応方法に悩んでいます。
該当箇所はABOSの実装範囲という認識でよろしいでしょうか。
解決に向けてアドバイス等ございましたらお聞きできればと思います。

よろしくお願いします。

コメント

at_dominique.m…

2024年7月17日 8時47分

tkhrosmさん

お世話になっております、
マルティネです。

> エラーメッセージの通り、"local tmp"が関数の外での使用となっていました。
> そこで該当する行を含むcase分を関数化して呼び出す形に書き換えたところ、swupdateが通るようになりました。

お手数をおかけして大変申し訳ございません。
この不具合はすでに修正済みですが、この問題がみためより重要ではないため際リリースしてませんでした。

原因としてはおっしゃるとおりに local tmp を関数外に使ってしまったことでエラーしますが、
このタイミングは POST_ACTION=wait を使用した際でインストールは実際にちゃんと完了している状態で発生しますので、
無視していいです。
再起動するとこのアップデートがちゃんとインストールされていますし、二つ目のアップデートを防いでいます。

細かいところまで説明すると、古いバージョンの適合性用の /tmp/.swupdate_waiting が生成されないですが、
新しい /run/swupdate_waiting がちゃんと存在しますので、
そちらのファイルで判断していただければ swupdate が終了したステータスと関係なく終了した時点で再起動できます。

POST_ACTION=wait の実際の使い方は難しくて、2023年11月までは swupdate がそもそも終了してなかったですし、
2024年4月までは成功の場合でもエラーで停止していたので、社内のテストでは成功ステータスを確認してなかったです…
テスト不足ですみませんでした。
これからはちゃんと POST_ACTION=wait でも成功の場合でいつでも再起動可能ということにします。

エラーを無視したくない場合は mkswu を更新していただいてから swu を再生成するとエラーが発生しなくなります:

atmark@atde9:~$ git clone https://github.com/atmark-techno/mkswu mkswu-repo
atmark@atde9:~$ cd mkswu-repo
atmark@atde9:~/mkswu-repo$ sudo make install_mkswu
atmark@atde9:~/mkswu-repo$ mkswu --version
mkswu バージョン 6.2.1.3.g0b540d4

よろしくお願いします

tkhrosm

2024年7月18日 11時55分

マルティネさん
お世話になっております。

> > エラーメッセージの通り、"local tmp"が関数の外での使用となっていました。
> > そこで該当する行を含むcase分を関数化して呼び出す形に書き換えたところ、swupdateが通るようになりました。
>
> お手数をおかけして大変申し訳ございません。
> この不具合はすでに修正済みですが、この問題がみためより重要ではないため際リリースしてませんでした。
>
> 原因としてはおっしゃるとおりに local tmp を関数外に使ってしまったことでエラーしますが、
> このタイミングは POST_ACTION=wait を使用した際でインストールは実際にちゃんと完了している状態で発生しますので、
> 無視していいです。
> 再起動するとこのアップデートがちゃんとインストールされていますし、二つ目のアップデートを防いでいます。
>
> 細かいところまで説明すると、古いバージョンの適合性用の /tmp/.swupdate_waiting が生成されないですが、
> 新しい /run/swupdate_waiting がちゃんと存在しますので、
> そちらのファイルで判断していただければ swupdate が終了したステータスと関係なく終了した時点で再起動できます。
>
> POST_ACTION=wait の実際の使い方は難しくて、2023年11月までは swupdate がそもそも終了してなかったですし、
> 2024年4月までは成功の場合でもエラーで停止していたので、社内のテストでは成功ステータスを確認してなかったです…
> テスト不足ですみませんでした。
> これからはちゃんと POST_ACTION=wait でも成功の場合でいつでも再起動可能ということにします。
>

エラーとして表示されるものの、インストールは正常に完了しているとのことで承知しました。
再起動後に更新できていることを確認できました。ありがとうございます。

>
> エラーを無視したくない場合は mkswu を更新していただいてから swu を再生成するとエラーが発生しなくなります:
>

mkswuの最新版ではエラーが発生しないよう対応済みだったのですね。確認できておらずお騒がせしました。

ご回答ありがとうございました。