Armadilloフォーラム

Linuxカーネルアップデート

thile

2023年3月27日 14時34分

こんにちは!
Linuxカーネルを変更したいですが、途中でエーラーを起きましたので、解決を教えて頂きますと幸いです。
以下、やり方の順序です。
最初、この「https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…」の9.4.2の項目のとおりにUbuntu20.04仮想上で「Image」ファイルと「armadillo_iotg_g4.dtb」ファイルを作成しました。
次は、atmarkのATDE9仮想上で、この「https://armadillo.atmark-techno.com/blog/10899/10733」のとおりにやって、最後の「update-kernel.swu」ファイルをUSBメモリーにコーピしました。
次、USBメモリーをArmadillo-IoT G4ボードと接続して、これから問題が発生されていました。
① 自動的のアップデートを行わなかったんです。「tail /var/log/messages」コマンドを入力して、以下のローグを出ています。
armadillo:~# tail /var/log/messages
Jan 1 09:00:09 armadillo daemon.info init: starting pid 1598, tty '': '/sbin/getty -L 115200 ttymxc1 vt101'
Jan 1 09:00:09 armadillo daemon.info init: starting pid 1593, tty '/dev/tty2': '/sbin/getty 38400 tty2'
Jan 1 09:00:09 armadillo daemon.info init: starting pid 1594, tty '/dev/tty3': '/sbin/getty 38400 tty3'
Jan 1 09:00:09 armadillo daemon.info init: starting pid 1595, tty '/dev/tty4': '/sbin/getty 38400 tty4'
Jan 1 09:00:09 armadillo daemon.info init: starting pid 1597, tty '/dev/tty6': '/sbin/getty 38400 tty6'
Jan 1 09:00:09 armadillo daemon.info init: starting pid 1596, tty '/dev/tty5': '/sbin/getty 38400 tty5'
Jan 1 09:00:10 armadillo daemon.info NetworkManager[1289]: [10.1937] manager: startup complete
Jan 1 09:01:38 armadillo authpriv.debug login: pam_unix(login:account): account root has password changed in future
Jan 1 09:01:38 armadillo authpriv.info login: pam_unix(login:session): session opened for user root(uid=0) by (uid=0)
Jan 1 09:01:38 armadillo authpriv.notice login: ROOT LOGIN ON ttymxc1
② その後、以下のコマンドを入力しました。
armadillo:~# mount /dev/sda1 /mnt/
armadillo:~# swupdate -i /mnt/update-kernel.swu
SWUpdate v

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 !
[ERROR] : SWUPDATE failed [0] ERROR : ZSTD_decompressStream failed: Unknown frame descriptor
[ERROR] : SWUPDATE failed [0] ERROR : Error copying extracted file
[ERROR] : SWUPDATE failed [0] ERROR : Error streaming scripts_pre.sh.zst.enc
[ERROR] : SWUPDATE failed [1] Image invalid or corrupted. Not installing ...
swupdate_image_write failed: Broken pipe
[INFO ] : No SWUPDATE running : Waiting for requests...
結果的には失敗したんですが、①問題と②問題の原因を教えていただけますでしょうか?

以上です。よろしくお願いいたします。

コメント

at_dominique.m…

2023年3月27日 15時16分

thileさん、

マルティネです。

> 最初、この「https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…」の9.4.2の項目のとおりにUbuntu20.04仮想上で「Image」ファイルと「armadillo_iotg_g4.dtb」ファイルを作成しました。

今のエラーと関係ありませんが、Armadillo G4 のカーネルにいくつかのモジュールを使い始めましたのでこの手順は少し楽観的でモジュールのインストール方法まで説明してなかったです。
丁度直したところで、明日公開する予定ですが、それまでに以下のコマンドも実行して modules_install/lib/modules/ も展開させるようにしていただけたらスムースに動くと思います。

# カーネルの方
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH="$PWD/modules_install" -j5 modules_install
 
# .desc ファイルの方
KERNEL_INSTALL=/path/to/modules_install
cat >> kernel-update.desc <<EOF
# remove old modules and install new ones
swdesc_command 'rm -rf /lib/modules'
swdesc_files --dest /lib/modules "$KERNEL_INSTALL"/lib/modules
EOF

