組み込みLinuxデバイスで実行するアプリケーションがあり、時々ソフトウェアに変更が加えられ、場合によってはルートファイルシステムまたはインストールされたカーネルにも変更が加えられます。
現在の更新システムでは、古いアプリケーションディレクトリの内容が削除され、新しいファイルがそこにコピーされます。ルートファイルシステムへの変更が行われると、新しいファイルは更新の一部として配信され、古いファイルに単にコピーされます。
現在、現在のアプローチにはいくつかの問題があり、状況を改善する方法を探しています。
要件は次のとおりです。
dd
を実行するだけですか?ルートファイルシステムのバージョン管理を行う方法が絶対に必要です。これは、ターゲットデバイスのrootfsを更新するために使用できる、ある種のdiff
を計算できるようにする必要があります。
ソースコードにSubversionを使用しているため、既にSubversionを調べましたが、Linuxルートファイルシステム(ファイルのアクセス許可、特殊ファイルなど)には不適切です。
svn diff
に似たシェルスクリプトをいくつか作成しましたが、実際に動作するテスト済みのソリューションが既に存在するかどうかを知りたいです。
そのようなdiff
を使用すると、アップグレードは、既知のルートファイルシステムの状態に基づく増分更新を含むパッケージになるだけだと思います。
これについてのあなたの考えや考えは何ですか?このようなシステムをどのように実装しますか?短時間で実装できるシンプルなソリューションを好みます。
私はあなたが問題を間違っていると信じています-非アトミックな更新(たとえば、ファイルシステムイメージのdd、ディレクトリ内のファイルの置き換え)は設計上壊れています-更新の途中で電源が切れた場合、システムはブリックと組み込みシステムの場合、アップグレードの途中で電源が切れることがあります。
組み込みLinuxシステムでアップグレード/アップデートを正しく行う方法に関するホワイトペーパーを書きました[1]。 OLSで発表されました。論文はここにあります: https://www.kernel.org/doc/ols/2005/ols2005v1-pages-21-36.pdf
[1]ベンヨセフ、ギラッド。 「マーフィー互換の組み込みLinuxシステムの構築」 Linuxシンポジウム。 2005年.
更新はアトミックである必要があることに私は完全に同意します。私は最近、ローカルとリモートの両方の更新で、ソフトウェア管理のための安全で柔軟な方法を提供することを目的としてオープンソースプロジェクトを開始しました。私の答えは非常に遅くなりますが、次のプロジェクトで役立つかもしれません。
"swupdate"(プロジェクトの名前)のソースは github.com/sbabic/swupdate
。
ステファノ
原子性は組み込みデバイスにとって重要であり、強調されている理由の1つは電力損失です。しかし、ハードウェア/ネットワークの問題のような他の可能性があります。
原子性はおそらく少し誤解されています。これは私がアップデータのコンテキストで使用する定義です:
デュアルA/Bパーティションレイアウトでの完全なイメージの更新は、これを実現する最も簡単で最も実績のある方法です。
組み込みLinuxの場合、更新する必要のあるいくつかのソフトウェアコンポーネントと、さまざまな設計から選択できます。これに関する新しいペーパーがここにあります: https://mender.io/resources/Software%20Updates.pdf
ファイルの移動先: https://mender.io/resources/guides-and-whitepapers/_resources/Software%2520Updates.pdf
Yoctoプロジェクトを使用している場合は、 Mender.io -私が取り組んでいるオープンソースプロジェクトに興味があるかもしれません。クライアントとサーバーで構成されており、アップデーターを既存の環境に統合するのをはるかに速く簡単にすることを目標としています。再設計しすぎたり、カスタム/自家製のコーディングに時間を費やす必要はありません。また、サーバーを使用して更新を集中管理することもできます。
現在、かなりの数のオープンソース組み込みLinux更新ツールが成長しており、それぞれに重点が置かれています。
言及する価値のあるもう1つの方法は [〜#〜] rauc [〜#〜] で、ターゲットでの署名済み更新バンドルの安全でアトミックなインストールの処理に焦点を当てる一方で、あなたの方法は非常に柔軟ですアプリケーションと環境に合わせてください。ソースはGitHubにあります: https://github.com/rauc/rauc
一般に、システムの更新に関するYocto Project Wikiページにある最新の更新ソリューションの概要と比較は次のとおりです。
アップデートをジャーナルして、アップデートフラッシュを2つのスロットに分割できます。電源障害が発生すると、常に現在実行中のスロットに戻ります。最後のステップは、ジャーナル値を変更することです。非アトミックであり、それをレンガにする方法はありません。ジャーナルフラグの書き込み時に失敗したとしても。アトミック更新などはありません。ずっと。私の人生でそれを見たことがない。 Iphone、Adroid、私のネットワークスイッチ-どれもアトミックではありません。そのような設計を行うための十分なスペースがない場合は、設計を修正します。