Hack BBS

[全部のスレッド一覧][新規投稿][記事の削除・変更] [Home Page]

返信投稿はタイトルのリンクをクリックして下さい
スレッド【No.851】の中の記事をすべて表示しています

【No.851】のスレッド
04/06/25(金) 22:06:50 投稿者[小沢] [No.851]のスレッド内
【No.851】 タイトル[カーネル入れ替え] この記事がスレッドの最初です
小沢と申します。こちらには初めての書き込みになります。
よろしくお願いいたします。

昨日玄箱を衝動買いしてしまい、買ってからあちこち参考にさせて
いただいてます。情報提供してくださった方、ありがとうございました。
とりあえずDebian化してみました。

見たところ、DebianやVineなどディストリビューションの稼働実績は
あるけれど、カーネルは開発元提供の2.4.17で(古っ)、より新しいカーネル
の入れ替えの実績は無いと。それは大いに残念です。
...と思ってたら、昨晩No.838でたつやさんからカーネル起動の報告がっ。
すばらしいです!
しかしシリアルが必要ですか...私は半田付けがヘタで...困ったな...。

というわけで、非破壊的なカーネル入れ替えの方法を夢想しているのです
けども、EMモードってのがありますよね。Windows PCでKuroBoxUpdate.exe
を実行するとLAN経由でFlash ROMの書き換えをやってくれるやつ。これは
玄箱のROMモニターが実現している機能ではないでしょうか?
ぷらっとホームのOpenBlockSSはROMモニターがLAN経由でFlash ROMに
書いてくれたので、失敗しても何度もやり直しができました。
玄箱も同じなら、そのプロトコルを解析すれば失敗しても何度でも
やり直しができるでしょう。(OpenBlockSSはBOOTP+tftpでした。)
しかし、RAMディスクモードで起動したLinuxがFlash ROM書き換えを
やってるのかもという気もしてます(未確認)。それならダメです。

もうひとつ考えたのは、今のカーネル2.4.17から別のカーネルを起動する、
つまり2.4.17をブートローダーにするというものです。この路線をしばらく
考えてたのですけども、例えば仮想記憶をOFFにするとか、ハードウェアの
リセットをいろいろやらないとうまく動かなそうな気がしてきました。

自分ではどうにもできなそうです。
どなたか玄箱にGRUBを移植なさったりはしないでしょうか。
Flash ROMから起動できてディスクの読めるブートローダーがあれば
とても嬉しいです。

以上です。とりとめがなくてすみません。

04/06/26(土) 00:27:36 投稿者[たつや] <http://linkstation.yi.org/> [No.851]のスレッド内
【No.854】 タイトル[Re: カーネル入れ替え] 【No.851】に対する返信
>しかし、RAMディスクモードで起動したLinuxがFlash ROM書き換えを
>やってるのかもという気もしてます(未確認)。それならダメです。

EM モードはこちらのほうですね。普通にカーネルが起動し、(HDD
ではなく) FLASH 上にある RAMDISK イメージをルートにマウント
して起動されます。
Linux が起動してしまえば FLASH はドライバ経由で書き換えでき
ますので、FLASH のアップデートはこうなっているようです。

>もうひとつ考えたのは、今のカーネル2.4.17から別のカーネルを起動する、
>つまり2.4.17をブートローダーにするというものです。この路線をしばらく
>考えてたのですけども、例えば仮想記憶をOFFにするとか、ハードウェアの
>リセットをいろいろやらないとうまく動かなそうな気がしてきました。

私も最初に考えたのはこれでした。
PS2 Linux に akmem というプログラムがあって、Linux 上から別の
カーネルをメモリ中にロードして強制的にそのカーネルに制御を渡す
ことでリブートやカーネルの切り替えを実現するものです。

で、最初しばらくこれの移植をやっていたのですが、MIPS と PowerPC
の仮想記憶機構が異なるのか、そのままでは動きそうになかったの
で、お蔵入りになっています。私にはちょっと難しかったのですが、
不可能ではないと思うので、できる方が挑戦していただければ幸い
です。これができれば、FLASH には一切触らず、シリアルコンソール
もまったく必要ありません。

>どなたか玄箱にGRUBを移植なさったりはしないでしょうか。
>Flash ROMから起動できてディスクの読めるブートローダーがあれば
>とても嬉しいです。

GRUB は考えたことがないのですが、私の構想としてはとりあえず
ブートローダから最低限カーネルの起動ができるようになれば、次
は U-Boot の移植を行おうと考えています。
U-Boot はいわゆる ROM モニタで、これができれば、ネットワー
クブートやディスクからのブートができるようになると思います。
(もし U-Boot が動いたら OpenBlockS あたりから NetBSD を移植
してくれる人がいないかな :-) とか、、、)

04/06/27(日) 02:55:39 投稿者[小沢] [No.851]のスレッド内
【No.862】 タイトル[Re: カーネル入れ替え] 【No.854】に対する返信
たつやさん、こんにちは。コメントありがとうございました。

