[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

NetBSD カーネルの作成と入れ換え

Table of Contents
NetBSD カーネルを作成する
NetBSD カーネルを入れ換える。
NetBSD カーネルの拡張: 例: pcmcia のネットワークカードを追加

本章では、NetBSD カーネルのコンパイルについて解説します。

Caution

NetBSD 7.0 カーネルの IPFilter 5 がバグ っていますので、IPFilter の NAT を使う場合には手動パッチが必要です。

NetBSD カーネルを作成する

Caution

本節は 「NSRG の netbsd-build.sh (/usr/src/build.sh wrapper)で配布セットを作成後に、 カスタマイズしたカーネルを作ろうとしている」 という前提で書いてあります。

よって、Cコンパイラなどのツール群は作成済みの状態です。

なお netbsd-build.sh の使い方が分からない人は、まず the Section called NetBSD 配布セットをソースからコンパイルする in the Chapter called NetBSD ソースから配布セットを作る 節を読んで下さい。

カーネルソースコードのダウンロード

必要なソースコードは /usr/sbin/config と /usr/src/sys ですが、 ツールを作る都合があるので、 OS 配布セットを作る時と同様で、 ソース一式すべてをダウンロードし、展開して下さい。

ダウンロード方法は the Section called NetBSD ソースコードのダウンロードと展開の仕方一式 in the Chapter called NetBSD ソースから配布セットを作る 節(と、それに続く数節)を参照してください。

カーネル設定ファイルの書き方

ファイルを置く場所はアーキテクチャアごとに異なります。

/usr/src/sys/arch/アーキテクチャア名/conf/ファイル名
この「ファイル名」が「カーネル名」と言えますが、 生成されるカーネル(プログラムのファイル名)は常に netbsd になりますので注意してください。 なお、この netbsd ファイルの中に、 このファイル名が書き込まれてるので、 区別はできます。

たとえば i386 のカーネル名 GENERIC なら、設定ファイルは

/usr/src/sys/arch/i386/conf/GENERIC
となります。 アーキテクチャアが sparc なら
/usr/src/sys/arch/sparc/conf/GENERIC
となります。以下、同様です。

現在の設定ファイルは、 (C 言語のように) include 構文を用いて GENERIC を include した後、 必要な機能を足したり引いたり [1] できます。実例を以下で説明しますが、大変、便利です。

ちなみに、設定例のいくつかを ftp://ftp.fml.org/pub/NSRG/tips/NetBSD/usr/src/sys/arch/i386/conf/ に置いておきました。

設定例: LEGACY (カーネルの設定ファイルは /usr/src/sys/arch/i386/conf/LEGACY に置きます)


include "arch/i386/conf/GENERIC"

no acpi0   at mainbus0
no ioapic* at mainbus?

options NMBCLUSTERS=32768

maxusers 128

# ipfilter
options	LARGE_NAT
CISCO のように「no ほげほげ」で機能が「削除」されます。 機能の「追加」は普通に書くだけです。

設定ファイル LEGACY の解説

最初に GENERIC を include し、まずは推奨(典型例)の設定とします。

その上で、 (include している GENERIC で定義されている) ACPI や APIC 機能を削除しています。 Pentium III などでサーバを作る場合、 これらのせいでうまく動かないことがよくあるためです。

ネットワークコード(具体的には mbuf)の使うバッファサイズを大きくするために、 NMBCLUSTERS の値を大きくしています。

また、maxusers を 128 (128 人想定)と指定することで、 カーネルのバッファサイズを大きめに設定しています。 カーネルバッファは固定 [2] なので、用途によってサイジングが必要です。

まぁメモリの安い昨今なので、 i386 なら、 メモリをたくさんつんで、 できるだけでかい値にしておいたほうがよいでしょう。

特殊用途や 86 系以外のアーキテクチャアではそうもいかないので、 よく考える必要があります。

デフォルトの IPFilter の設定は御家庭向き程度のものなので、 通常運用するサーバでは、次のオプションを有効にして下さい。

options	LARGE_NAT
これは、カーネルのマニュアル options(4) には書いてありませんが、 IPFilter のソースコードを読むと分かります。 このオプションにより、 NAT テーブルサイズがデフォルト値の20倍くらいになります。 もし、これでも足りないなら、個別に値を大きく設定して下さい。

[教育的指導] 詳細はソースコードを読むこと。 この辺になると、 「ん?あ、ソース読んでよん」の世界なんで、 あえて、そう書いておく。

カーネルを作成する

ソースのトップディレクトリ(典型は /usr/src)で、 次のように netbsd-build.sh スクリプトを実行して下さい。

# sh netbsd-build.sh kernel=設定ファイル
# sh netbsd-build.sh releasekernel=設定ファイル

例: LEGACY

# sh netbsd-build.sh kernel=LEGACY
# sh netbsd-build.sh releasekernel=LEGACY
前者「kernel=設定ファイル」はカーネルのコンパイル、 後者「releasekernel=設定ファイル」は release ディレクトリに .tgz アーカイブを生成します。

[備考: nbmake がないとエラーが出たら?] 上の説明は、netbsd-build.sh release 後に、 カスタマイズしたカーネルをコンパイルする例です。 カーネルしか作らない場合には、ツールも作る必要があります。 たとえば「エラー: nbmake がない」といわれたら、ツールもつくって下さい。

# sh netbsd-build.sh tools
# sh netbsd-build.sh kernel=LEGACY
# sh netbsd-build.sh releasekernel=LEGACY

実行例: 設定ファイル LEGACY を作る (netbsd-build.sh kernel=LEGACY)


# cd /usr/src
# sh netbsd-build.sh kernel=LEGACY
===> build.sh command: build.sh -M /var/tmp/build-5.1.0_PATCH/obj -T /var/tmp/build-5.1.0_PATCH/tools -D /var/tmp/build-5.1.0_PATCH/dest -R /var/tmp/build-5.1.0_PATCH/release kernel=LEGACY
===> build.sh started: Thu Aug 25 17:56:12 JST 2011
===> NetBSD version:   5.1.0_PATCH
===> MACHINE:          i386
===> MACHINE_ARCH:     i386
===> Build platform:   NetBSD 5.1 i386
===> HOST_SH:          /bin/sh
===> TOOLDIR path:     /var/tmp/build-5.1.0_PATCH/tools
===> DESTDIR path:     /var/tmp/build-5.1.0_PATCH/dest
===> RELEASEDIR path:  /var/tmp/build-5.1.0_PATCH/release
===> makewrapper:      /var/tmp/build-5.1.0_PATCH/tools/bin/nbmake-i386
===> Updated /var/tmp/build-5.1.0_PATCH/tools/bin/nbmake-i386
===> Building kernel without building new tools
===> Building kernel:  LEGACY
===> Build directory:  /var/tmp/build-5.1.0_PATCH/obj/usr/src/sys/arch/i386/compile/LEGACY
rm -f a.out [Ee]rrs mklog core *.core .gdbinit
Build directory is /var/tmp/build-5.1.0_PATCH/obj/usr/src/sys/arch/i386/compile/LEGACY
Don't forget to run "make depend"
depending the kern library objects
#    create  kern/__assert.d
CC=/var/tmp/build-5.1.0_PATCH/tools/bin/i386--netbsdelf-gcc /var/tmp/build-5.1.0_PATCH/tools/bin/nbmkdep -f __assert.d --     -I/usr/src/sys/lib/libkern/arch/i386 -Di386 -I../../. -I/usr/src/sys/../common/include -I/usr/src/sys/arch -I/usr/src/sys -nostdinc -DLKM -DSYSTRACE -DMAXUSERS=128 -D_KERNEL -D_KERNEL_OPT -I/usr/src/sys/lib/libkern/../../../common/lib/libc/quad -I/usr/src/sys/lib/libkern/../../../common/lib/libc/string -I/usr/src/sys/lib/libkern/../../../common/lib/libc/arch/i386/string -I/usr/src/sys/external/isc/atheros_hal/dist -I/usr/src/sys/external/isc/atheros_hal/ic -I/usr/src/sys/../common/include -I/usr/src/sys/dist/ipf  -I/usr/src/sys/lib/libkern/../../../common/lib/libc/quad -I/usr/src/sys/lib/libkern/../../../common/lib/libc/string -I/usr/src/sys/lib/libkern/../../../common/lib/libc/arch/i386/string -I/usr/src/sys/lib/libkern/../../../common/include   -nostdinc -isystem /var/tmp/build-5.1.0_PATCH/dest/usr/include  /usr/src/sys/lib/libkern/__assert.c

	... snip ...

#    create  vers.c
/bin/sh /usr/src/sys/conf/newvers.sh
#   compile  LEGACY/vers.o
/var/tmp/build-5.1.0_PATCH/tools/bin/i386--netbsdelf-gcc  -ffreestanding -fno-zero-initialized-in-bss  -O2 -std=gnu99 -fno-strict-aliasing   -Werror -Wall -Wno-main -Wno-format-zero-length -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes -Wswitch -Wshadow -Wcast-qual -Wwrite-strings -Wno-unreachable-code -Wno-sign-compare -Wno-pointer-sign -Wno-attributes -Wextra -Wno-unused-parameter  -Werror -march=i486 -mtune=pentiumpro  -Di386 -I.  -I/usr/src/sys/../common/include -I/usr/src/sys/arch  -I/usr/src/sys -nostdinc -DLKM -DSYSTRACE -DMAXUSERS=128 -D_KERNEL -D_KERNEL_OPT -I/usr/src/sys/lib/libkern/../../../common/lib/libc/quad -I/usr/src/sys/lib/libkern/../../../common/lib/libc/string -I/usr/src/sys/lib/libkern/../../../common/lib/libc/arch/i386/string   -I/usr/src/sys/external/isc/atheros_hal/dist -I/usr/src/sys/external/isc/atheros_hal/ic -I/usr/src/sys/../common/include -I/usr/src/sys/dist/ipf  -c vers.c
#      link  LEGACY/netbsd
/var/tmp/build-5.1.0_PATCH/tools/bin/i386--netbsdelf-ld -Map netbsd.map --cref -T /usr/src/sys/arch/i386/conf/kern.ldscript -Ttext c0100000 -e start -X -o netbsd ${SYSTEM_OBJ} ${EXTRA_OBJ} vers.o
NetBSD 5.1.0_PATCH (LEGACY) #0: Thu Aug 25 18:07:08 JST 2011
   text	   data	    bss	    dec	    hex	filename
10099799	 518916	 618516	11237231	 ab776f	netbsd
===> Kernels built from LEGACY:
  /var/tmp/build-5.1.0_PATCH/obj/usr/src/sys/arch/i386/compile/LEGACY/netbsd
===> build.sh ended:   Thu Aug 25 18:07:12 JST 2011
===> Summary of results:
	 build.sh command: build.sh -M /var/tmp/build-5.1.0_PATCH/obj -T /var/tmp/build-5.1.0_PATCH/tools -D /var/tmp/build-5.1.0_PATCH/dest -R /var/tmp/build-5.1.0_PATCH/release kernel=LEGACY
	 build.sh started: Thu Aug 25 17:56:12 JST 2011
	 NetBSD version:   5.1.0_PATCH
	 MACHINE:          i386
	 MACHINE_ARCH:     i386
	 Build platform:   NetBSD 5.1 i386
	 HOST_SH:          /bin/sh
	 TOOLDIR path:     /var/tmp/build-5.1.0_PATCH/tools
	 DESTDIR path:     /var/tmp/build-5.1.0_PATCH/dest
	 RELEASEDIR path:  /var/tmp/build-5.1.0_PATCH/release
	 makewrapper:      /var/tmp/build-5.1.0_PATCH/tools/bin/nbmake-i386
	 Updated /var/tmp/build-5.1.0_PATCH/tools/bin/nbmake-i386
	 Building kernel without building new tools
	 Building kernel:  LEGACY
	 Build directory:  /var/tmp/build-5.1.0_PATCH/obj/usr/src/sys/arch/i386/compile/LEGACY
	 Kernels built from LEGACY:
	  /var/tmp/build-5.1.0_PATCH/obj/usr/src/sys/arch/i386/compile/LEGACY/netbsd
	 build.sh ended:   Thu Aug 25 18:07:12 JST 2011
===> .

実行例: netbsd-build.sh releasekernel=LEGACY

# sh netbsd-build.sh releasekernel=LEGACY
===> build.sh command: build.sh -M /var/tmp/build-5.1.0_PATCH/obj -T /var/tmp/build-5.1.0_PATCH/tools -D /var/tmp/build-5.1.0_PATCH/dest -R /var/tmp/build-5.1.0_PATCH/release releasekernel=LEGACY
===> build.sh started: Thu Aug 25 18:07:37 JST 2011
===> NetBSD version:   5.1.0_PATCH
===> MACHINE:          i386
===> MACHINE_ARCH:     i386
===> Build platform:   NetBSD 5.1 i386
===> HOST_SH:          /bin/sh
===> TOOLDIR path:     /var/tmp/build-5.1.0_PATCH/tools
===> DESTDIR path:     /var/tmp/build-5.1.0_PATCH/dest
===> RELEASEDIR path:  /var/tmp/build-5.1.0_PATCH/release
===> makewrapper:      /var/tmp/build-5.1.0_PATCH/tools/bin/nbmake-i386
===> Updated /var/tmp/build-5.1.0_PATCH/tools/bin/nbmake-i386
===> Kernel copy:      /var/tmp/build-5.1.0_PATCH/release/i386/binary/kernel/netbsd-LEGACY.gz
===> build.sh ended:   Thu Aug 25 18:07:41 JST 2011
===> Summary of results:
	 build.sh command: build.sh -M /var/tmp/build-5.1.0_PATCH/obj -T /var/tmp/build-5.1.0_PATCH/tools -D /var/tmp/build-5.1.0_PATCH/dest -R /var/tmp/build-5.1.0_PATCH/release releasekernel=LEGACY
	 build.sh started: Thu Aug 25 18:07:37 JST 2011
	 NetBSD version:   5.1.0_PATCH
	 MACHINE:          i386
	 MACHINE_ARCH:     i386
	 Build platform:   NetBSD 5.1 i386
	 HOST_SH:          /bin/sh
	 TOOLDIR path:     /var/tmp/build-5.1.0_PATCH/tools
	 DESTDIR path:     /var/tmp/build-5.1.0_PATCH/dest
	 RELEASEDIR path:  /var/tmp/build-5.1.0_PATCH/release
	 makewrapper:      /var/tmp/build-5.1.0_PATCH/tools/bin/nbmake-i386
	 Updated /var/tmp/build-5.1.0_PATCH/tools/bin/nbmake-i386
	 Kernel copy:      /var/tmp/build-5.1.0_PATCH/release/i386/binary/kernel/netbsd-LEGACY.gz
	 build.sh ended:   Thu Aug 25 18:07:41 JST 2011
===> .

	 Kernel copy:      /var/tmp/build-5.1.0_PATCH/release/i386/binary/kernel/netbsd-LEGACY.gz
行で分かるとおり、
/var/tmp/build-5.1.0_PATCH/release/i386/binary/kernel/netbsd-LEGACY.gz
に生成されました。

次は カーネルの入れ換え です。 次節 に進んで下さい。

参考: 古いやりかた

念のため、古いやりかたの概略を書いておきます。

config やコンパイラ( gcc 他)は、新しいソースコードのものに入れ換えた後、 行なうのが正しいやりかたです。 ただ、少しずつ少しずつ OS 全体のアップデートを繰り返す場合には、 おおむね問題なく動きますけど。 まぁ、このへんの微妙なところが厄介なので、 いまは /usr/src/build.sh にまかせるのが正しいやりかたという訳です。

(1) syssrc.tgz を広げてください。 src/usr.bin/config/ と src/sys/ が作られます。

# tar zxf syssrc.tgz
# cd src/sys/arch/i386/conf

(2) LEGACY ファイルを作成してください。

(3) /usr/bin/config コマンドを使い、 作業ディレクトリ(../compile/LEGACY)に LEGACY に必要なファイル群を生成してください。 作業ディレクトリは、 つねに「/usr/src/sys/arch/i386/compile/設定ファイル名」になります。

  (LEGACY ファイルを作成)

# config LEGACY

(4) 作業ディレクトリ(../compile/LEGACY)に移動し、make します。 最初に make depend することを忘れずに!

# cd ../compile/LEGACY
# make depend
# make
# make install

Notes

[1]

昔は引き算が出来なかったので、 GENERIC や ALL といったファイルを元に、 それを編集して設定ファイルを作っていました。

必然的に大きいことに加え、 アップグレードの際のメインテナンスが厄介でした。 元になる ALL や GENERIC が大きく違ってしまうので、 何を追加・削除すればいいのか、毎回よく考えないといけませんでした。

今は大変楽です。

[2]

カーネルでは、メモリの動的な割り当て処理はしません。

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >