Chapter 7. カーネルのコンパイル

目次
7.1. カーネルソースのインストール
7.2. イタリアキーボート配列
7.3. カーネルの再コンパイル
7.4. カーネルコンフィグレーションファイルの作成
7.5. カーネルのConfiguring
7.6. dependencies の作成と再コンパイル
7.7. 何かおかしいとき

ほとんどの NetBSD ユーザーは遅かれ早かれ customized カーネルをコンパイルします。 これはいくつかの利点があり:

7.1. カーネルソースのインストール

インストーラー Sysinst は、 カーネルソースをハードディスクにコピーしません。 なので、手作業で展開する必要があります。 カーネルソースアーカイブは source/sets ディレクトリーにあり、 syssrc.tgz と言う名前です。

# gzip -dc syssrc.tgz | (cd / ; tar xvf -)    

辛抱してください: この操作には時間がかかります。 アーカイブにはとても多くのファイルが入っているからです。 ソースは /usr/src/sys にあって; シンボリックリンク sys がこのディレクトリーを示しています。 よって、次のコマンドは同じ結果になります:

# cd /usr/src/sys
# cd /sys
    

カーネルソースの展開後、ハードディスクの容量を節約するために 必要のないアーキテクチャーのディレクトリーを消すことができます。 単に、 /sys/archcd し、必要のないディレクトリーを消します。 i386 ポートでは、たとえば、 i386 ディレクトリーを残しておくだけ と言うことができます。 ほかのアーキテクチャーては、いくつかのソースディレクトリーを残しておく必要が あるかもしれません。

いったんソースがインストールされると、カスタムカーネルを作ることができ: 考えるほど難しいことではありまへん。 実際に、新しいカーネルはたった4か5のステップで作ることができ、 それは次の節に書いてあります。

7.2. イタリアキーボート配列

カーネルのコンパイルの前に、 Italian ユーザーは ソースファイル /sys/dev/pckbc/wskbdmap_mfii.c であらかじめ定義されている italian キーボードのレイアウトの変更を考慮すべきです。 標準の配列ではプログラマーにとって便利ないくつかの記号が見当たりません (例えば, 左右ブレースやチルダ)。 レイアウト代案として:

static const keysym_t pckbd_keydesc_it[] = {
...
KC(8),   KS_7,          KS_slash,       KS_braceleft,
KC(9),   KS_8,          KS_parenleft,   KS_bracketleft,
KC(10),  KS_9,          KS_parenright,  KS_bracketright,
KC(11),  KS_0,          KS_equal,       KS_braceright,
KC(12),  KS_apostrophe, KS_question,    KS_grave,
KC(13),  KS_igrave,     KS_asciicircum, KS_asciitilde,
KC(26),  KS_egrave,     KS_eacute,      KS_bracketleft, KS_braceleft,
KC(27),  KS_plus,       KS_asterisk,    KS_bracketright,KS_braceright,
...    

上のレイアウトは次の割り当てを定義し:

キー文字
Alt Gr + 7{
Alt Gr + 8[
Alt Gr + 9]
Alt Gr + 0}
Alt Gr + '`
Alt Gr + ì~
Alt Gr + é[
Alt Gr + +]
Shift + Alt Gr + è{
Shift + Alt Gr + +}

コンソールドライバー: NetBSD のバージョン 1.4 以降では、画面、キーボード、マウスの処理に wscons マルチプラットホームコンソールドライバーを 使います。 それ以前のバージョンでは pcconspcvt を使っていました。 詳しいことは Chapter 13 をご覧ください。

7.3. カーネルの再コンパイル

カーネルの再コンパイルには、コンパイラーセット (comp.tgz) がインストールされていることが必要です。.

カーネルのコンパイルの基本的なステップは

  1. カーネルコンフィグファイルの 作成/変更

  2. カーネルのコンフィグ

  3. 依存ファイル (dependencies) の作成

  4. カーネルの "Make"

  5. カーネルのインストール

7.4. カーネルコンフィグファイルの作成

註: この節で記載されたディレクトリーは i386 特有です。 ほかのアーキテクチャーの場合は、適切なディレクトリー (通常は arch サブディレクトリー)に置き換えてください。

カーネルコンフィグレーションファイル 個別のカーネルコンフィグレーション オプションはもちろん、 カーネルがサポートするデバイスの型や数、 characteristics を定義します。 カーネルコンフィグレーションファイルは /sys/arch/i386/conf ディレクトリーにあります。 新しいファイルを作る手っ取り早い方法は、今あるファイルの1つをコピーして、 変更を加えることで: 通常、ほとんどのプラットホームで最も良い選択は GENERIC コンフィグレーションファイルを選ぶことです。 コンフィグレーションファイル中のコメントにオプションについての記述があります; より詳しい記述は options(4) マニュアルページの中にあります。

# cd /sys/arch/i386/conf/
# cp GENERIC MYKERNEL
# vi MYKERNEL
    

カーネル名: カーネルコンフィグレーションファイル名は 歴史的に全て大文字です。

カーネルコンフィグレーションファイルの変更には 基本的に3つの操作を伴い:

  1. カーネルにハードウェアデバイス入れたり削ったりすることを対応します (例えば、不必要なら SCSI サポートを外すことができます)。

  2. カーネルの機能の有効/無効を対応します (例えば、 NFS クライアントサポートや Linux 互換性を有効にする ...)。

  3. カーネルパラメーターの調整。

"#" で始まる行はコメントで; その記号を(行頭に)つけることで無効化でき、 記号を消すことでその行が有効になります。 行は消す代わりにコメントにするほうが良くて; あとで、いつでもコメントを解除することができるからです。

dmesg コマンドの出力が、 どの行を無効にするかを決めるのに使えます。 各行の様式は:

<XXX> at <YYY>    

XXX と YYY の両方がカーネルコンフィグレーションファイルで有効に なっている必要があります。 きっと、最小設定を作り上げるまでに数々の実験をする必要があるでしょう。 でも、 SCSI も PCMCIA もないデスクトップシステムではカーネルの大きさは半減できます。

カーネルコンフィグレーションファイルのオプションと どれが不必要で無効にして良いのかは調査する必要があります。 それぞれのオプションには短いコメントが記述してあり、通常、 そのオプションが何をするものか理解するのに充分です。 多くのオプションについては、より長くて詳しい記述が options(4) マニュアルページにあります。 national キーボードサポート や CMOS 時計の現地時間設定のために 正しいオプションの設定をすべきです。 例えば、Italy 向けには:

options RTC_OFFSET=-60
...
options PCKBD_LAYOUT="KB_IT"    

Perl スクリプトの adjustkernel と言うもの が http://www.feyrer.de/Misc/adjustkernel にあり、 dmesg の出力を解析して、 自動的に最小のコンフィグレーションファイルを作ります。 それを実行するには Perl がインストールされている必要があります。 新しいソフトウェアのインストールに関する詳細は Chapter 8 に書かれています。. Perl をインストールするなら、あらかじめコンパイルされいてるパッケージ perl-5.00404.tgz をダウンロードし、次のコマンドを打ちこみます:

# pkg_add perl-5.00404.tgz    

これで、 Perl がインストールされ、設定されて、動く状態になります: 動かせない状態を 作り出すよりも簡単にできます...

ここで、次のようにスクリプトを実行し:

# cd /sys/arch/i386/conf
# perl adjustkernel GENERIC > MYKERNEL
    

このスクリプトを試した結果、きちんと動作し、手作業の量をだいぶ節約してくれました。 このスクリプトは存在するデバイスだけを設定すると言うことを用心してください: まだ、ほかのオプション (たとえば Linux エミュレーション、 ...) については手作業で設定する必要があります。

7.5. カーネルの設定

カーネルコンフィグレーションファイル (それを MYKERNEL と呼びます)の変更が終わったら、次のコマンドを実行します:

# config MYKERNEL    

MYKERNEL にエラーが無ければ、 config プログラムは カーネルコンパイルに必要なファイルを生成し、 そうでなければ、再び config を実行する前に、エラー部分を直すことが必要です。

7.6. dependencies の生成と再コンパイル

Dependencies の生成とカーネルコンパイルは 次のコマンドで行います:

# cd ../compile/MYKERNEL
# make depend
# make
    

コンパイルがエラーで止まることがあります; これにはさまざまな理由が 有り得ますが、一番良くある原因は config が、コンフィグレーションファイルを読み込めなかった場合です。 時々、ハードウェア問題によって失敗します (たいてい RAM チップ不良によって ): コンパイルは、ほかの大抵のアプリケーションよりも、システムに高い負荷をかけるからです。 ほかの典型的なエラーは次のようなもので: option B を有効にする、 と、 option A が必要なのに有効になっていない。

カーネルの完全コンパイルには数分から数時間かかり、 ハードウェアに依存します。 次の表にいくつかの例を載せておきます:

CPURAM (MB)Approx. time
486 DX2 50201 hour
P1669615 minutes
PIII1285 minutes
68030/2584 hours

make コマンドの生成結果は、コンパイルしたディレクトリーの netbsd ファイルです。: このファイルをルートディレクトリーにコピーします。 これに先立って、前のバージョンのものを保存しておきます。

# mv /netbsd /netbsd.old
# mv netbsd /
    

カスタマイズによって、カーネルのサイズは相当小さくできます。 次の例では、 netbsd.old が インストールで入っていたカーネルで netbsd が新しいカーネルです。

-rwxr-xr-x  1 root  wheel  1342567 Nov 13 16:47 /netbsd
-rwxr-xr-x  1 root  wheel  3111739 Sep 27 01:20 /netbsd.old    

新しいカーネルは再起動後に動き始め:

# reboot    

7.7. 何かおかしいとき

PC を再起動すると、新しいカーネルが期待通り動かなかったり、あるいはまったく起動しない 事もあります。 心配しないで: もしこうなったら、保存してあった以前のカーネルでリブートし、 新しいカーネルを除去できます ("シングルユーザー" で再起動するとより良いです)。