Armadilloフォーラム

baseos-6e-3.20.3以降のswupdateができない

oruk

2024年12月24日 9時09分

お世話になっております。

baseos-6e-3.19.2-at.5まではswupdateでosのアップデートができていたのですが、baseos-6e-3.20.3以降からswupdateするとエラーが出ます。

swupdate -i baseos-6e-3.20.3-at.7.swu
SWUpdate v2023.12_git20240419-r1

Licensed under GPLv2. See source distribution for detailed copyright notices.

[INFO ] : SWUPDATE running : [main] : Running on iot-a6e Revision at1
[INFO ] : SWUPDATE started : Software Update started !
[WARN ] : SWUPDATE running : [swupdate_create_directory] : Directory /var/tmp/scripts/ cannot be created: File exists
[WARN ] : SWUPDATE running : [swupdate_create_directory] : Directory /var/tmp/datadst/ cannot be created: File exists
[INFO ] : SWUPDATE running : [install_single_image] : Installing pre_script
[INFO ] : SWUPDATE running : [read_lines_notify] : Skipping install of component boot 2020.4-at.24 (has 2020.4-at24)
[INFO ] : SWUPDATE running : [read_lines_notify] : Updating base os: copying swupdate_preserve_files
[INFO ] : SWUPDATE running : [read_lines_notify] : Waiting for btrfs to flush deleted subvolumes
[INFO ] : SWUPDATE running : [install_single_image] : Installing baseos-6e-3.20.3-at.7
[ERROR] : SWUPDATE failed [0] ERROR : archive_write_header(): Can't replace existing directory with non-directory: Directory not empty
[ERROR] : SWUPDATE failed [0] ERROR : copyimage status code is -14
[ERROR] : SWUPDATE failed [0] ERROR : Error streaming baseos-6e-3.20.3-at.7.tar.zst
swupdate_image_write failed: Broken pipe
[ERROR] : SWUPDATE failed [1] Image invalid or corrupted. Not installing ...

よろしくお願いします。

==========
製品型番:
Debian/ABOSバージョン:3.19.2-at.5
カーネルバージョン:5.10.220-1-at
3G/LTE モジュール情報 (Debianのみ):
その他:
==========

コメント

at_kojiro.yamada

2024年12月24日 15時17分

: (略)
[INFO ] : SWUPDATE running :  [install_single_image] : Installing 
baseos-6e-3.20.3-at.7
[ERROR] : SWUPDATE failed [0] ERROR : archive_write_header(): Can't replace 
existing directory with non-directory: Directory not empty
[ERROR] : SWUPDATE failed [0] ERROR : copyimage status code is -14
: (略)

ディレクトリをファイル(非ディレクトリ) で上書きすることはできない
というエラーがでています。

ただ、 3.19.2-at.5 と 3.20.3-at.7 の tar.zst の中を見てみましたが、
同じパス/同名のディレクトリ → 同じパス/同名のファイル
となるような変更はありませんでした。
3.19.2-at.5 から 3.20.3-at.7 へのアップデートも試してみましたが、こちらでは問題なくアップデートできました。

persist_file 等で保存したディレクトリ名が、アップデートに含まれるファイル名と偶然同じだった、
のではないかと思います。
3.20.3-at.7 に含まれるファイルのリストを添付しますので、そのリストの1行を for 文で回して実機上を探すのが良さそうです。
もし上記の通りの単純な問題であれば、同名のディレクトリが見つかるはずです。
手順は以下のとおりです。

1. 3.20.3-at.7.filelist.txt を USB メモリを使う等して、Armadilloにコピー

2. Armadillo 上で現在動作しているrootfsのディレクトリのリストを作成

armadillo:~# find /live/rootfs -type d > /root/3.19.2-at.5.dirlist.txt

うまくできていれば、以下のような内容(冒頭部分のみ)のテキストファイルが Armadillo上の /root/3.19.2-at.5.dirlist.txt 出力されます。

armadillo:~# head 3.19.2-at.5.dirlist.txt
/live/rootfs
/live/rootfs/sys
/live/rootfs/root
/live/rootfs/bin
/live/rootfs/run
/live/rootfs/proc
/live/rootfs/sbin
/live/rootfs/live
/live/rootfs/opt
/live/rootfs/opt/firmware

3. 同名ファイルの検索
以下は、まっさらな 3.19.2-at.5 と 3.20.3-at.7 でやってみた結果です。結果が出るまで 2分程度かかります。

armadillo:~# for f in $(cat /root/3.20.3-at.7.filelist.txt); do grep "$f$" /root/3.19.2-at.5.dirlist.txt && echo match $f; done 2> /dev/null
// 同名のディレクトリが見つかればここに表示されます。見つからなければ何も表示されません。
armadillo:~# 

----
ちなみにですが…
以下のようにして find -path で探しても良かったのですが、 10分以上待っても完了しなかったので find の結果を一旦テキストファイルにする手順を選びました。
for f in $(cat 3.20.3-at.7.filelist.txt); do find /live/rootfs -type d -path "/live/rootfs$f" ; done

ファイル ファイルの説明
3.20.3-at.7.filelist.txt

at_dominique.m…

2024年12月25日 9時16分

orukさん

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

山田さんの回答で間違いありませんのでそちらの手順でファイルを判明できましたらそれでいいんですが、
そもそもエラーメッセージにファイル名が表示されてないのは問題なのでまだでしたら添付した swupdate をインストールしてみてください。

# 添付ファイル制限で tar にパッケージを入れましたので、展開してからインストールします。
armadillo:~# tar xf swupdate-2024.05.3_git20241031-r1.apk.tar 
armadillo:~# apk add ./swupdate-2024.05.3_git20241031-r1.apk
(1/1) Upgrading swupdate (2024.05.3_git20241031-r0 -> 2024.05.3_git20241031-r1)
Executing busybox-1.36.1-r29.trigger
OK: 228 MiB in 196 packages
# バージョンを確認します。インストール前は r0 でした。
armadillo:~# swupdate --version
SWUpdate v2024.05.3_git20241031-r1
# 確認します。自分の場合は etc/xattr.conf で再現しましたが、お客さんは別のディレクトリが問題になっているはずです。
armadillo:~# swupdate -i ...swu
[...]
[ERROR] : SWUPDATE failed [0] ERROR : archive_write_header(): Can't replace existing directory with non-directory for './etc/xattr.conf': Directory not empty
[...]
# そのディレクトリを /etc/swupdate_preserve_files から外します
# vi などで削除してから必ず persist_file で保存してください。
armadillo:~# grep xattr.conf /etc/swupdate_preserve_files 
/etc/xattr.conf
armadillo:~# sed -i -e '/xattr.conf/d' /etc/swupdate_preserve_files 
armadillo:~# grep xattr.conf /etc/swupdate_preserve_files 
armadillo:~# persist_file /etc/swupdate_preserve_files
# もう一度 swupdate でアップデートをインストールすると成功するはずです
armadillo:~# swupdate -i ...swu

よろしくお願いします

ファイル ファイルの説明
swupdate-2024.05.3_git20241031-r1.apk_.tar

山田様、マルティネ様

お世話になっております。
swupdateできるようになりました。
ありがとうございました。

swupdate_preserve_filesに
/var/spool/cron/crontabs/root
を記入していたことが原因でした。