kboot

出典: CellFanWiki

kbootは、Linuxカーネルの持つkexec技術をベースにして作られているブートローダで、任意のLinuxカーネルを起動させることが出来る。

PS3では、このkbootを「他のシステムブートローダ」として本体にインストールすることで、Linuxが起動できるようになる。

目次

[編集] kbootとは

kbootの実体は、ブートローダの実装に必要な最小設定でビルドされたlinuxカーネルと、Linuxカーネルを起動するスクリプトが仕込まれたinitrdである。つまり、kboot自身が極小のLinux環境である。そのため、最終的に起動させたいLinuxカーネルが何処にあろうと、Linuxで扱える場所であれば何処からでも自由に持ってきて起動させることが出来る。例えば、どこかのWebサーバーにおいてあるvmlinuxを起動させる、などということも出来る。

[編集] プロンプト

kbootが起動すると、画面には

kboot: 

というプロンプトが出る。

このプロンプトでカーネルの場所とオプションなどを指定することで、Linuxカーネルを起動できる。プロンプトに入力した文字列が、設定ファイルなどに書かれたいずれかのラベルと一致した場合は、そのラベルが展開されたうえで処理される。

また、cdやpwdといった組み込みコマンドや、任意のプログラムをkboot環境下で起動させることも出来る。ただし、中途半端なコマンドを書くと、linuxカーネルの指定と勘違いされる可能性もあるため、kboot環境で何かの操作をしたい場合は、sh とだけ入力して、シェルプロンプトを起動させたほうが良い。

[編集] 起動するLinuxカーネルの指定方法

kbootは、様々な場所からカーネルを取得して起動させることができる。

/path/to/kernel
このように絶対パスで指定すると、起動するシステムのルートからの絶対パスとして扱われる。
例: /home/k/linux-2.6.16.1/arch/i386/boot/bzImage
//path/to/kernel
このように、頭にスラッシュを2つつけて絶対パスで指定すると、kboot環境のファイルシステム内のパスとして扱われる。
例:
cd //tmp
wget http://some.host.net/vmlinux.gz
gzip -d vmlinux.gz
//tmp/vmlinux
relative/path/to/kernel
上記と同様。ただし相対パス
device:/path/on/device
device:path/on/device
特定のデバイス内のカーネルを指定することも出来る。deviceはデバイスファイルへのパスか、もしくは単に/devディレクトリ内のファイル名。
例: sda6:kernels/vmlinux
host:/path
この書式を使えば、NFSサーバーからカーネルを持ってくることができる。hostはドット繋ぎの数字表記か、ホスト名表記で。
例: server.my.org:/kernels/vmlinux
http://host/path/to/file
http://host:port/path/to/file
HTTPサーバーからカーネルを持ってくる。
例: cat http://www.kernel.org/kdist/finger_banner
ftp://host/path/to/file
ftp://host:port/path/to/file
FTPサーバーから。
例: ftp://server.my.org/pub/linux/kernel/v2.6/vmlinux-2.6.16
tftp://host/path/to/file
tftp://host:port/path/to/file
TFTPサーバーから。
例: tftp://bootserver.my.net/kernel-0a000001

[編集] kboot.conf

kbootは起動時にkboot.confを参照する。

kboot.confにはシェルスクリプトと同じ文法で(実際にはシェルスクリプトそのものなのだが)各種変数の定義が記述される。

以下の変数は特別な意味を持っている。

default=<command>
タイムアウト時や、ユーザーが何も入力せずにエンターキーを押した場合に実行されるコマンド
initrd=<path_to_file>
デフォルトでロードされるInitial RAM Disk。 なお、initrdの指定は、カーネルごとにブートパラメータとして付加することでも設定できる。
root=<device>
カーネルがデフォルトで選択するルートデバイス。これもまた、ブートパラメータとして与えることでも指定できる。
timeout=<seconds>
ユーザーが何も入力しなかった場合のタイムアウト時間の秒数。まだEnterを押していなくても、コマンドラインを編集している状態であれば「入力」とみなされる。defaultが指定されていない場合はtimeoutは働かない。