> 次は、atmarkのATDE9仮想上で、この「https://armadillo.atmark-techno.com/blog/10899/10733」のとおりにやって、最後の「update-kernel.swu」ファイルをUSBメモリーにコーピしました。

(このブログも更新します…リンクありがとうございました。)

> 次、USBメモリーをArmadillo-IoT G4ボードと接続して、これから問題が発生されていました。
> ① 自動的のアップデートを行わなかったんです。「tail /var/log/messages」コマンドを入力して、以下のローグを出ています。

ログが短いと思ったらそうでもないですね。
これでは usb をそもそもマウントしようとしなかったように見えますが、USBデバイスを差し直してから~1分以内での出力でしょうか?
おそらく②と同じ問題なので、とりあえずスキップします。

> ② その後、以下のコマンドを入力しました。
> [ERROR] : SWUPDATE failed [0] ERROR : ZSTD_decompressStream failed: Unknown frame descriptor

これは暗号化が使われていて、デバイスに違う鍵がある場合によくあるエラーです。

Armadillo の /etc/swupdate.aes-key と mkswu を実行しているマシンの ~/mkswu/swupdate.aes-key が一致していることを確認してください。
短い文字列なので、コピーペーストでもいいです。mkswuを実行する側にコピーする場合に mkswu update-kernel.desc を実行しなおせば動くと思いますし、Armadillo側で書き直したら一度 persist_file /etc/swupdate.aes-key で保存してから再び swupdate -i でインストールできるはずです。

よろしくお願いします。

thile

2023年3月27日 16時55分

マルティネさん、コメント頂き、ありがとうございます。

> 今のエラーと関係ありませんが、Armadillo G4 のカーネルにいくつかのモジュールを使い始めましたのでこの手順は少し楽観的でモジュールのインストール方法まで説明してなかったです。
> 丁度直したところで、明日公開する予定ですが、それまでに以下のコマンドも実行して modules_install/lib/modules/ も展開させるようにしていただけたらスムースに動くと思います。

すみませんが、共有して頂いていたコマンドでどんなパッケージのためビールドしていますか?理解できていないです。Linuxカーネル作成のためのビールドコマンドでしょうか?

> これでは usb をそもそもマウントしようとしなかったように見えますが、USBデバイスを差し直してから~1分以内での出力でしょうか?

マウントすることは自動的ではないでしょうか?電源が入れる前、USBメモリーを接続して、起動しますが、マウントのコマンドを実施しないとUSBメモリーの中身のファイルが見られないとのことです。

> これは暗号化が使われていて、デバイスに違う鍵がある場合によくあるエラーです。
> Armadillo の /etc/swupdate.aes-key と mkswu を実行しているマシンの ~/mkswu/swupdate.aes-key が一致していることを確認してください。
> 短い文字列なので、コピーペーストでもいいです。mkswuを実行する側にコピーする場合に mkswu update-kernel.desc を実行しなおせば動くと思いますし、Armadillo側で書き直したら一度 persist_file /etc/swupdate.aes-key で保存してから再び swupdate -i でインストールできるはずです。

ご案内のとおりにやって、アップデートができたそうですが、もう一度アップデートやってみて(update-kernel.swuファイルが変えない)出来なくなってしまいました。このローグです。
armadillo:~# swupdate -i /mnt/update-kernel_atmark.swu
SWUpdate v

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 !
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : /!\ Nothing to do -- failing on purpose to save bandwidth
[ERROR] : SWUPDATE failed [0] ERROR : ----------------------------------------------
[ERROR] : SWUPDATE failed [0] ERROR : Command failed: sh -c 'sh $1 ' -- /var/tmp//scripts_pre.sh.zst.enc
[ERROR] : SWUPDATE failed [0] ERROR : Error streaming scripts_pre.sh.zst.enc
[ERROR] : SWUPDATE failed [1] Image invalid or corrupted. Not installing ...
swupdate_image_write failed: Broken pipe
[INFO ] : No SWUPDATE running : Waiting for requests...

質問としては、Linuxカーネルアップデートするなのは一回だけできるでしょうか?

以上です。よろしくお願いいたします。

at_dominique.m…

2023年3月27日 17時27分

thileさん

