Armadilloフォーラム

アプリケーションからのブート設定の取得・変更について

shasegawa

2015年1月21日 11時14分

長谷川と申します。

ネットワーク経由でのカーネル・ユーザーランドのアップデートを検討しています。

イメージの書き換え中に電源が落ちることを想定し、イメージを2面持ちにして書き込みが完了したことを確認した上でブートするパーティションを切り替えるようにしたいです。
このためには、アプリケーションからブートローダーの起動オプションを取得・設定できる必要があるのですが、このようなことは実現可能でしょうか?

また、再起動後にカーネルパニック・アプリケーションの起動失敗することを考慮して、一定時間経過しても正常起動を確認できなかった場合は、起動オプションをきり戻して自動的に再起動させることは可能でしょうか?

よろしくお願いいたします。

コメント

at_takenoshita

2015年1月21日 12時35分

竹之下です。

> イメージの書き換え中に電源が落ちることを想定し、イメージを2面持ちにして書き込みが完了したことを確認した上でブートするパーティションを切り替えるようにしたいです。
リモートからの書き換えを考慮すると、このような対応は必要ですよね。

> このためには、アプリケーションからブートローダーの起動オプションを取得・設定できる必要があるのですが、このようなことは実現可能でしょうか?
Linuxアプリケーションからブートローダーのパラメータ(起動オプション)を
書き換えられるようなツールは今の所提供しておりません。
hermit-at(ブートローダー)のソースを解析すれば、ツールを作ることも
可能ではありますが、ブートローダーのパラメータを書き換えている時に
電源が落ちることも考慮すると、hermit-at自身に手を入れる必要が
あると思います。

少し視点を変えて、正常に書き込まれたイメージか、起動する前にブート
ローダーがチェックするという方法はいかがでしょうか?

フラッシュメモリのパーティション構成を下記のように分割したとします。
1. bootloader
2. kernel1 (復旧用)
3. kernel2
4. userland1 (復旧用)
5. userland2
6. config

そして、Linuxカーネル、ユーザーランドのイメージ作成時、ファイルの最後に
チェックサムを付加しておきます。
(Atmark Distでイメージを生成すると、自動的にチェックサムが付加されるように
なっています)

ネットワーク経由で更新するイメージは、常にkernel2/userland2に書き込みます。
イメージ書き込み時は、チェックサムごとフラッシュメモリに書き込みます。もし、
書き込み途中に電源断が発生したら、チェックサムが書き込まれません。

起動時、まずkernel2に書き込まれているイメージのチェックサムを確認します。
チェックサムが正しければkernel2のイメージで起動し、正しくなければkernel1の
イメージで起動します。
userlandについても同様のシーケンスにします。
もし、kernel1またはuserland1で起動していたら、kernel2/userland2の復旧を
試みるよう設定しておくと良いでしょう。

このようなシーケンスにしておくと、イメージ書き込み時に電源断が発生しても、
必ず復旧できるようになります。

> また、再起動後にカーネルパニック・アプリケーションの起動失敗することを考慮して、一定時間経過しても正常起動を確認できなかった場合は、起動オプションをきり戻して自動的に再起動させることは可能でしょうか?
ハードウェアウォッチドッグ機能がありますので、正常起動できなかったら、再起動するということは可能です。
しかしながら、再起動要因を取得できないので、オプションを切り戻すという動作は難しいですね。

shasegawa

2015年1月21日 15時25分

長谷川です。回答ありがとうございます。
何点か確認させてください。

> 少し視点を変えて、正常に書き込まれたイメージか、起動する前にブート
> ローダーがチェックするという方法はいかがでしょうか?
はい、ご提案いただいた方法でも要件は満たせると思います。

> フラッシュメモリのパーティション構成を下記のように分割したとします。
> 1. bootloader
> 2. kernel1 (復旧用)
> 3. kernel2
> 4. userland1 (復旧用)
> 5. userland2
> 6. config
Armadillo-IoT の場合、オンボード上のFlashのパーティション構成を変更することは可能でしょうか?
もしくは、microSD などの外部ストレージにイメージを置くことが前提でしょうか?

