訳註: これは作業してる最中のもので、本来、訳作業者以外は見えないものです。 訳作業者以外は見ないでください。意味が反対になったりとか当然にあるから、 内容は利用しないでください。この言語への変換作業(翻訳作業)物に関しては、現在、オープンなライセンス条件ではありません。 十進240のコードのキャラクターを<240>に置換してる場合あり
Chapter32.Compiling the kernel

Table of Contents

32.1. Requirements and procedure
32.2. Installing the kernel sources
32.3. Creating the kernel configuration file
32.4. Building the kernel manually
32.4.1. Configuring the kernel manually
32.4.2. Generating dependencies and recompiling manually
32.5. Building the kernel using build.sh
32.6. Installing the new kernel
32.7. If something went wrong

NetBSD ユーザーの大部分は遅かれ早かれ カーネルの再コンパイルあるいは customized カーネルのコンパイルをしたくなります。 おそらくいくつかの理由があって:

32.1.Requirements and procedure

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

カーネルのアップデートまたはカスタマイズの基本ステップは:

  1. カーネルソースをインストールまたはアップデート

  2. カーネル設定ファイルの作成または変更

  3. 設定ファイルからのカーネル構築、手作業または build.shの利用で

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

32.2.Installing the kernel sources

ソースツリー全体を取得するため AnonCVS を使うと決めたら、 忍耐せねばならず、操作は多くの minutes がかかり、なぜなら repository には幾千ものファイルがあるからです。

# cd /
# tar zxf /path/to/syssrc.tgz

リリースの tarball を使っていてでさえ、 リリース後に適用されたソースの変更にアップデートするために AnonCVS を使いたくなるかもしれません。 NetBSD Security Advisory に記述された脆弱性を含む特定のバグの修正を カーネルに入れるためアップデートするなら、これは特に関連したことかもしれません。 関連リリース上の自分の使っている version の、 あるいは重大アップデートブランチ、 または Security Advisories に通常、情報として含まれている 関係する特定の修正が入ったファイルの日付または revisions の 最新のソースが欲しいかもしれません。 これらのブランチからソースを update するのに使われる CVS コマンド についての更なる詳細は Section30.4, “Fetching by CVS” を御覧ください。

一度ソースを利用可能にすると、カスタムカーネルを作ることができ: これは考えるほど難しいことではありません。 実際に、次の節に記述されるように、少しのステップで 新しいカーネルを作ることができます。

32.3.Creating the kernel configuration file

この節で述べられているディレクトリーは i386 固有のものです。 他のアーキテクチャーのユーザーは 適切なディレクトリーに置き換える必要があって、一覧は src/sys/arch のサブディレクトリーを見てください。

カーネル設定ファイルは、 type 、 数および いくつかのカーネル設定オプションと同じようにカーネルがサポートしているデバイスの特性を定義します。 i386 port では、カーネル設定ファイルは /usr/src/sys/arch/i386/conf ディレクトリーに位置します。

どうか注意として、カーネル設定ファイルの名前は、 歴史的に全部大文字です。それで、 そのディレクトリーのほかのファイルとの区別が簡単です:

$ cd /usr/src/sys/arch/i386/conf/
$ ls
CARDBUS                 GENERIC_PS2TINY         NET4501
CVS                     GENERIC_TINY            SWINGER
DELPHI                  GENERIC_VERIEXEC        SWINGER.MP
DISKLESS                INSTALL                 VIRTUALPC
GENERIC                 INSTALL.MP              files.i386
GENERIC.FAST_IPSEC      INSTALL_LAPTOP          kern.ldscript
GENERIC.MP              INSTALL_PS2             kern.ldscript.4MB
GENERIC.MPDEBUG         INSTALL_SMALL           largepages.inc
GENERIC.local           INSTALL_TINY            majors.i386
GENERIC_DIAGNOSTIC      IOPENER                 std.i386
GENERIC_ISDN            LAMB
GENERIC_LAPTOP          Makefile.i386

