Armadilloフォーラム

swupdateでswdesc_option NO_PRESERVE_FILESを指定した場合に失敗する

tokita.shinichi

2024年4月16日 14時46分

お世話になります。
swupdateでbase_osをアップデートする際に、開発時のファイルを残したくないため、descファイルのオプションにswdesc_option NO_PRESERVE_FILESを指定して実行したのですが、以下のようなエラーとなりできませんでした。

armadillo:~# swupdate -i /mnt/swu/xxx.swu
SWUpdate v2023.05_git20231025-r0
 
Licensed under GPLv2. See source distribution for detailed copyright notices.
 
[INFO ] : SWUPDATE running :  [main] : Running on AGX4500 Revision at1
[INFO ] : SWUPDATE started :  Software Update started !
[   70.788014] EXT4-fs (mmcblk2p1): mounted filesystem with ordered data mode. Opts: (null)
[INFO ] : SWUPDATE running :  [read_lines_notify] : Updating base os: copying swupdate_preserve_files
[ERROR] : SWUPDATE failed [0] ERROR : /usr/libexec/mkswu/pre.sh: /usr/libexec/mkswu/pre_rootfs.sh: line 351: can't create /target/etc/.rootfs_update_timestamp: nonexistent directory
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : /!\ Could not update rootfs timestamp
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR]swupdate_image_write failed: Broken pipe
 : SWUPDATE failed [1] Image invalid or corrupted. Not installing ...
[ERROR] : SWUPDATE failed [0] ERROR : SWUpdate *failed* !

エラーの原因について、ご教授いただければと思います。
swupdate -v -i file.swuの実行結果を以下に記載します。

armadillo:~# swupdate -v -i file.swu
[DEBUG] : SWUPDATE running :  [read_settings_file] : Reading config file /etc/swupdate.cfg
[DEBUG] : SWUPDATE running :  [read_module_settings] : Reading config settings for module globals
[TRACE] : SWUPDATE running :  [load_cert_chain] : Read PEM #1: /O=SWUpdate/CN=robin /O=SWUpdate/CN=robin
SWUpdate v2023.05_git20231025-r0
 
Licensed under GPLv2. See source distribution for detailed copyright notices.
 