> [make modules_install など]
> すみませんが、共有して頂いていたコマンドでどんなパッケージのためビールドしていますか?理解できていないです。Linuxカーネル作成のためのビールドコマンドでしょうか?

すみません、コメントが足りませんでした。
カーネルの更新の際に /lib/modules/<カーネルバージョン> のファイルも転送しないと wifi などの部分を使えなくなるため、リンクしていただいたブログの手順より二つのステップが必要です。

カーネルをビルドした後、モジュールファイルを使える状態にしてmodules_installコマンドでどこかのディレクトリに保存する。以下のでは $HOME/mkswu/kernel_modules に変更しました。

cd /path/to/linux-5.10-<version>
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH="$HOME/mkswu/kernel_modules" -j5 modules_install

そのモジュールを mkswu の .desc ファイルで使って、swu に組み込む。ブログの .desc ファイルを使って、結果的にはこういう内容です。元のファイルが少し古かったので、他の細かい変更もしましたが前のメッセージの二行でもよかったです。

# バージョンを一回まとめて設定します
swdesc_option component=extra_os.kernel version=5.10.0-1
 
# Image と dtb ファイルの転送
swdesc_files --dest /boot \
        "Image" "armadillo_iotg_g4.dtb"
 
# モジュールの転送 
swdesc_command 'rm -rf /lib/modules'
swdesc_files --dest /lib/modules "kernel_modules/lib/modules"
 
# アップデートで失わないように swupdate_preserve_files を修正します
swdesc_script "$SCRIPT_DIR/examples/update_preserve_files.sh" -- \
	"POST /boot" \
	"POST /lib/modules"

また、ただいま mkswu 4.10.1 をリリースしましたので、
sudo apt update && sudo apt install mkswu で更新していただけたら linux のビルドディレクトリから /usr/share/mkswu/examples/kernel_update_plain.install.sh ~/mkswu/kernel.desc を実行するとその .desc ファイルを作って ~/mkswu/kernel/ のディレクトリに Image, dtb をモジュールをインストールしますので、上記の説明を気にせずに swu を作れます。(同じkernel-update.desc を使いたい場合は最初だけ desc ファイルを削除してください。ファイルの内容が違いすぎますので対応されてません。)

すみませんブログはまだ更新してません。明日に更新したいと思いますので、まだ分かりにくいと思ったら頭からの手順として説明した方が分かりやすいかもしれません。
更新したらまた連絡します。

> > これでは usb をそもそもマウントしようとしなかったように見えますが、USBデバイスを差し直してから~1分以内での出力でしょうか?
>
> マウントすることは自動的ではないでしょうか?電源が入れる前、USBメモリーを接続して、起動しますが、マウントのコマンドを実施しないとUSBメモリーの中身のファイルが見られないとのことです。

はい、自動的にマウントされます。アップデートが失敗した後に umount されたので、マウントされてない状態でログインしたことに問題ないです。

それでしたら、単純に /var/log/messages の行数が足りなかっただけですね。おそらく同じエラーでしたのが、また試したかったら grep -i swupdate /var/log/messages で確認してください。

> ご案内のとおりにやって、アップデートができたそうですが、もう一度アップデートやってみて(update-kernel.swuファイルが変えない)出来なくなってしまいました。このローグです。
> [ERROR] : SWUPDATE failed [0] ERROR : /!\ Nothing to do -- failing on purpose to save bandwidth
>
> 質問としては、Linuxカーネルアップデートするなのは一回だけできるでしょうか?

"Nothing to do" というメッセージは、「swu に搭載されているバージョンはすでにインストールされている」という意味です。
ブログのコンフィグの「--version extra_os.kernel 5.10.0-1」の「5.10.0-1」の二ヶ所、また上記の「swdesc_option ... version=5.10.0-1」のところで更新できます。
5.10.0-1 より上のバージョン(5.10.0-2, 5.10.0-1.1, 5.10.1など)を記載するとまたインストールできるようになります。

kernel_update_plain.install.sh を使っていただけたら、実行する度にバージョンが更新されますので楽です。

thile

2023年3月29日 11時43分

マルティネさん
thileです。
返信が遅くなり申し訳ございません。

説明頂いた内容を承知いたしました。USBメモリマウントーやLOGや再アップロードの案件について、できるようになりました。ありがとうございます。
残りmodules_installの案件について、ちょっと調査中です。
ちなみに、このリンク「https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4…」によると、Linuxカーネル5.10というバージョンだけと認識しています。質問ですが、他のバージョン、もっと高いバージョン等を提供できませんでしょうか?armadillo-iot-g4商品が対応できませんでしょうか?

以上です。よろしくお願いいたします。

at_dominique.m…

2023年3月29日 13時23分

thileさん、

マルティネです。

> 説明頂いた内容を承知いたしました。USBメモリマウントーやLOGや再アップロードの案件について、できるようになりました。ありがとうございます。

良かったです。

> 残りmodules_installの案件について、ちょっと調査中です。

ブログの「https://armadillo.atmark-techno.com/blog/10899/10733」を更新できました(福田さん、ありがとうございました!)。
結果としてはスクリプトでのインストールはできるようになりましたので、その方法を強く推奨しています。
「make modules_install」だけを実行すると、カーネルとモジュールのバージョンが合わないなどの齟齬も簡単に起こせますので、ぜひ使って見てください。

> ちなみに、このリンク「https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4…」によると、Linuxカーネル5.10というバージョンだけと認識しています。質問ですが、他のバージョン、もっと高いバージョン等を提供できませんでしょうか?armadillo-iot-g4商品が対応できませんでしょうか?

そうですね、Armadillo IoT G4 は NXP のカーネルツリーをベースにしていますので、自由にアップグレードできません。
Linux 5.10 は kernel.org のサポートとして最低2026年12月まで更新されて、毎月それに更新してセキュリティの修正を取り込んでいますが、それ以上は難しいです。
NXP独自の NPU や VPU の機能が不要な場合には dts ファイルを少し直せばアップストリームのカーネルも使えますが、アットマークとしてはサポートする人材がいませんのであまりお手伝いできません。

ちなみに、何か具体的な理由で新しいカーネルが欲しかったですか?

よろしくお願いします、

thile

2023年3月29日 14時20分

マルティネさん
thileです。

> ブログの「https://armadillo.atmark-techno.com/blog/10899/10733」を更新できました(福田さん、ありがとうございました!)。
> 結果としてはスクリプトでのインストールはできるようになりましたので、その方法を強く推奨しています。
> 「make modules_install」だけを実行すると、カーネルとモジュールのバージョンが合わないなどの齟齬も簡単に起こせますので、ぜひ使って見てください。

リンク共有頂いて、ありがとうございます。参考いたします。

> そうですね、Armadillo IoT G4 は NXP のカーネルツリーをベースにしていますので、自由にアップグレードできません。
> Linux 5.10 は kernel.org のサポートとして最低2026年12月まで更新されて、毎月それに更新してセキュリティの修正を取り込んでいますが、それ以上は難しいです。

NXPウェブサイト上でLinux 5.15をリリースされているそうですが貴社は対応する計画がありますか?

> ちなみに、何か具体的な理由で新しいカーネルが欲しかったですか?

armadillo-iot-g4ボードのいくつかの機能を試したいです。例えば、あるカメラモジュールをボードと接続したいですが、専用カメラドライバーを追加する時にカーネルソースを修正しないといけないでしょうか?

thile

2023年3月29日 14時32分

マルティネさん
thileです。

> ちなみに、何か具体的な理由で新しいカーネルが欲しかったですか?

すみません、誤解しましたので答えを変更いたします。
新しいカーネルが欲しいことに対して特に理由はないです。試しだけです。

at_dominique.m…

2023年3月29日 16時16分

thileさん、
マルティネです。

> > そうですね、Armadillo IoT G4 は NXP のカーネルツリーをベースにしていますので、自由にアップグレードできません。
> > Linux 5.10 は kernel.org のサポートとして最低2026年12月まで更新されて、毎月それに更新してセキュリティの修正を取り込んでいますが、それ以上は難しいです。
>
> NXPウェブサイト上でLinux 5.15をリリースされているそうですが貴社は対応する計画がありますか?

はい、何かの不具合の場合には社内の確認のために使っていますが、NXPが提供しているユーザースペースのバイナリライブラリ(/opt/firmware に記載されている「at-imxlib」)がカーネルのバージョンに依存していますので、簡単には切り替えできません。

