本章では、NetBSD カーネルのコンパイルについて解説します。
Caution |
NetBSD 7.0 カーネルの IPFilter 5 がバグ っていますので、IPFilter の NAT を使う場合には手動パッチが必要です。 |
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_NATCISCO のように「no ほげほげ」で機能が「削除」されます。 機能の「追加」は普通に書くだけです。
最初に 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
# 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 ===> .
# 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
[1] | 昔は引き算が出来なかったので、 GENERIC や ALL といったファイルを元に、 それを編集して設定ファイルを作っていました。 必然的に大きいことに加え、 アップグレードの際のメインテナンスが厄介でした。 元になる ALL や GENERIC が大きく違ってしまうので、 何を追加・削除すればいいのか、毎回よく考えないといけませんでした。 今は大変楽です。 |
[2] | カーネルでは、メモリの動的な割り当て処理はしません。 |
Copyright (C) 1993-2025 Ken'ichi Fukamachi mail:< fukachan at fml.org >