新しいファイルの作り方としていちばん簡単なのは、既存のものをコピーして変更することです。 通常、ほとんどのプラットホームで一番良い選択は、 ほとんどのドライバーとオプションが入っている GENERIC 設定です。 設定ファイルには、オプションについてのコメントが記述されていて; さらに詳しい記述は options(4) man page にあります。それで、いつもの手段は:

$ cp GENERIC MYKERNEL
$ vi MYKERNEL

カーネル設定ファイルの変更は基本的に 3つの操作を必要とし:

  1. ハードウェアデバイスのサポートをカーネルに含める/外す (例えば、不要ならば SCSI サポートが外せます。)

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

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

# で始まる行はコメントで; 行はコメントとして無効化されていて、有効にするにはコメント文字を取り除きます。 行を消す代わりにコメント行にするほうが良くて; 後でいつでも コメントを解除できます。

dmesg(8) コマンドの出力がどの行を無効化できるか決めるのに使えます。 the type の各行は:

XXX at YYY

XXX および YYY の両方がカーネル設定ファイルで active でなければなりません。 最低限の設定を達成する前にいくらかの経験が必要でしょうが、 しかし SCSI および PCMCIA のないデスクトップシステムでは、 カーネルのサイズを半減できます。

設定ファイルのオプションの調査をして、 不要なものを無効化するべきです。 各オプションは、簡単なコメントの記述があり、通常これで、 オプションについて十分に理解できます。 多くのオプションの長くてさらに詳細な記述が options(4) man page にあります。 そのとき、 CMOS 時計の local 時間のオプションを正しく設定するべきです。 例えば:

options RTC_OFFSET=-60

32.4.Building the kernel manually

標準設定の1つまたは your customised 設定どちらのでも、 自分のカーネル設定ファイルに基づき 新しいカーネルは構築する必要があります。

これらのステップは手作業で行うことも、 Chapter31, Crosscompiling NetBSD with build.sh 節で紹介されている build.sh コマンドを使って行うこともできます。 この節は nativeカーネルの manual steps での構築法の説明をし、 次の Section32.5, “Building the kernel using build.sh 節に同じ事をするための build.sh の利用法を記述します。

  • カーネルの設定

  • dependencies の生成

  • カーネルのコンパイル

32.4.1.Configuring the kernel manually

カーネル設定ファイルの変更が終わったら (これを MYKERNEL と呼びます)、 次のコマンドを発します:

$ config MYKERNEL

もし MYKERNEL にエラーが無ければ、 config(8) プログラムはカーネルのコンパイルのために必要なファイルの生成をし、 さもなければ、 config(8) を再び running する前に正す必要があります。

クロスコンパイル知識

カーネル構築のため ヘッダーファイル および Makefile の生成に使われるプログラムとしての config(8) はプラットホーム固有で、 新しく作られた toolchain (例として

/usr/src/build.sh -m sparc64 tools/

で作られた) の一部である nbconfig プログラムを利用することが必要です。 それはさておき、手順はまさに "native" NetBSD カーネルのコンパイルのようです。コマンドは例えば:

% /usr/src/tooldir.NetBSD-4.0-i386/bin/nbconfig MYKERNEL

このコマンドで、カーネルにコンパイルされ入れられるデバイスについての情報を定義する 沢山のヘッダーファイルのある ../compile/MYKERNEL ディレクトリーがつくられ、カーネル に必要なファイル全部を build するのと、それらを1つにリンクするのを設定する Makefile を作ります。

32.4.2.Generating dependencies and recompiling manually

Dependencies 生成とカーネルのコンパイルを行わせるには 次のコマンドで:

$ cd ../compile/MYKERNEL
$ make depend
$ make

エラーでコンパイルが止まることも起こりえて; さまざまな理由がありえますが、 しかし、もっとも普通の原因は設定ファイルを config(8) が理解できなかったことです。 時々、ハードウェア問題 (しばしば RAM チップ故障)が原因で失敗し: コンパイルは大抵のアプリケーションより高い負荷をシステムにかけます。 ほかの典型的なエラーは次のもので: オプション B が active ですが、それが要求する オプション A が active でないことです。 カーネルの完全コンパイルには、ハードウェアに依存して数分から数時間かかります。