上記以外の変数が定義されていた場合、その変数名(ラベルと呼ばれる)は、kbootプロンプトで入力されたコマンドの展開に利用される。

例:

Example:

b26131="/boot/vmlinux root=/dev/sda7"

このような変数定義があった場合、kbootプロンプトに b26131 init=/bin/sh と入力すると、以下のように展開される。

/boot/vmlinux root=/dev/sda7 init=/bin/sh


また、PS3では、以下の特別なブートパラメータを指定できる。


video=ps3fb:mode:<video mode ID>
画面描画の解像度を明示できる。もし指定が無かった場合、auto mode が使用される。 <video mode ID> に指定する値は ps3videomodeで指定する値と同一。

[編集] kbootが起動時に行うこと

kbootは起動時に以下の手順で初期化を行う。

[編集] (1) デバイスを初期化する

各種デバイスドライバのモジュールをカーネルに組み込み、15秒間待つ。(一般に、USBデバイスなどはモジュールを組み込んでも、実際にデバイスが使えるようになるまで時間がかかるため。)

この間にきちんと認識できなかったデバイスは無視される。

[編集] (2) udev でデバイスファイルを作る

認識できた各種デバイスに対応するデバイスファイル(/dev/sda1 など)を作成する。

[編集] (3) ネットワークを初期化する

まず、kbootはDHCPでIPを取得しようと試みる。もし、DHCPがタイムアウトした場合は、以下の設定が使用される。

ipv4_addr="192.168.0.10"
ipv4_netmask="255.255.255.0"
ipv4_default=""
ipv4_nameserver=""
dns_domain=""

また、もし、DHCPサーバーからfilenameパラメータが指定された場合は、kbootは以下のようにNFSブートの初期化をおこなう。

Linuxカーネルファイル
next-serverで指定されたアドレスが、TFTPサーバーのアドレスとして認識され、filenameで指定されたカーネルを取得する際に使われる。
もし、next-serverパラメータが指定されなかった場合は、DHCPサーバーのIPアドレスが使用される。TFTPのデフォルトのルートパスは/tftpboot
NFSルートパス
NFSルートパスはdhcpd.confの option root-path 行で指定される。NFSサーバーのIPアドレスはコロンで区切ることで記述できる。

NFSブートするための、DHCPサーバーのdhcpd.confの設定例

host ps3-1 {

    hardware ethernet 00:13:A9:XX:YY:ZZ;
    fixed-address 192.168.0.20;
    option root-path "192.168.0.30:/tftpboot/linux";
    next-server 192.168.0.30;
    filename "/linux/boot/vmlinux-nfs";

}

NFSブートするための、/etc/kboot.confの設定例

default=nfsboot
timeout=10
root=/dev/nfs

nfsboot='tftp://$next-server$filename ip=on nfsroot=$nfshost:$path root=/dev/nfs '

[編集] (4) ファイルシステムをマウントする

kbootは、ルート('/')にマウントすべきファイルシステムを以下のルールに従って決定する。

  • ドライブの優先順位
    1. 内蔵 BD drive
    2. USB マスストレージ
    3. 内蔵HDD
  • パーティションの優先順位
    • メディアがパーティションテーブルを持たない場合、そのメディアを使用する
    • パーティションテーブルがある場合、最初のプライマリパーティションが active であれば、そのパーティションを使用する
  • 以下のフォーマットのメディアやパーティションのみが対象
    • ext2
    • ext3
    • FAT16/32
    • ISO9660

上記のルールにしたがって選択したメディア(もしくはパーティション)をマウントし、マウントしたファイルシステムから以下のファイルをkbootのRAMディスクにコピーする。

  • /etc/kboot.conf (もしくは /ETC/KBOOT.CNF)
  • /etc/fstab
  • /etc/hosts

[編集] (5) kbootのRAMディスク中の /etc/kboot.conf を初期化する?

(詳細不明?)

[編集] (6) keymap を初期化する

[編集] (7) kbootプロンプトを表示する

以上の初期化が終わると、kbootはプロンプトを表示する。

kboot:

何もキーボードから入力されず、タイムアウトすると、デフォルトのコマンドが実行される。


[編集] 参考資料