> 起動時、まずkernel2に書き込まれているイメージのチェックサムを確認します。
> チェックサムが正しければkernel2のイメージで起動し、正しくなければkernel1の
> イメージで起動します。
> userlandについても同様のシーケンスにします。
> もし、kernel1またはuserland1で起動していたら、kernel2/userland2の復旧を
> 試みるよう設定しておくと良いでしょう。
>
> このようなシーケンスにしておくと、イメージ書き込み時に電源断が発生しても、
> 必ず復旧できるようになります。
製品ドキュメントからは対話モードで使用可能な各コマンドの説明は見つけられたのですが、それ以上の記述は見つけられませんでした。
起動時にこのようなロジックが自動実行されるようにする方法について、ドキュメント等がありましたら、その場所をご教授いただけると助かります。

よろしくお願いいたします。

at_takenoshita

2015年1月21日 16時12分

> Armadillo-IoT の場合、オンボード上のFlashのパーティション構成を変更することは可能でしょうか?
> もしくは、microSD などの外部ストレージにイメージを置くことが前提でしょうか?
オンボード上のフラッシュメモリのパーティション構成を変更できます。

Armadillo-420に関する情報ですが、下記の過去ログが参考になると思います。
(Armadillo-IoTはArmadillo-400シリーズがベースとなっています、)
http://lists.atmark-techno.com/pipermail/armadillo/2011-May/007197.html

> > 起動時、まずkernel2に書き込まれているイメージのチェックサムを確認します。
> > チェックサムが正しければkernel2のイメージで起動し、正しくなければkernel1の
> > イメージで起動します。
> > userlandについても同様のシーケンスにします。
> > もし、kernel1またはuserland1で起動していたら、kernel2/userland2の復旧を
> > 試みるよう設定しておくと良いでしょう。
> >
> > このようなシーケンスにしておくと、イメージ書き込み時に電源断が発生しても、
> > 必ず復旧できるようになります。
> 製品ドキュメントからは対話モードで使用可能な各コマンドの説明は見つけられたのですが、それ以上の記述は見つけられませんでした。
> 起動時にこのようなロジックが自動実行されるようにする方法について、ドキュメント等がありましたら、その場所をご教授いただけると助かります。
Armadillo全般に共通する方法として、 /etc/config/rc.local にコマンドを記述することで、起動時に自動実行できます。

下記のドキュメントが参考になると思います。
http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_startu…
http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2…

shasegawa

2015年1月21日 18時10分

長谷川です。お世話になっております。

> Armadillo全般に共通する方法として、 /etc/config/rc.local にコマンドを記述することで、起動時に自動実行できます。

/etc/config/rc.local に記述したコマンドは、Linux起動直後に実行されるのだと思います。
一方、ご提案いただいた方法は、hermit が Linux を起動する前にチェックサム等を確認し動的に起動パーティションを選択する、と理解したのですが正しいでしょうか?

私の理解が正しいとすると、hermit のソースコードを改修すれば実現可能だと思いますが、標準で提供されている機能で実現できるのであればご教授頂きたいです。

よろしくお願いいたします。

at_takenoshita

2015年1月21日 18時20分

竹之下です。

> > Armadillo全般に共通する方法として、 /etc/config/rc.local にコマンドを記述することで、起動時に自動実行できます。
>
> /etc/config/rc.local に記述したコマンドは、Linux起動直後に実行されるのだと思います。
> 一方、ご提案いただいた方法は、hermit が Linux を起動する前にチェックサム等を確認し動的に起動パーティションを選択する、と理解したのですが正しいでしょうか?
はい。ご認識の通りです。

> 私の理解が正しいとすると、hermit のソースコードを改修すれば実現可能だと思いますが、標準で提供されている機能で実現できるのであればご教授頂きたいです。
すみません。回答がずれていましたね。

イメージの二面持ちに対応する方法は標準の機能として作りこんでいませんので、hermitのソースコードの改修が必要となります。

※元々想定されていたイメージを書き込んだ後、ブートローダーのパラメータも書き換えるという方法でも、
パラメータ書き換え次に電源断があったときの対応のためにhermitの修正が必要となりますので、
どうせ修正するのならば、というご提案です。

shasegawa

2015年1月21日 18時30分

長谷川です。お世話になっております。

> イメージの二面持ちに対応する方法は標準の機能として作りこんでいませんので、hermitのソースコードの改修が必要となります。
了解です。
何かありましたら、改めて質問させて頂きたいと思います。