コマンドの成功結果として netbsd ファイルがコンパイルしたディレクトリーに作られ、 インストールの準備ができました。

クロスコンパイル知識

sparc64 カーネルのクロスコンパイルには、 クロスコンパイラー toolchain の nbmake-sparc64 シェルラッパーを使うことが必要で、 sparc64 プラットホームへのクロスコンパイルに必要な全ての設定で make(1) を calls し:

% cd ../compile/MYKERNEL/
% /usr/src/tooldir.NetBSD-4.0-i386/bin/nbmake-sparc64 depend
% /usr/src/tooldir.NetBSD-4.0-i386/bin/nbmake-sparc64

これでちょっとばかり激しくかき回し、それからカーネルを吐き出します:

...
text    data     bss     dec     hex filename
5016899  163728  628752 5809379  58a4e3 netbsd
% ls -l netbsd
-rwxr-xr-x  1 feyrer  666  5874663 Dec  2 23:17 netbsd
% file netbsd
netbsd: ELF 64-bit MSB executable, SPARC V9, version 1 (SYSV), statically linked, not stripped 

さて、 netbsd ファイルのカーネルは (NFS 、 FTP 、 scp 、等経由) で UltraSPARC machine に転送してからの 可能なハードディスクから起動、または、 NFS を用いて、クロス開発した機械から直接に起動できます。

32.5.Building the kernel using build.sh

カーネル設定ファイルの作成、あるいは編集後、 手作業でのカーネルの設定ステップは、 dependencies の生成および再コンパイルを src/build.sh スクリプトを用いて行うこともでき、1つでみな兼ねて、 go:

$ cd /usr/src
$ ./build.sh kernel=MYKERNEL 

これで上のと同じステップを行い、1つの小さな違いは: 新規構築として開始するため、 コンパイル前に、全ての古いオブジェクトファイルが削除されます。 これはたいてい過剰殺戮で、古いファイルを保存し、そして dependencies が変わったものだけを再構築することでうまくいきます。これをするには、 -u オプションを build.sh に加え:

$ cd /usr/src
$ ./build.sh -u kernel=MYKERNEL 

job の終わりに、 build.sh が表示するなかに 新しくコンパイルされたカーネルの位置があり、インストールに便利です。

32.6.Installing the new kernel

新しいカーネルファイルを作るのにどのような手段を使ったにせよ、 ここでインストールされる必要があります。 新しいカーネルファイルは、前の version を saving した後、 ルートディレクトリーにコピーされるべきです。

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

Customization でカーネルのサイズの相当な量を縮小できます。 次の例で netbsd.old は the install カーネルで、 netbsd は新しいカーネルです。

-rwxr-xr-x  3 root  wheel  3523098 Dec 10 00:13 /netbsd
-rwxr-xr-x  3 root  wheel  7566271 Dec 10 00:13 /netbsd.old

新しいカーネルはリブート後に activated:

# shutdown -r now

32.7.If something went wrong

計算機が再起動したとき、新しいカーネルが期待したように動かない、 あるいは、全く boot さえしないことも起こり得ます。 気にしないで: もし起こったら、 あらかじめ saved カーネルでリブートし新しいのを remove するだけで、 ( single user でリブートするほうが良くて):

  • machine を Reboot

  • boot prompt で 5 秒のカウントダウンの間にスペースキーを押して

    boot:
  • 打ち込みます

    > boot netbsd.old -s
  • さて、前の version のカーネルを restore するのに次のコマンドを発します:

    # fsck /
    # mount /
    # mv netbsd.old netbsd
    # reboot

これで、始めの動作するシステムに戻り、 問題を解決するために custom カーネル設定ファイルを修正できます。 一般的に、最初に GENERIC カーネルから始めて、 それから徐々に変更していくのが賢明です。