> 例えば、あるカメラモジュールをボードと接続したいですが、専用カメラドライバーを追加する時にカーネルソースを修正しないといけないでしょうか?

これはよく分かりますが、逆にアップグレードしない理由になりますね。(「最新のカーネルではアップストリームされました」なら違いますが…)
お客様方がアットマークの 5.10 のカーネルにドライバを追加していた場合には、stable ブランチの更新は比較的に楽ですが、いきなり 5.10 から別のメージャーへ移植してくださいと言われたら困ります。

弊社でもいくつかの(まさにカメラ向けの)ドライバを追加していて、いくつかのバージョンをサポートする必要があったらその作業も大変になります。
なので、方針としては 5.10 をできるだけ長くサポートする予定です。
2026年12月には kernel.org の stable アップデートがなくなりますが、CIP linux が2031年1月までサポートする予定ですし、その前に別のバージョンを追加する形になると思いますが、まだ早いです。(Armadillo IoT G3 シリーズではそうしています)

よろしくお願いします。

thile

2023年4月5日 11時34分

マルティネさん、thileです。

> ブログの「https://armadillo.atmark-techno.com/blog/10899/10733」を更新できました(福田さん、ありがとうございました!)。

SWupdateの新たなやり方をやってみて、「kernel-update.desc」ファイルを作成されていませんでした。
「atmark@atde9:~/linux-5.10-5.10.168-r0$ /usr/share/mkswu/examples/kernel_update_plain.install.sh ~/mkswu/kernel-update.desc」というコマンドを実施したら、最後のログに
「module alias /home/atmark/mkswu/kernel-update/lib/modules/5.10.168/modules.alias.bin is suspiciously small, check module loading」
というエーラーが発生されてしまいました。
「Image」ファイルや「armadillo_iotg_g4.dtb」ファイルや「lib」フォルダーを「mkswu/kernel-update」ディレクトリにコーピされていましたが、「kernel-update.desc」ファイルを作成されていませんでした。何故そんな現象を発生したか教えていただけますでしょうか?

よろしくお願いします、

at_dominique.m…

2023年4月5日 11時52分

thileさん、

> SWupdateの新たなやり方をやってみて、「kernel-update.desc」ファイルを作成されていませんでした。
> 「atmark@atde9:~/linux-5.10-5.10.168-r0$ /usr/share/mkswu/examples/kernel_update_plain.install.sh ~/mkswu/kernel-update.desc」というコマンドを実施したら、最後のログに
> 「module alias /home/atmark/mkswu/kernel-update/lib/modules/5.10.168/modules.alias.bin is suspiciously small, check module loading」
> というエーラーが発生されてしまいました。
> 「Image」ファイルや「armadillo_iotg_g4.dtb」ファイルや「lib」フォルダーを「mkswu/kernel-update」ディレクトリにコーピされていましたが、「kernel-update.desc」ファイルを作成されていませんでした。何故そんな現象を発生したか教えていただけますでしょうか?

提供しているカーネルコンフィグの 5.10.137-r0 から 5.10.168-r0 (含む)までに x2_defconfig に CONFIG_MODULE_COMPRESS を有効にしていましたが、 debian の depmod コマンドが圧縮を対応していないので正常なエラーです。とても分かりにくくて申し訳ございません、今月のアップデートで日本語に翻訳しますのでもう少しマシにします。

最新の 5.10.175-r0 カーネルから再び圧縮を無効にして解決しましたが、今のカーネルバージョンでも ./scripts/config --disable CONFIG_MODULE_COMPRESS で設定を無効にしてからもう一度ビルド(数秒のmake ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu ) を行っていただいたら無事に成功させると思います。

よろしくお願いします。

thile

2023年4月5日 14時40分

こんにちは!

> 最新の 5.10.175-r0 カーネルから再び圧縮を無効にして解決しましたが、今のカーネルバージョンでも ./scripts/config --disable CONFIG_MODULE_COMPRESS で設定を無効にしてからもう一度ビルド(数秒のmake ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu ) を行っていただいたら無事に成功させると思います。

教えていただきありがとうございます。CONFIG_MODULE_COMPRESSを無効にしてdescファイルを作成できました。
ありがとうございます。

よろしくお願いします。