>EM モードはこちらのほうですね。普通にカーネルが起動し、(HDD
>ではなく) FLASH 上にある RAMDISK イメージをルートにマウント
>して起動されます。

やはしそうですか。それは残念です。
(開発者はどうしてたんだ...JTAGか。)

>私も最初に考えたのはこれでした。
>PS2 Linux に akmem というプログラムがあって、Linux 上から別の
>カーネルをメモリ中にロードして強制的にそのカーネルに制御を渡す
>ことでリブートやカーネルの切り替えを実現するものです。

なるほど、akmemは知りませんでした。
みんな同じことを考えるのですね。

>で、最初しばらくこれの移植をやっていたのですが、MIPS と PowerPC
>の仮想記憶機構が異なるのか、そのままでは動きそうになかったの
>で、お蔵入りになっています。私にはちょっと難しかったのですが、
>不可能ではないと思うので、できる方が挑戦していただければ幸い
>です。これができれば、FLASH には一切触らず、シリアルコンソール
>もまったく必要ありません。

完全に非破壊的な方法はこれしかないと思います。
しかし実現性がはっきりしないし、No.861に書いた実現できそうな
方法が見えてきたので、No.861の方法でうまく動いたらこちらの方法は
私はもう考えないでしょう。どなたか識者の方、よろしくお願いします。
もしNo.861の方法で動かなかったら...縁がなかったと思って玄箱は
あきらめます。

>GRUB は考えたことがないのですが、私の構想としてはとりあえず
>ブートローダから最低限カーネルの起動ができるようになれば、次
>は U-Boot の移植を行おうと考えています。

そうでした。PowerPCならPPCBootやU-Bootですよね。名前しか知らなくて
普段x86でGRUBを使ってるので、とっさにGRUBの名前が出てしまいました。

しかし前の書き込みを書いた後に、GRUBやU-Bootがあってもコンソールが
無いとカーネルを選択する手段がないことに気がつきました。
そうすると必要なのは「フラッシュメモリから起動できてディスクが
読めてTelnetに対応してそこそこ安定しているブートローダー」です。
(そんなのあるのか?)
もっともTelnetでなくても、ネットワーク・ブートができればそれオンリーで
運用することはできそうです。

>(もし U-Boot が動いたら OpenBlockS あたりから NetBSD を移植
>してくれる人がいないかな :-) とか、、、)

私はDebianオンリーなのでお役に立てません...。

---

なんのかんの言ってもシリアル・コンソールがないと不便なので、今日は
コンソール増設の第一関門のR76ショートと4ピン半田付けをやりました。
RS232C変換ケーブルが入手できてないので稼働確認はまだできませんが、
テスターで測ると3.3V出てるので大丈夫かなと(甘い?)。
あと熱対策として箱の前面下の方に穴を開けて、ファンの後ろの
プラスチックの覆いを取り去りました。風通しがよくなってあまり熱く
ならなくなりました。

以上です。ありがとうございました。

04/06/25(金) 22:48:38 投稿者[虹野彼方 ] [No.851]のスレッド内
【No.852】 タイトル[Re: カーネル入れ替え] 【No.851】に対する返信
玄箱なら、シリアルコンソール無くても別カーネルを起動させる方法ありますよ。
ここで説明するのは面倒なので、興味があるならメール下さい。

04/06/26(土) 00:06:22 投稿者[たつや] <http://linkstation.yi.org/> [No.851]のスレッド内
【No.853】 タイトル[Re: カーネル入れ替え] 【No.852】に対する返信
>玄箱なら、シリアルコンソール無くても別カーネルを起動させる方法ありますよ。
>ここで説明するのは面倒なので、興味があるならメール下さい。

そういわずに、ぜひその方法を教えてください。
メールでないとだめでしたら私からもメールさせていただきますが、
詳しい手順じゃなくてもどういう経路で行うか等、ヒントをおねがい
できればとおもいます。

04/06/27(日) 11:15:28 投稿者[虹野彼方] [No.851]のスレッド内
【No.869】 タイトル[Re: カーネル入れ替え] 【No.853】に対する返信
まともな編集機能もないWeb上のBBSみたいな低機能なシステムでやりとりするの嫌なんですよ。
たつやさんが公開してくれたカーネルソースやsetsum.cのお陰で色々と楽をさせてもらったけど勘弁してください。
幸い小沢さんがメールで説明した内容を簡単に纏めてくださったので、あれ以上の詳しい内容が知りたかったらメールしてください。
#まあ、あれ以上説明する内容なんてほとんど無いけど

04/06/27(日) 16:35:56 投稿者[たつや] <http://linkstation.yi.org/> [No.851]のスレッド内
【No.876】 タイトル[Re: カーネル入れ替え] 【No.869】に対する返信
>たつやさんが公開してくれたカーネルソースやsetsum.cのお陰で色々と楽をさせてもらったけど勘弁してください。

小沢さんの書き込みで理解させていただきました。
どうもありがとうございました。

>幸い小沢さんがメールで説明した内容を簡単に纏めてくださったので、あれ以上の詳しい内容が知りたかったらメールしてください。

