この節ではカーネルに対して起動時引数を渡すことのできるソフトの例をいくつか 紹介します。また、どのように引数が処理されるのか、起動時引数にはどのよ うな制限があるのか、引数がどのようにしてしかるべきデバイスに渡されるの かも説明します。
起動時引数では空白を使ってはならず、空白は各々の引数を分けるため だけに使う点を肝に命じておいてください。ある一つの引数に値のリス トを渡す時には、値はコンマで区切ります。くどいようですが、空白では ありません。以下の例を見てください。
ether=9,0x300,0xd0000,0xd4000,eth0 root=/dev/hda1 *正しい* ether = 9, 0x300, 0xd0000, 0xd4000, eth0 root = /dev/hda1 *誤り*
一度 Linux カーネルが起動し、動作していれば、起動時に指定されたコマン
ドライン引数は単に cat /proc/cmdline
をシェルプロンプトで実行
するだけで見ることができます。
Werner Almesberger による LILO (LInux LOader)プログラムは、もっともよく 使われている起動プログラムです。このプログラムは様々なカーネルを起動 でき、設定情報をテキストファイルで持っています。ほとんどの Linux の配布は、デフォルトの起動プログラムとして LILO を使っています。LILO は DOS、 OS/2、Linux、FreeBSD などを起動できます。ぜんぜん難しい点はなく、 非常に柔軟です。
よく見る設定は、コンピュータを起動した直後に LILO が 「LILO:」と
いうプロンプトを出して停止するものです。その後数秒間、利用者からの
入力を待ち、入力が無ければデフォルト指定されたシステムを起動します。
よく使われているシステムラベルとしては、Linux
, backup
,
msdos
などがあります。起動時引数を与えたいときには、ここで入力し
ます。引数を入力する位置は、LILO に起動させるシステムのシステムラベル
の後ろです。以下の例を見てください。
LILO: linux root=/dev/hda1
LILO には良くできた文書がついています。また、ここで説明する起動時引数
に関しては、引数を LILO の設定ファイルに追加するための append=
コ
マンドが特に重要です。使い方は、/etc/lilo.conf
ファイルに
append = "foo=bar"
といった行を単に追加するだけです。この行をファ
イルの先頭に置くと設定ファイルの全ての節に適用できますし、
image=
節の内側に書けば一つの節だけに適用できます。
より詳細な解説については、LILO の文書を参照してください。
他によく使われる Linux 起動プログラムとしては、`LoadLin' があります。 これは DOS のプログラムであり、必要な資源がそろっているものと仮定して、DOS プ ロンプトから(起動時引数つきで) Linux カーネルを起動します。これは、 DOS から Linux を起動したい人にとって便利です。
また、LoadLin はメーカーが提供している DOS ドライバを使って特定の状
態に設定しなければならないハード
ウェアを持っているときにも便利です。よくある例としては、DOS ドライバ
を使って特定のレジスターをいじらないと SB 互換にならない 「SoundBlaster
互換」カードがあります。DOS で起動してメーカー提供のドライバを使用
し、その後で LOADLIN.EXE
を使って DOS プロンプトから Linux を
起動すれば、再起動によって
カードが初期状態に戻ることを防げます。この結果、カードは SB
互換モードにとどまり、Linux で使用できます。
この他にも、Linux を起動するプログラムがいくつかあります。全てのプログ
ラムを見たいなら、お近くの Linux 関連 FTP ミラーサイト に行って、
system/Linux-boot/
ディレクトリを覗いてください。
カーネル起動時引数には、カーネルイメージ自身の中にデフォルト値を持っている
ものがあります。ほとんどのシステムには rdev
と呼ばれるソフトがあり、
これはカーネル内のデフォルト値の置き場所と、値の変更方法を知っています。
また、デフォルトのビデオモードのように、対応するカーネル起動時引数がな
いものも変更できます。
rdev は普通は swapdev, ramsize, vidmode, rootflags のような別名を 持っています。これら 5 つは rdev で変更できる設定です。つまり swap デ バイス、RAM disk 引数、デフォルトのビデオモード、root デバイスの読み出 し専用/読み書き両用の設定を変更できます。
rdev
に関する詳しい情報については、rdev -h
を実行するか、
付属の man ページを見てください(man rdev
)。
ほとんどの起動時引数は次のような形式です:
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
や BOOT_IMAGE=vmlinuz.bak
を起動時引数と
して渡すことが考えられます。こういった環境変数は普通、初期化スクリプト
で調べられ、さまざまな設定を有効または無効にするために使われます。
カーネルに受け入れられず、環境変数とも解釈されなかった引数は全てプロセ
ス 1 に引き渡されます。プロセス 1 は普通 init
プログラムです。
プロセス 1 に渡される引数のうち最も一般的なのは、single です。こ
の引数は init
に対してシステムをシングルユーザモードで起動し、
普通起動するデーモンを一切起動しないよう指示します。どのような引数が許
されるかは、お使いのシステムに導入されている init
の man ページを
参照してください。