SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2006-07-17(Mon) GRUBの真髄へ

  ウンともスンとも動かないまま、連休最終日へ。今日を逃すと、まとまった時間が取れない。ここで一旦、方向性を変え、既存のコンパクトフラッシュ用ディストリビューションを「とりあえず」使ってみるコトにした。ポンと放り込んで使いたいのでiso形式が用意されているものがいい……コレだ「pyramid linux」ってヤツ。コレがいい。ddコマンドでベッタリとコンパクトフラッシュに書き出して、差し込んで起動……

PC Engines WRAP.1C/1D/1E v1.11
640 KB Base Memory
130048 KB Extended Memory
 
01F0 Master 848A LEXAR ATA_FLASH
Phys C/H/S 1008/4/32 Log C/H/S 1008/4/32
GRUB Loading stage1.5.
 
GRUB loading, please wait...
cbcba! ユ翕FCc茶篥覇篤篤篤篤篤篤篤篤篤篤篤篤篤篤篤篤篤……

  ……う、動いた!! ちょっと後半が化けているが、コレは「pyramid linux」のシリアル設定が19200bpsになっているせいだ。途中でTERATERMの設定を変えると……

  Booting 'Metrix'
 
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
kernel /boot/vmlinuz-2.6.16-metrix root=/dev/hda1 console=ttyS0,19200n8
   [Linux-bzImage, setup=0x1200, size=0x105916]
 
Linux version 2.6.16-metrix (root@hagbard) (gcc version 3.4.5 20050809 (prerelease) (Ubuntu 3.4.4-6ubuntu8.1)) #2 Wed Mar 22 15:

  ……このようにキチンとカーネルの読み込みが始まった!!

  しかし、コレで「よかった!!」とはならないのである!! なにせ、オイラは是が非でもRHELを動かしたいのだ。8MBの環境でRHELを動かすなんてのは、ほぼディストリビューションをイチから構築するに近い作業なのだが、オイラは正真正銘の「Linuxのプロ」なんだからそんなコト当然のようにできなくてはならない。むしろ、すでにこんなに長い間「動かねぇ!!」と悩んでいるのが恥ずかしいくらいである。

  気を取り直して考える。自分で作業した場合と圧倒的に違うのは、grubのオープニングメッセージだ。「pyramid linux」だと「GRUB Loading stage1.5.」なのに、オイラがやると「GRUB Loading stage2.......」いったいどっちが正しいんだ!!

  ……とかゴチャゴチャ作業しているウチに、コンパクトフラッシュのブートセクタでなく、誤って母艦のブートセクタをイジってしまったためか、母艦のFedoraが上がらなくなってしまった……どーしてまーこーも回り道だらけになるかなぁ……手元には「このPCでは起動しない」RHEL4のインストールディスクしかないぞ。レスキューモードが使えねぇじゃねぇじゃねぇじゃねぇかよ。個人的に焼いたKNOPPIXも職場に持っていっちまっているし……しかたない、CentOSの3でも落として、それをインストールしてみるか……小休止。

  で、CentOSの3を焼いた。面倒なのでFedoraをレスキューせず、そのままCentOSの3をインストールしてしまう。起動して、再びgrub-installしてWRAPを立ち上げる……

GRUB Loading stage2.......

  ……根本的にgrubについて勉強する必要がありそうだ。ちゅーか、このgrub-installスクリプトって、中でナニやってんだ!? 詳しく知らないのもシャクなのでソース持ってきてイチから勉強するか……

  ……うーむ、深いッ!! grubのソースを読んだら、まるで人間の赤ん坊が母親の胎内で数ヶ月で魚類から人間まで成長するかのような、そんな感覚を覚えたぞ。ブートプロセスの序盤は、PCが8bitの頃とあまり変わらないんだねぇ……以下、それも含め、判明したことをひたすら箇条書きにしてみよう。

