53

組み込み Linux デバイスで実行するアプリケーションがあり、時々ソフトウェアに変更が加えられ、場合によってはルート ファイル システムやインストール済みのカーネルにも変更が加えられます。

現在の更新システムでは、古いアプリケーション ディレクトリの内容は単純に削除され、新しいファイルがその上にコピーされます。ルート ファイル システムに変更が加えられると、新しいファイルが更新の一部として配信され、古いファイルに単純にコピーされます。

現在、現在のアプローチにはいくつかの問題があり、状況を改善する方法を探しています。

  • ファイル システム イメージの作成に使用されるターゲットのルート ファイル システムはバージョン管理されていません (元の rootfs さえないと思います)。
  • 更新に入る rootfs ファイルは (差分ではなく) 手動で選択されます。
  • 更新は継続的に成長し、それはピタになります。アップグレードに大きな rootfs の変更が含まれる場合、更新とアップグレードが分割されるようになりました。
  • アップデートの一貫性チェックは、実装されたとしても脆弱であるという印象があります。

要件は次のとおりです。

  • アプリケーション更新パッケージは大きすぎてはならず、変更が行われた場合にルート ファイル システムを変更できる必要もあります。
  • アップグレードははるかに大きくなる可能性があり、ルート ファイル システムに入る要素 (新しいライブラリ、カーネルなど) のみが含まれます。アップデートでは、アップグレードがインストールされている必要がある場合があります。
    アップグレードにルート ファイル システム全体を含めてdd、ターゲットのフラッシュ ドライブで単純に実行できますか?
  • 更新/アップグレード パッケージの作成は、可能な限り自動化する必要があります。

ルート ファイル システムのバージョン管理を行う何らかの方法が絶対に必要です。diffこれは、ターゲット デバイスの rootfs を更新するために使用できる何らかの方法で計算できるようにする必要があります。

ソース コードに Subversion を使用しているため、すでに Subversion を調べましたが、Linux ルート ファイル システム (ファイルのアクセス許可、特殊ファイルなど) には不適切です。

に似たものを提供できるシェルスクリプトをいくつか作成しましたsvn diffが、これに対して機能するテスト済みのソリューションが既に存在するかどうかを知りたいです。

そのような を使用diffすると、アップグレードは単純に、既知のルート ファイル システムの状態に基づく増分更新を含むパッケージになると思います。

これについてあなたの考えやアイデアは何ですか?そのようなシステムをどのように実装しますか? あまり時間をかけずに実装できるシンプルなソリューションを好みます。

4

5 に答える 5

34

問題の見方が間違っていると思います-アトミックではない更新(ファイルシステムイメージの追加、ディレクトリ内のファイルの置き換えなど)は設計上壊れています-更新の途中で電源が切れた場合、システムはブリックおよび組み込みシステムの場合、アップグレードの途中で電源が切れる可能性があります。

組み込み Linux システムでアップグレード/アップデートを正しく行う方法に関するホワイト ペーパーを書きました [1]。OLSで発表しました。ここで論文を見つけることができます: https://www.kernel.org/doc/ols/2005/ols2005v1-pages-21-36.pdf

[1] ベン・ヨセフ、ギラッド。「Murphy 互換の組み込み Linux システムの構築」。Linux シンポジウム。2005年。

于 2011-08-04T11:26:49.253 に答える
0

更新をジャーナリングし、更新フラッシュを 2 つのスロットに分割できます。電源障害が発生すると、常に現在実行中のスロットに戻ります。最後の手順は、ジャーナルの値を変更することです。非アトミックで、レンガにする方法はありません。ジャーナル フラグを書き込む時点で失敗しても。アトミックな更新のようなものはありません。これまで。私の人生でそれを見たことがない。Iphone、android、ネットワーク スイッチ、どれもアトミックではありません。そのような設計を行う十分な余裕がない場合は、設計を修正します。

于 2012-08-14T18:02:49.327 に答える