この節ではカーネルに対して起動時引数を渡すことのできるソフトの例をいくつか 紹介します。また、どのように引数が渡されるか、どのような制限があるのか、 どのようにしてしかるべきデバイスに渡されるのかも説明します。
起動時引数では、空白は各々の引数を分けるのに使用し、 引数の中では使わないということを肝に命じて おいてください。ある引数に値のリストを渡す時には、 値はコンマで区切ります。くどいようですが、空白では ありません。以下の例を見てください。
ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1 *正* ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/hda1 *誤*
Werner Almesberger による LILO (LInux LOader)プログラムは、もっともよく 使われている起動プログラムです。このプログラムは各種のカーネルを起動 することができ、構成情報をテキストファイルで持ちます。ほとんどの Linux の配布は LILO を省略時の起動プログラムとして使用します。LILO は DOS、 OS/2、Linux、FreeBSD などを起動できます。ぜんぜん難しい点はなく、 非常に柔軟です。
よく見る設定は、コンピュータを起動した直後に LILO が 「LILO:」と いうプロンプトを出して停止するものです。その後数秒間、利用者からの 入力をまち、無ければ省略時指定されたシステムを起動します。皆がよく使って いるシステムラベルとしては、Linux、backup、msdos などがあります。起動時 引数を与えたいときには、ここに起動したいシステムのラベルを打ち込んだ後に 引数を打ち込みます。以下の例を見てください。
LILO: linux root=/dev/hda1
LILO には良くできた文書がついています。また、ここで説明する起動時引数 に関しては、引数を LILO 設定ファイルに追加するための append = コマンドが あります。使い方は、単に /etc/lilo.conf ファイルに append = "foo=bar" と指定するだけです。この行は、設定ファイルのすべての節に適用したければ ファイルの先頭におけばいいですし、一つの節だけに適用したければ、image= 節の内側に書くだけです。より詳細な解説は、LILO の文書を参照して下さい。
他によく使われる Linux 起動プログラムとしては、LoadLin があります。 これは DOS のプログラムで、必要な資源がそろっているものと仮定して、DOS プ ロンプトから(起動時引数つきで) Linux カーネルを起動します。これは、 DOS から Linux を起動したい利用者に便利です。
また、DOS ドライバーを使って特定の状態に設定しなければならないハード ウェアを持っているときにも便利です。よくある例としては、DOS ドライバー を使って特定のレジスターをいじらないと SB 互換にならない 「SoundBlaster 互換」カードがあります。DOS で起動してメーカー供給のドライバーを使用 し、Loadlin で Linux を DOS プロンプトから起動すれば、リセットによって カードが初期状態に戻るのを防ぐことができます。この結果、カードは SB 互換状態にとどまり、Linux で使用することができます。
その外にも、Linux を起動するプログラムはあります。全部みたいなら、 あなたの周りの Linux ftp mirror にいって、system/Linux-boot を覗いて 下さい。
カーネル起動時引数には、カーネルイメージ自身の中に省略時値を持っている ものがあります。ほとんどのシステムには rdev と呼ばれるソフトがあり、 これを使用すると、カーネルイメージの中の省略時値を変更できます。また、 省略時ビデオモードのようにカーネル起動時引数と指定できないようなものでも 変更できます。
rdev は普通は swapdev、ramsize、vidmode、rootflags のようなエイリアスを 持っています。つまり、swap デバイス、RAM disk 引数、既定のビデオモード、 root デバイスの読み出し専用/読み書き両用の設定といった 5 種類のものを rdev で変更できるわけです。
rdev -h を打つか、man ページを読めば、より詳しい情報を得ることができま す。
ほとんどの起動時引数は次のような形式です。
name[=value_1][,value_2]...[,value_11]
ここで、"name" は、その後ろに続く値がカーネルのどの部分に適用 されるかを表す一意なキーワードです。 起動時引数を複数与えるには、上の形式の引数を単に空白で区切って 与えます。付け加えておきますと、11 と言うのは本当の制限でして、 現在のコードは1キーワードあたりコンマで区切られた引数を11しか 取り扱えません(が、ほとんどないような複雑な状況の場合には 同じキーワードをもう一度使うことによってもう 11 引数までは 追加して与えることができます。setup 関数がこれを許すと 仮定してですが)。 もうひとつ付け加えると、カーネルはこのリストを 10 までの コンマで区切られた整数引数と、残りの文字列という形に分割 してしまいます。したがって、ドライバーが 11 番目の引数を 自分で文字列から整数に変換しない限り、11 個の整数を引数として 渡すことはできません。
分類は大部分 linux/init/main.c
で行われます。
最初にカーネルは引数が次の特別な引数のうちのどれかに当た
らないか調べます。特別な引数は "root="、"ro"、"rw"、"debug"
です。これらの特別な引数の意味はあとで説明します。
それから setup 関数 (bootsetups
配列 に入っています)
を見て、与えられた引数文字列 ( 例えば "foo" としましょう ) が
カーネルのどこかや、何らかのデバイス用に
setup 関数 (foo_setup()
) と関連付けられていないか
調べます。
カーネルに foo=3,4,5,6,bar
という引数を与えたと
しましょう。するとカーネルは bootsetups
配列を見て
"foo" が登録されていないかどうか調べます。登録されている
ならば、"foo" と関連付けられている setup 関数 (foo_setup()
)
を呼び出して、コマンドラインで与えられた整数引数 3、4、5、6 と
文字列引数 bar を与えます。
"foo=bar" という形式を持っていて setup 関数に受け付けられなかった 引数は、環境変数と解釈されます。(あんまり役に立たないかもしれませんが) 例を挙げると、起動時引数として渡される "TERM=vt100" などが考えられます。
カーネルに受け入れられず、環境変数とも解釈されなかった引数は、すべて
プロセス 1 に引き渡されます。プロセス 1 は普通 init
プログラムです。
プロセス 1 に渡される引数のうち最も多いのは、single です。この引数は
init
に対してシステムをシングルユーザーモードで起動し、普通起動する
デーモンを一切起動しないよう指示します。どのような引数が許されるかは、
たのシステムに導入されている init
の man ページを参照して下さい。