・ハードディスクを最も低いレベルで読み書きする際は、CHSで場所を指定して512バイトずつ読み書きする
・CHSはシリンダ、ヘッド、セクタ(Cylinder/Head/Sector)のコトを意味している
・CHS指定だとハードディスクを「裏面の内側から5番目の……」みたいに物理指定するので無駄が多く、最大504Mしか扱えない
・504Mでは足りないので、ハードディスク側でウソのCHS指定を可能にすることにした(255Headとかを受け付け、HDD側で変換)
・そしたら7.9GBまで使えるようになったけど、これもすぐ足りなくなったので、LBAという指定方法が導入された
・LBA指定は単純に先頭からの絶対位置指定なので、CHS指定のように無駄なビットは発生しない
・LBAが28bitだと128GBまで扱える、最近はこれが48bitに拡張され、これはBigDrive対応と呼称されている
 
・CHSにしてもLBAにしても、ハードディスクでもフロッピーでも、イチバン先頭の512バイトは特別である
・イチバン先頭の512バイトにはブート情報などが書き込まれている、いわゆるMBRというヤツである
・だが、ハードディスクの場合、この512バイトの後半16x4+2バイトは、領域情報となっている
・領域情報とはいわゆるパーティションテーブルのコトで、16x4の4は基本領域の最大数を示している
・最後の2バイトは"0x55AA"という固定値が書き込まれている、これ以外が書いてあると領域情報は無効と判断される
 
・grubのステージ1は、基本的にこのMBRに書き込まれるべき512バイトのプログラムである
・しかし「dd if=/boot/grub/stage1 of=/dev/hda bs=512 count=1」とやってはダメである
・/boot/grub/stage1の後半16x4+2バイトにはフロッピー用のブートプログラムが入っているためだ
・上記のコマンドを実行すると、ハードディスクの領域情報が書きつぶされてしまう
・ほんじゃ「dd if=/boot/grub/stage1 of=/dev/hda bs=446 count=1」ならいいのか?
・実はstage1の一部には、次に読むべきセクタが「埋め込まれている」ので、そのままddしてもやっぱりダメ
 
・では、次に読むべきセクタ(一般にはイチバン先頭の512バイトの直後)には何が書いてあるべきなのか?
・これは、grubのステージ1.5もしくはステージ2が書いてあるべきである
・ステージ1.5とステージ2のどっちが書いてあるべきなのか?
・都合でステージ2をファイルシステム(FATとかext3)上に置く場合、ステージ1.5を利用すべきである
・細かい説明は省くが、一般にハードディスクの場合はステージ1.5を利用する
・そのために、ステージ1.5はステージ2が置いてあるファイルシステムの種類別に用意されている
・Linuxの場合、通常はext2ファイルシステムを使うので、e2fs_stage1_5を利用する
・ほんじゃ「dd if=/boot/grub/e2fs_stage1_5 of=/dev/hda bs=512 seek=1」していいのか?
・こいつも微妙に「情報が埋め込まれる」ようなので、そのままddしてもダメ
・よってステージ1、ステージ1.5のインストールには、grub-installを「必ず」利用する必要がある
 
・ステージ1.5はどうやってステージ2を探すのか?
・「strings /boot/grub/e2fs_stage1_5」するとわかる、中に直接「/boot/grub/stage2」と定義されている
・よってステージ1.5は、ちゃんとext2ファイルシステムを理解して、指定のパスからステージ2を読み込む
 
・ステージ2はどんな処理を担当しているのか?
・メニューを出して起動カーネルを選択させたり、カーネルを読んで制御を移すまでのすべてである
・ステージ2からは、ほとんどの制御を自分自身で行うので、イメージ付き起動メニューも出せる
・一方で、シリアルポート経由で起動メニューを利用する場合は……
 serial --unit=0 --speed=38400
 terminal serial
 ……みたいな記述を行ってそれを指定する必要がある
 
・……で、そこまでわかって、結局コンパクトフラッシュから起動できたの?

  ……できんッ!! 起動メニューすら出てこんッ!! もう寝るッ!!