私は追加のinitrd / initramfs /何も必要とせずにLinuxベースの組み込みシステム用のファームウェアアップデートメカニズムを想像しようとしています。読み取り専用でマウントされたルートを持つ実行中のシステムでは、ddを使用して新しいルートイメージ(セカンダリデータパーティションにあります)をコピーしました。
問題は、半分の時間が破損したルートファイルシステムで終わるということです。パーティションが読み取り専用であることを知っていて、再起動する前に同期していたため、これが発生する理由を理解できませんでした(/proc/sysrq-triggerに「b」を書き込んで再起動しました)。誰かが私に啓発してください。
答え1
すでにマウントされているファイルシステムを上書きしています。ファイルシステムドライバがその内容を読み取ろうとするとすぐに問題が発生します。
新しいファームウェアを作成したら、他のものがパーティションを読み書きできないことを確認する必要があります。
問題を回避するために人々が通常行うことは、ブートローダを使用して新しいファームウェアをフラッシュするようです。通常、RAMに完全に存在するため、パーティションにアクセスする必要はありません。
編集する:もう1つのアプローチは、イメージファイルを最初のパーティションにフラッシュする目的で、2番目のパーティションに別の最小システムをインストールすることです。更新が期限切れになったら、イメージを正しい場所にコピーし、ブートローダを更新し(2番目のパーティションから起動し)、再起動します。イメージを作成したら、ブートローダをリセットして再起動します。
答え2
マウントすると、ルートファイルシステムが読み取り専用であっても上書きできません。
あなたは何ですかできるあなたがすることは、ルートファイルシステム内のすべてのファイルを含むtmpfsをマウントしてから、ivot_rootを呼び出してtmpfsに切り替えて古いルートをアンマウントすることです。
以前のルートファイルシステムをアンマウントすると、そのシステムで実行されているすべてのプログラムがシャットダウンまたはプログラムを実行する必要があるため、すでに起動しているシステムではこれが不可能になる可能性があります。
このアプローチを使用する最も実現可能な方法は、おそらくこれをすべて実行してから、新しい初期化を実行する/sbin/tmpfs-initプログラムを持つことです。でもこれもやりにくいです。