[TRACE] : SWUPDATE running :  [print_registered_bootloaders] : Registered bootloaders:
[TRACE] : SWUPDATE running :  [print_registered_bootloaders] :  none    loaded.
[TRACE] : SWUPDATE running :  [main] : Using default bootloader interface: none
[DEBUG] : SWUPDATE running :  [load_decryption_key] : Read decryption key and initialization vector from file /etc/swupdate.aes-key.
[TRACE] : SWUPDATE running :  [lua_handlers_init] : External Lua handler(s) not found.
[TRACE] : SWUPDATE running :  [lua_report_exception] : Lua exception:
[TRACE] : SWUPDATE running :  [lua_report_exception] : [string "require ("swupdate_handlers")"]:1: module 'swupdate_handlers' not found:
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no field package.preload['swupdate_handlers']
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/local/share/lua/5.4/swupdate_handlers.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/local/share/lua/5.4/swupdate_handlers/init.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/local/lib/lua/5.4/swupdate_handlers.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/local/lib/lua/5.4/swupdate_handlers/init.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/share/lua/5.4/swupdate_handlers.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/share/lua/5.4/swupdate_handlers/init.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/lib/lua/5.4/swupdate_handlers.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/lib/lua/5.4/swupdate_handlers/init.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/share/lua/common/swupdate_handlers.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/share/lua/common/swupdate_handlers/init.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file './swupdate_handlers.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file './swupdate_handlers/init.lua'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/local/lib/lua/5.4/swupdate_handlers.so'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/local/lib/lua/5.4/loadall.so'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/lib/lua/5.4/swupdate_handlers.so'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file '/usr/lib/lua/5.4/loadall.so'
[TRACE] : SWUPDATE running :  [lua_report_exception] :  no file './swupdate_handlers.so'
[INFO ] : SWUPDATE running :  [main] : Running on AGX4500 Revision at1
[TRACE] : SWUPDATE running :  [print_registered_handlers] : Registered handlers:
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     dummy
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     archive
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     tar
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     lua
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     raw
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     rawfile
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     rdiff_image
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     rdiff_file
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     shellscript
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     preinstall
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     postinstall
[TRACE] : SWUPDATE running :  [print_registered_handlers] :     exec
[DEBUG] : SWUPDATE running :  [read_module_settings] : No config settings found for module versions
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed base_os: Version 3.18.6-at1-8
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed boot: Version 2020.4-at16-8
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed extra_os.initial_setup: Version 3
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed image_maintenance: Version 1-28
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed extra_os.image_maintenance: Version 1-28
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed extra_os.image_main: Version 1-28
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed image_main: Version 1-28
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed extra_os.root_dir: Version 0.0.6
[TRACE] : SWUPDATE running :  [read_sw_version_file] : Installed extra_os.connection: Version 1-6
[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/swupdateprog
[TRACE] : SWUPDATE running :  [network_initializer] : Main loop daemon
[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/sockinstctrl
Unable to open file.swu
コメント

at_dominique.m…

2024年4月16日 15時22分

tokita.shinichiさん

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

> swupdateでbase_osをアップデートする際に、開発時のファイルを残したくないため、descファイルのオプションにswdesc_option NO_PRESERVE_FILESを指定して実行したのですが、以下のようなエラーとなりできませんでした。

申し訳ございません、NO_PRESERVE_FILES は普通の rootfs で使用できないため確認不足になりました。
今月のアップデートで修正しますが、それまでは /usr/share/mkswu/scripts/pre_rootfs.sh に以下の様な変更を加えて mkswu でイメージを再生成していただければインストールできるようになるはずです:

diff --git a/scripts/pre_rootfs.sh b/scripts/pre_rootfs.sh
index 0636d0a86ad6..ea5b52d3f3a7 100644
--- a/scripts/pre_rootfs.sh
+++ b/scripts/pre_rootfs.sh
@@ -24,8 +24,6 @@ update_preserve_list() {
 
 	[ -n "$(mkswu_var NO_PRESERVE_FILES)" ] && return
 
-	mkdir_p_target /etc
-
 	if [ -e "/etc/swupdate_preserve_files" ]; then
 		cp /etc/swupdate_preserve_files "$list" \
 			|| error "Could not copy swupdate_preserve_files over"
@@ -335,6 +333,7 @@ mount_target_rootfs() {
 	touch /target/.created
 
 	if needs_update "base_os"; then
+		mkdir_p_target /etc
 		info "Updating base os: copying swupdate_preserve_files"
 		update_preserve_list
 		copy_preserve_files

ただし、build_rootfs.sh でデフォルトにビルドしたアーカイブをこういう風にインストールしてもいくつかの設定が足りないので起動できません(armadillo.dtb, fstab, swupdate関連な設定など)ので、こちらとしてはおすすめしませんし、サポートしてません(こういう不具合がある場合は対応しますが、細かい使い方の制限等はどこにも説明してませんので、動作確認の保証などは自己責任です)

swupdate_preserve_files の仕組みが完璧とは思えませんが、必要悪だと考えていて、何か具体的な物をコピーしてほしくない場合があれば調整していただいた方がいいかもしれません。

大変お手数ですが、よろしくお願いします。

tokita.shinichi

2024年4月16日 17時38分

マルティネ様
返信ありがとうございます。
NO_PRESERVE_FILESの使用はやめ、swupdate_preserve_filesから残しておきたくないファイルの記載を削除することで対応したいと思っていますが、swupdateでアップデート前にswupdate_preserve_filesの内容を変更することは可能でしょうか。
今回の場合は、ネットワーク設定を残したくないのですが、複数人と環境を共有したいため、自動的にswupdate_preserve_filesの変更を反映させたいためです。

 
> 申し訳ございません、NO_PRESERVE_FILES は普通の rootfs で使用できないため確認不足になりました。

また、こちらについてお聞きしたいのですが、NO_PRESEVE_FILESはどのようなケースで使用でき、使用できるrootfsはどういったものになるのでしょうか。

以上、宜しくお願いいたします。

at_dominique.m…

2024年4月16日 18時24分

マルティネです。

> NO_PRESERVE_FILESの使用はやめ、swupdate_preserve_filesから残しておきたくないファイルの記載を削除することで対応したいと思っていますが、swupdateでアップデート前にswupdate_preserve_filesの内容を変更することは可能でしょうか。

すみません、二つのアップデートに別けて swupdate_preserve_files の内容を更新してから base_os の部分を更新する必要があります。

> 今回の場合は、ネットワーク設定を残したくないのですが、複数人と環境を共有したいため、自動的にswupdate_preserve_filesの変更を反映させたいためです。

これだけでしたら、base_os をインストールした後に「swdesc_command "rm -f /etc/NetworkManager/system-connections/*.nmconnection"」などでネットワーク設定だけを削除した方がらくかもしれませんが、いかがでしょうか。

> また、こちらについてお聞きしたいのですが、NO_PRESEVE_FILESはどのようなケースで使用でき、使用できるrootfsはどういったものになるのでしょうか。

2年以上前の問い合わせで似たような要望(アップデート先を完全に把握したい)がありましたので実装してみましたが、それはあまりよくなかったと考えています。
(参考までにどこで見つけたかは教えていただけますか?直接にコードからでしょうか?)

使用できる rootfs は普通の rootfs ですが、いくつかのファイルを追加する必要があります(common/resourcesなどにいれてアーカイブで配置する必要があります)
以下のフォーラムで「swuになくてインストールディスクで作成されるファイルがいくつかあります」を検索すればいくつかの例がでてきます:
https://armadillo.atmark-techno.com/forum/armadillo/13485
バージョンの変更で他のファイルも必要になりました(/etc/fw_env.config 、abos-web/armadillo twin agent のサービスを使用の場合にそのサービスファイル等)ので、メンテナンス的にも負担が大きくて本当に推奨できない状態です。

この問題もあったことでしばらくはだれも使用していなかったことは確実ですので、申し訳ございませんが修正するついでに正式に「デバグ機能」としてだけに残して使用する際にワーニングを表示しようと思います。

よろしくお願いします。

tokita.shinichi

2024年4月17日 11時40分

マルティネ様
返信ありがとうございます。

> すみません、二つのアップデートに別けて swupdate_preserve_files の内容を更新してから base_os の部分を更新する必要があります。

承知しました。

> これだけでしたら、base_os をインストールした後に「swdesc_command "rm -f /etc/NetworkManager/system-connections/*.nmconnection"」などでネットワーク設定だけを削除した方がらくかもしれませんが、いかがでしょうか。

確かに今回の場合ではこちらの方が良いと思います。
ただし別件になるのですが、量産時の書き込みにもswupdateの使用を考えていたため、アップデートの環境を統一できないかと考えたためでした。
今回の話を聞くところでは、量産時はswupdateではなくインストールディスクを使用する方が良いのでしょうか。

 
> 2年以上前の問い合わせで似たような要望(アップデート先を完全に把握したい)がありましたので実装してみましたが、それはあまりよくなかったと考えています。
> (参考までにどこで見つけたかは教えていただけますか?直接にコードからでしょうか?)

推奨しない件承知しました。
情報はGitHubのReadmeを見ました。
https://github.com/atmark-techno/mkswu

以上、宜しくお願いいたします。

at_dominique.m…

2024年4月17日 12時43分

マルティネです。

> ただし別件になるのですが、量産時の書き込みにもswupdateの使用を考えていたため、アップデートの環境を統一できないかと考えたためでした。
> 今回の話を聞くところでは、量産時はswupdateではなくインストールディスクを使用する方が良いのでしょうか。

そうですね、集荷状態から swupdate での量産でしたら問題ないと考えていますが、だれかがすでに手をつけていたらインストールディスクがいいです。
集荷状態でしたらだれでも armadillo を取って設定を残すことは可能ですので、そういう心配があれば確かにインストールディスクがいいですね…
弊社のイメージ書き込みサービスであらかじめ自分のパスワード/鍵を入れたらこういう心配がなくなりますが、そもそも二つ目の書き込みのメリットがなくなりますので、安全性の面ではちょっと微妙なところです。

NO_PRESERVE_FILES ではインストールディスクにあるいくつかの処理が欠けていますので、そういう仕組みができるまでは使わない方がいいと考えています。
いずれ対応したいと考えていますが、今の問題の場合は swupdate コマンドを入れ替えたりして結局マルウェアを残すことは可能なので、解決になりません。
(インストールディスクの場合は少なくとも eMMC の情報を無視しているので、普通のファイルをいじる程度でしたら完全に消えます)

> 情報はGitHubのReadmeを見ました。

ありがとうございます、mkswu での実行の際のワーニング以外に README にもワーニングを追加します。

よろしくお願いします
お手数をおかけしますが、よろしくお願いします。