web-dev-qa-db-ja.com

組み込みLinuxデバイス用の更新/アップグレードシステムの実装

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

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

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

  • ファイルシステムイメージの作成に使用されるターゲットのルートファイルシステムはバージョン管理されていません(元のrootfsさえ持っていないと思います)。
  • アップデートに入るrootfsファイルは手動で選択されます(diffの代わりに)
  • アップデートは継続的に拡大し、それがピタになります。アップグレードに大きなrootfsの変更が含まれている場合、更新とアップグレードの間に分割があります。
  • 更新の整合性チェックは、実装されているとしたら、かなり壊れやすい印象があります。

要件は次のとおりです。

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

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

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

svn diffに似たシェルスクリプトをいくつか作成しましたが、実際に動作するテスト済みのソリューションが既に存在するかどうかを知りたいです。

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

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

49
trenki

私はあなたが問題を間違っていると信じています-非アトミックな更新(たとえば、ファイルシステムイメージのdd、ディレクトリ内のファイルの置き換え)は設計上壊れています-更新の途中で電源が切れた場合、システムはブリックと組み込みシステムの場合、アップグレードの途中で電源が切れることがあります。

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

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

32
gby

更新はアトミックである必要があることに私は完全に同意します。私は最近、ローカルとリモートの両方の更新で、ソフトウェア管理のための安全で柔軟な方法を提供することを目的としてオープンソースプロジェクトを開始しました。私の答えは非常に遅くなりますが、次のプロジェクトで役立つかもしれません。

"swupdate"(プロジェクトの名前)のソースは github.com/sbabic/swupdate

ステファノ

9
sbabic

原子性は組み込みデバイスにとって重要であり、強調されている理由の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 -私が取り組んでいるオープンソースプロジェクトに興味があるかもしれません。クライアントとサーバーで構成されており、アップデーターを既存の環境に統合するのをはるかに速く簡単にすることを目標としています。再設計しすぎたり、カスタム/自家製のコーディングに時間を費やす必要はありません。また、サーバーを使用して更新を集中管理することもできます。

2
rduio

現在、かなりの数のオープンソース組み込みLinux更新ツールが成長しており、それぞれに重点が置かれています。

言及する価値のあるもう1つの方法は [〜#〜] rauc [〜#〜] で、ターゲットでの署名済み更新バンドルの安全でアトミックなインストールの処理に焦点を当てる一方で、あなたの方法は非常に柔軟ですアプリケーションと環境に合わせてください。ソースはGitHubにあります: https://github.com/rauc/rauc

一般に、システムの更新に関するYocto Project Wikiページにある最新の更新ソリューションの概要と比較は次のとおりです。

https://wiki.yoctoproject.org/wiki/System_Update

2
ejoerns

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

0
MaxDeusPhallus