別件(というか、かなり関連はしてるのですが)でメール
を送らせていただきました。
ファームのカーネルでの起動はできたのですが、自分でコ
ンパイルしたカーネルの起動で問題がおきており、すでに
起動実績のあるコンフィグレーションを教えていただきた
いという内容です。
よろしくお願いいたします。

(わざわざここに書いたのは、BBS をお読みの皆さんへの
経過報告のようなものですので、こちらにレスしていただ
かなくてもかまいません。> 虹野さん)

04/06/27(日) 02:07:28 投稿者[小沢] [No.851]のスレッド内
【No.861】 タイトル[Re: カーネル入れ替え] 【No.853】に対する返信
たつやさん、虹野さん、こんにちは。
虹野さんに教えていただいて自分なりに理解した内容を以下に書きます。
虹野さんからはパッチおよび作業手順書も送っていただきました。
ありがとうございました。これから試してみます。

------

山下さんのフラッシュメモリ解析( http://www.yamasita.jp/linkstation/flashmemory.html )
によると、、、

/dev/fl1 0xFFC00000 3MB オリジナル・カーネル(firmimg.bin)
/dev/fl2 0xFFF00000 448KB ブートコード
/dev/fl3 0xFFF70000 64KB HDD から起動するかどうかのステータス
/dev/fl0 0xFFF80000 512KB 設定の保存用(conf_save.tar.gz)

設定の保存をあきらめれば/dev/fl0全部と/dev/fl2のブートコードの
後ろの方の空きエリアをあわせて1MB弱のエリアを取れます。
ここに新しいカーネルを書いて、独自のブートコードでブートするわけです。
(虹野さんはνカーネル、νブートコードと呼んでました。)

1. ブートコード(/dev/fl2)を次の『νブートコード』に置き換える。
νブートコード:
if (/dev/fl3にνカーネルをロードする指示が書いてある) {
- /dev/fl3の指示をオリジナル・カーネルのロード指示に置き換える
- /dev/fl2の空き部分と/dev/fl0に分割されたνカーネルを
つなぎ合わせてRAM上にコピー
- RAM上のνカーネルをgunzip()
}
else {
- /dev/fl1上のオリジナル・カーネルをgunzip()
}
カーネルのブートストラップ・ロジックにブランチ

2. νカーネルを適当に分割して/dev/fl2の空き領域と/dev/fl0に入れる。

3. /dev/fl3にνカーネルのロード指示を書き込んで再起動する。

4. もしνカーネルの起動に失敗しても、電源を入れ直せばνブートコード
によってオリジナル・カーネルが起動されるので問題なし。

5. νカーネルの起動に成功したら、再起動の前に/dev/fl3にνカーネルの
ロード指示を毎回書き込む必要あり。

------

νブートコードを/dev/fl2に書き込む部分が非破壊的でなくて怖いですが、
新しいカーネルが一発で起動する事に賭けるよりは勝てそうな気がします。
(まだ試してませんが。負けたらどうしよう...縁がなかったと思って
玄箱はあきらめよう。)

04/06/27(日) 16:26:51 投稿者[たつや] <http://linkstation.yi.org/> [No.851]のスレッド内
【No.875】 タイトル[Re: カーネル入れ替え] 【No.861】に対する返信
>たつやさん、虹野さん、こんにちは。
>虹野さんに教えていただいて自分なりに理解した内容を以下に書きます。
>虹野さんからはパッチおよび作業手順書も送っていただきました。
>ありがとうございました。これから試してみます。

まとめて報告いただき、ありがとうございます。
また、虹野彼方さんにもうまい方法を紹介していただき、ありがとうございました。

>設定の保存をあきらめれば/dev/fl0全部と/dev/fl2のブートコードの
>後ろの方の空きエリアをあわせて1MB弱のエリアを取れます。

なるほど。確かに fl2 は 40KB 弱しか使っていませんのでほと
んどあいていますね。(私はここに U-Boot を突っ込もうとして
います。)
合計すればカーネルを入れることはできそうだと思いますが、
fl3 が邪魔です。分断されたままで連結して使うということは
まったく思いつきませんでした。

> if (/dev/fl3にνカーネルをロードする指示が書いてある) {
> - /dev/fl3の指示をオリジナル・カーネルのロード指示に置き換える
> - /dev/fl2の空き部分と/dev/fl0に分割されたνカーネルを
> つなぎ合わせてRAM上にコピー

ここで必ず fl3 の内容を元に戻すところがミソですね。これが
ないと、起動に失敗しても元のカーネルで起動する方法がなく
なってしまいます。

>νブートコードを/dev/fl2に書き込む部分が非破壊的でなくて怖いですが、
>新しいカーネルが一発で起動する事に賭けるよりは勝てそうな気がします。
>(まだ試してませんが。負けたらどうしよう...縁がなかったと思って
> 玄箱はあきらめよう。)

少なくとも1回はブートコードを書き換える必要がありますが、
それ以降(カーネルのみの書き換えの場合)は書き換えのツール
を工夫すればブートコード部分を変更しないようにできそうです。
がんばってみてください。