カスタム回復パーティション


9

私はRaspberry PIへのアップグレードがHTTP経由で行われ、Raspberry PIに直接アクセスできない(カードを交換することはできない)プロジェクトに取り組んでいます。

次のようなパーティション設定が必要です。

  • パーティション1-/ boot(両方のパーティションのカーネルを含む)
  • パーティション2-/(回復パーティション)
  • パーティション3- /(プライマリパーティション)

アップグレードがうまくいかず、Raspberry PIが再起動ループに入ったり、起動時にハングアップしたりした場合、ユーザーがボタンを押すと、GPIOラインがトリガーされ、ブートローダーが起動します。プライマリパーティションの代わりに回復パーティション。

リカバリパーティションはアップグレードされないため、これは安全です。

いくつかのオプションが表示されます。

  1. 常にリカバリパーティションで起動し、GPIOを確認してから、ボタンが押されていないプライマリパーティションで起動する
  2. GPIOはブートローダーによって直接チェックされます

私は基本的に、ルーターと同じようなことをしようとしています。起動中にリセットを保持すると、新しいイメージまたは何かでTFTPを実行できます。

Raspberry PIでこれは可能ですか?もしそうなら、この種のことをするためのドキュメントはありますか?

編集:

この関連する質問に対する答えを見つけました:SDカードからデュアルブートすることは可能ですか?

上記の質問へのコメントが私をここに導きました:http : //www.berryterminal.com/doku.php/berryboot。これは有望に見えますが、GPIOを読み取れるかどうかを確認するには、さらに調査する必要があります。誰かがそれを使った経験があれば、私はとても興味があります。


どうやってそれを
やり遂げる

1
簡単な第2ステージのブートローダーを作成することでこれを実現する方法を見つけたと思うので、問題が発生した場合は、必ずここに文書化します。しかし、簡単な解決策をまだ望んでいます...
beatgammit

1
残念ながらできませんが、ROファイルシステム/boot(RO)、/(RO)、/var(RW)、/home(RW)を使用して破損の可能性を大幅に減らしました。最初の問題は、起動中に電源が切断されたときのファイルシステムの破損でした。ただし、第2ステージのブートローダーを作成/検索したいのですが。
beatgammit 2013年

1
PiのNOOBS(raspberrypi.org/archives/4100)ブートローダーの機能を確認できます。リカバリパーティションとインストールを提供するため、実際に使用するだけで目的に合う場合があります。
フレッド

1
カスタムブートローダーを「反対」に使用することをお勧めしますが、システムの起動後に実行されるハックを使用します。実装がより簡単になり、デバッグがより安全になります。不完全なブートローダーはあなたのパイを揚げることができます。
Maxthon Chan

回答:


5

システム起動後のいつでもエラーが発生する可能性がある場合は、ウォッチドッグタイマーといくつかのブートスクリプトを使用できます。

この方法の原則は、システムが適切にシャットダウンせずに再起動するたびに、リカバリパーティションに移動することです。

システムが起動して適切にシャットダウンするたびに実行されるスクリプトを作成する必要があります。/boot/cmdline.txtシステムの起動時に回復パーティションに変更し、適切にシャットダウンする前に元に戻します。

次に、ウォッチドッグタイマーを設定します。BCM2835チップに組み込まれているものを使用するか、または(リビジョン2ボードを使用している場合)2つのGPIOピン、リセットヘッダーP6と555チップを使用して独自に作成できます。重要なプログラムが開始したら、ウォッチドッグタイマーを開始し、システムが正常に動作している場合は定期的に犬を蹴ります。システムに障害が発生すると、ウォッチドッグタイマーが作動してプロセッサをリセットし、それをリカバリパーティションに送信します。これには、ユーザーの操作も必要ありません。組み込みタイマーを使用している場合は、GPIOもありません。

この方法を使用すると、ボタンをP6ヘッダーにインストールすることにより、Rev。2ボードに手動でシステムをリカバリに送信することを保証するリセットボタンを実装することもできます。


あなたの最初の答えはおそらく私がすることに少し近いですが、私はユーザースペースとウォッチドッグでGPIOを使用するという考えが好きです。私はおそらくアイデアの卸売りを一切使用しませんが、あなたは私にいくつかの良いアイデアを与えました。ありがとう!
beatgammit 2014年

1

カーネルをハッキングせずにこれを行う方法があります。これには、システムを不用意に再起動しないように保護することが含まれます。

  1. アップグレードイメージをダウンロードし、チェックサムして、スクラッチスペースに展開します。
  2. /boot/cmdline.txtを変更して、次回のシステム起動時にリカバリパーティションをルートブロックデバイスとして使用するようにします。
  3. 最初からアップグレードをインストールし、それが機能していることを確認します。
  4. アップグレードが機能している場合は、/ boot / cmdline.txtを元に戻します。
  5. 必要に応じて、再起動します。

アップグレードに失敗すると、システムが自動的にリカバリで起動します。GPIOは必要ありません。


ここでの唯一の問題は(システムによっては)更新が完了してから数時間後に障害が検出される可能性があることです。この時点で、ユーザーはリカバリパーティションに戻すオプションがありません。

1
@DanNixonこの新しい問題を解決するために別の回答を投稿しています。
Maxthon Chan

1

また、考えられる3番目の解決策がありますがinitrd、syscallがどのように機能するかを理解するために、Linuxディストリビューションの一部のPCバージョンを分析する必要がありますpivot_init()。Piのカーネルにこのsyscallがあるかどうかはわかりません。その場合、この方法は可能であり、カーネルハックも不要で、1つのGPIOを使用します。

そのためにはinit、本番システムでカスタムプログラムを作成する必要があります。GPIOがオンになっているかどうかを確認します。もしそうなら、pivot_root()回復する。その後exec()initシステムが起動し続けるようにオリジナル。運用システムでは、このGPIO監視をinit元のinit(PID = 1)と並べて(PID = 2)実行し続ける方法を理解し、GPIOを監視して再起動して回復することができます。ボタンが押された。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.