理由はいくつかある。ただしこれをやるのは、システム全体についてかなり知識のある詳しいユーザが中心になるのは事実:
ほとんどの場合には、自分でカーネルをコンパイルする必要はない。 GENERIC カーネルで、ふつうは十分に用が足りるはずだ。それどころか、自前のカーネルなんかつくらないほうがいい理由もいくつかある。最大の理由というのは、論理的にはだいじょうぶそうなカーネルの設定に変更してみても、それが実際にはうまくいかない場合実にいっぱいある、ということだ。これは危険信号。もしなにかがまともに動かないようなら、バグ報告をよこすまえに、まず GENERIC カーネルを試してみてほしい。
カーネル設定オプションは、カーネルに指定機能を入れ込むためにカーネルの設定で指定するオプションのことだ。これで、自分のほしいサポートだけを必要不可欠なだけ入れて、不要なデバイスのサポートははずせる。カーネルをカスタマイズするためのオプションは山ほどある。ここでは、いちばんよく使われるヤツの、ほんとにさわりだけを。もっと完全なオプション一覧がほしい人は、options(4)の man ページを見るように。さらに自分のアーキテクチャ向けに提供されている、設定ファイルの見本を調べてみるのもいいだろう。
カーネルオプションのすべての組み合わせについて、きちんと互換性テストが行われているわけじゃない。だから、カーネルにオプションを追加する場合には、本当にそうすべき理由がある場合だけに限ろう! いちばんたくさんテストされるカーネル設定は、 GENERIC カーネルだ。これはふつうは、 /usr/src/sys/arch/<アーキテクチャ>/conf/GENERIC と /usr/src/sys/conf/GENERIC にある設定を使ったものだ。
こういうファイルをよーく見てもらうと、こんな行が見つかるはずだ:
include "../../../conf/GENERIC"
これは、そいつがまたべつの設定ファイルを参照している、ということだ。こっちの参照ファイルは、アーキテクチャに依存しないオプションを保存してある。だから自分のカーネル設定をつくるときには、 /sys/conf/GENERIC
も見て、自分の思い通りになっているかチェックしよう。ここにあるオプションには、必須のオプションも含まれている。
以下に挙げるオプションはすべて、次のフォーマットでカーネル設定ファイルの中になくてはいけない:
option OPTION
たとえば、debug オプションをカーネルに入れるには、こんなふうな行を追加する:
option DEBUG
OpenBSD カーネルのオプションは、コンパイラのプリプロセッサオプションに翻訳されるので、 DEBUG みたいなオプションがあると、ソースコードのコンパイルのときに -DDEBUG オプションがつくことになる。これはカーネル中で #define DEBUG をやるのと同じことだ。
OpenBSD はいろいろ互換性をつけるオプションがいっぱいあって、ほかの OS のバイナリが使えるようになっている。オプションによっては、一部のアーキテクチャでしか使えないものものあるので、それぞれのオプションの man ページを必ずチェックして、各オプションが自分のアーキテクチャでサポートされているかを確認しよう。
カーネルでの問題をデバッグできると、絶対便利だ。でもデバッグ用オプションはカーネルに入れない人が多い。入れると、カーネルのサイズがえらくふくれあがるからだ。でも、バグがあるかもしれないときには、とっても役に立つ。これがあれば、開発者たちは君の問題の原因をずっとすばやくつきとめられるようになる。カーネルに追加できる主なデバッグ用オプションを以下に挙げよう。
ファイルシステムのオプション
その他オプション
ネットワークのオプション
これについては、ネットワーク FAQ や ネットワークパフォーマンスチューニング FAQも参照してね。
PCVT オプション (i386 でのみ有効)
SCSI サブシステムオプション
カスタムカーネルをつくるための詳細な指示は、 afterboot(8) man ページを参照。
CD-ROM から自分のカーネルをコンパイルするには、まずソースコードがなきゃいけない。カーネルをコンパイルするには、カーネルのソースがあればいい。これはCDにちゃんと入っている。まず、ソースを CD からコピーしてこよう。この例では、CD1 が /mnt にマウントしてあるものとする。
# mkdir -p /usr/src/sys # cd /mnt/sys # tar cf - . | ( cd /usr/src/sys; tar xvf - )
さてカスタムカーネルをつくるには、まずは GENERIC カーネルから出発するのがいい。こいつは /usr/src/sys/arch/${arch}/conf/GENERIC にある。${arch} はきみのアーキテクチャだ。このディレクトリには、ほかにも設定のサンプルが入っている、以下にカーネルをコンパイルする例を二つ挙げる。最初の例は、 read-only のソースツリーでカーネルをコンパイルする方法、二番目は書き込み可能なソースツリーを使う場合だ。
# cd /somewhere # cp /usr/src/sys/arch/$ARCH/conf/SOMEFILE . # vi SOMEFILE (to make the changes you want) # config -s /usr/src/sys -b . SOMEFILE# make depend(上のステップは [アップデートやパッチを含め] カーネルソースツリーに何か変更を加えた場合に必要。ただし次のステップを行う場合には無視していい。)
OR
# make clean(上のステップは、カーネル設定オプションを変更した場合に必要で、ソースツリーを大幅にアップデートしたりした場合にも推奨だ。それ以外は、このステップは無視して、 'make depend'だけを使ってもいい)
# make
カーネルを書き込み可能なソースツリー内でコンパイルするには、以下のようにしよう:
# cd /sys/arch/$ARCH/conf # vi SOMEFILE (お望みの変更をここで加える) # config SOMEFILE (これについて詳しくは以下を参照: config(8)) # cd ../compile/SOMEFILE # make
$ARCH はあなたの使っているアーキテクチャだ (e.g. i386)。また、make depend で、次にカーネルをコンパイルするときの依存関係をつくっておける。
ではカーネルを所定位置に移動させよう。
# cp /bsd /bsd.old # cp /sys/arch/$ARCH/compile/SOMEFILE/bsd /bsd
起動時に、古いカーネルにもどすなら、以下のようにするだけでいい:
boot> bsd.old
すると /bsdのかわりに古いカーネルがロードされる。
ときどき、新しいカーネルを構築すると、新しいブートブロックのインストールが必要になる。これには OpenBSD の ブートローダに関するfaq14.8を参照。
ときどき、システムを起動していると、カーネルがデバイスをちゃんと見つけていてもまちがった IRQ を割り当てたりしているのに気がつくだろう。そして、そのデバイスがすぐにも使いたいものだったりする。こんなとき、カーネルを再構築しなくても、 OpenBSD の起動時カーネル設定を使えばいい。これは、問題を一回限りで訂正してくれるだけだ。再起動したら、また同じことをくり返さなきゃいけない。だから一時的なフィックスだし、あとでちゃんとカーネルの設定をなおしてコンパイルしなおさなくてはいけない。ただしこの起動時設定を使うには、BOOT_CONFIG オプションが有効になっていなくてはダメだ。GENERIC カーネルでは有効になっている。
これについてのドキュメントのほとんどは、boot_config(8)の man ページにある。
起動時にユーザカーネル設定(User Kernel Config, 略してUKC)に入るには、 -c オプションを使おう。
boot> boot wd0a:/bsd -c
あるいは、起動に使いたいほかのカーネルを指定してもいい。これで UKC プロンプトが出てくる。ここから、カーネルに直接コマンドを出して、変更したいデバイスや無効にしたいデバイス、有効にしたいデバイスを指定できる。
UKCでよく使うコマンド一覧を以下に挙げる。
いったんデバイスの設定が終わったら、quit か exit を使えば起動が先に進む。これがすんだら、カーネルの設定を直して、カーネルをコンパイルしなおしておこう。これには自前のカーネルをビルド が役にたつだろう。
もっと省略せずに出力をしてもらうと、起動時の問題をデバッグするときにとても便利だ。起動フロッピーがブートしなくてもっと情報が必要なら、単に再起動をかければいい。 "boot>" プロンプトまできたら、boot -c で起動すること。すると UKC> に入るから、そこで以下のようにする:
UKC> verbose autoconf verbose enabled UKC> quit
さあこれで、思いっきり省略のない出力が起動時に得られるようになった。
OpenBSD 2.6 の登場とともに、config(8)に -e と -u オプションが登場した。 このオプションは実に便利なもので、カーネルのコンパイルで無駄にする時間が節約できる。-e フラグは、実行中のシステムでユーザカーネル設定(略して UKC)に入れるようにしてくれる。ここで加えた変更は、次回の再起動時に有効になる。-u フラグは、起動中に実行カーネルに対して何か変更が加えられたかどうかをテストしてくれる。変更が加えられたというのは、つまり起動中にboot -cで UKC を使ったか、ということだ。
以下の例では、カーネルで ep* デバイスを無効にしている。安全のため、 -o オプションを使って、指定ファイルに変更点を書き出すようにすること。たとえば: config -e -o bsd.new /bsd とすれば、変更は bsd.new に書き出される。以下の例は -o オプションを使っていないので、変更は単に無視されて、カーネルに書き込まれることはない。エラーや警告に関して詳しくは config(8) man ページを参照すること。
$ sudo config -e /bsd OpenBSD 2.6 (GENERIC) #1: Tue Nov 16 21:25:10 EST 1999 ericj@oshibana:/usr/src/sys/arch/i386/compile/GENERIC warning: no output file specified Enter 'help' for information ukc> ? help Command help list add dev Add a device base 8|10|16 Base on large numbers change devno|dev Change device disable attr val|devno|dev Disable device enable attr val|devno|dev Enable device find devno|dev Find device list List configuration lines count # of lines per page show [attr [val]] Show attribute exit Exit, without saving changes quit Quit, saving current changes ukc> list 0 audio* at sb0|sb*|gus0|pas0|sp0|ess*|wss0|wss*|ym*|eap*|eso*|sv* 1 midi* at sb0|sb*|opl*|opl*|opl*|ym*|mpu* 2 nsphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1 3 inphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1 4 iophy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1 5 exphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1 6 rlphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1 7 icsphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1 8 sqphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1 9 ukphy* at xe*|ef*|sf*|xl*|tl*|rl*|fxp* phy -1 10 scsibus* at bt0|bt1|bt2|aha0|aha1|aha*|ahb*|ahc0|ahc*|ahc*|isp*|aic0|aic*|ncr*|adv*|adw*|sea0|uha0|uha1|uha*|wds0|atapiscsi* 11 cd* at scsibus* target -1 lun -1 12 ch* at scsibus* target -1 lun -1 13 sd* at scsibus* target -1 lun -1 14 st* at scsibus* target -1 lun -1 15 ss* at scsibus* target -1 lun -1 16 uk* at scsibus* target -1 lun -1 17 atapiscsi* at wdc0|wdc1|wdc*|wdc*|pciide* channel -1 --- more --- [snip] ukc> disable ep 31 ep0 disabled 32 ep* disabled 33 ep* disabled 87 ep0 disabled 88 ep0 disabled 89 ep* disabled 90 ep* disabled 136 ep* disabled ukc> quit not forced
上の例では、ep* デバイスはすべてカーネルからはずされて、プローブされなくなる。ブート時に boot -c によってUKC を使ってきたような場合には、この変更は書き出しておいて、今後ずっと有効になるようにしておかないとダメだ。これには、 -u オプションを使おう。 以下の例では、マシンは UKC へとブートされて、 wi(4) デバイスが無効にされている。 boot -c による変更は一時的なものでしかないので、この変更は書き出しておかないとダメだ。この例では、boot -c で生じた変更を、新しいカーネルバイナリの bsd.new に書き出している。
$ sudo config -e -u -o bsd.new /bsd OpenBSD 2.6 (GENERIC) #1: Tue Nov 16 21:25:10 EST 1999 ericj@oshibana:/usr/src/sys/arch/i386/compile/GENERIC Processing history... 151 wi* disabled Enter 'help' for information ukc> quit
[FAQ トップに戻る] [4.0 - インストールガイド] [6.0 - ネットワーク設定]
www@openbsd.org 翻訳上の問題はhiyori13@alum.mit.edu
$OpenBSD: faq5.html,v 1.45 2000/09/17 19:56:18 ericj Exp $