今回は知識だけ。

いろいろ調べてみた。

現在のlinuxマシンは、どのディストリビューションでも、i386系なら、間違いなくinitrdを使って起動している。
これは、linuxのブートカーネルibm-pcの(くだらない)仕様の制限に引っかかってしまうためである。
ibm-pcのブートストラップから、まずイニシャルブート(BIOS)→ブートローダと流れていくが、ブートローダは512バイトで書かれていなければならない。
このブートローダはファースト(一次)ブートローダともよばれ、その後、もっと大きなブートローダ(2次ブートローダ)を呼び出すことがほとんどである。
現状では、ほとんどのディストリビューションがこの2次ブートローダ方式を採用しており、2次ブートローダとしては大抵GRUBを使っている。
GRUBはconfig仕様として、ダイレクトにinitrdを指定できるようになっているので、非常に便利な2次ブートローダだ。


で、まずは、initrdの2段階ロケット発射方式がどのようなものか、から見ていきたい。

initrdとは

詳しくは以下のwebページを熟読してください。
http://www.linux.or.jp/JF/JFdocs/ext-root-mini-HOWTO-2.html
簡単には、次の通りです。
Linuxの2.0以降のカーネルでは、メモリ上にファイルシステムを作るramdiskファイルシステム(ramfs,cramfs)や普通のファイルをファイルシステムとしてマウントするloopbackファイルシステムがサポートされ、一段とファイルシステムを柔軟に使うことができるようになっています。
initrd はこの2つのファイルシステムのメカニズムを組みあわせることにより実現されたものです。
まず、起動時にファイルとして用意したファイルシステムramdisk上に展開し、そこを暫定的なルートファイルシステムとしてカーネルを立ちあげます。
その後、必要な処理をしてから実際のルートファイルシステムを再マウントして、本来必要なブートカーネルを起動します。
このように2段ロケット的なブートを行うことができるようになっているため、さまざまな用途で使われるようになってきています。

この機能を使って、initrd 上に pcmcia-cs を置いておけば、initrd で起動した状態で PC カードを使用できるようになります。そして、ルートファイルシステムを外付けの HDD や NFS サーバに置くと、内蔵 HDD には Linux パーティションを置く必要はなくなり、Win95 のディスクの片隅に loadlin.ext とカーネルイメージ、圧縮した initrd ファイルを置いておくだけで Linux が使えるようになります。(FD に入れれば内蔵 HDD には一切ファイルを置く必要がなくなります)

容量の問題で内蔵 HDD には Linux をインストールできない人や、Note PC でも複数のディストリビューション(Slackware, Red Hat, Debian)を切り替えて使ってみたい人には便利な機能でしょう。試していませんが MO や PD といったメディアをルートパーティションにして起動することも(動きはすごく遅くなるでしょうが)できるはずです。

ただし、外付け SCSI HDD や NFS ディレクトリをルートパーティションにした場合、当然のことですが使用中に PC カードを抜くことはできませんので、 note PC の命である可搬性は大きく損なわれます。

ibm-pcの欠点の克服

ibm-pc=いまのi386マシンはサーバであっても、FDからしかブートできません。
ウソです。
いろいろなものからブートできますが、ブートイメージはFDサイズが基本なんです。
つまり、最初にIPLが読み込むレコードサイズは、上記の通り、512バイト。
その後、512バイトのブートローダがローディングできるカーネルサイズは、最大でも1.44Mバイトなのです。
しかし、現在のlinuxカーネルは、2Mオーバなんてざらで、大きいものは5Mぐらいあるものもあります。
そうなると、ibm-pcではローディングできないので、起動できなくなってしまいます。
そこで、initrdで仮の小さいカーネルを起動させて、そのカーネルから本来の大きなカーネルを立ち上げてあげることによって、この大きなカーネルを立ち上げているのです。

<これどこかはあっているけど、かなり違っている気がする。これもあとで直す。>

IBM PC互換機のブート手順(wikipediaより)

まず、パーソナルコンピュータのCPUはBIOSの存在する FFFF0h 番地のメモリにある命令を実行する。このメモリ位置は(x86のリアルモードでの)システムメモリのほぼ最後尾にあたる。そこにはBIOSの初期プログラムの位置へのジャンプ命令が含まれていて、BIOSに制御が渡る。BIOS初期プログラムはPower-On Self Test(POST) を実行して必要な機器が正常に動作するかをチェックする。また、同時にそれら周辺機器の初期化も行う。次にBIOSは事前に設定されたデバイスリストを順にあたって、ブート可能な周辺機器を探す。そのようなデバイスが見つからない場合、エラーが発生してブート処理は停止する。BIOSがブート可能デバイスを発見すると、そのブートセクターをロードして実行する。ハードディスクドライブの場合、ブートセクターはマスターブートレコード(MBR)と呼ばれ、その内容はオペレーティングシステムには依存しない。MBRのコードはパーティションテーブルを調べてアクティブなパーティションを探す。それが見つかったら、MBRのコードはパーティションのブートセクターをロードして実行する。ブートセクターはオペレーティングシステムに依存することが多いが、その機能はカーネルをロードして実行することである。カーネルはさらに初期化処理を続行する。アクティブなパーティションがなかったり、アクティブなパーティションのブートセクターが不正だった場合、MBRは第二ブートローダをロードして制御を渡す。第二ブートローダは(多くの場合ユーザーに入力してもらって)パーティションを選択して、そのブートセクターをロードする。パーティションのブートセクターは一般にオペレーティングシステムカーネルをロードする。EFI準拠のファームウェアを持つ比較的新しいシステムでは、MBR か GPT のあるドライブからブートでき、標準のMBRブートローダを使わない。

<とりあえず、疲れたので続きはあとで>