[OpenBSD] English

5.0 - カーネルの構築と設定


目次


5.1 - なぜカスタムのカーネルなんかが要るの?

理由はいくつかある。ただしこれをやるのは、システム全体についてかなり知識のある詳しいユーザが中心になるのは事実:

ほとんどの場合には、自分でカーネルをコンパイルする必要はない。 GENERIC カーネルで、ふつうは十分に用が足りるはずだ。それどころか、自前のカーネルなんかつくらないほうがいい理由もいくつかある。最大の理由というのは、論理的にはだいじょうぶそうなカーネルの設定に変更してみても、それが実際にはうまくいかない場合実にいっぱいある、ということだ。これは危険信号。もしなにかがまともに動かないようなら、バグ報告をよこすまえに、まず GENERIC カーネルを試してみてほしい。

5.2 - カーネル設定オプション

カーネル設定オプションは、カーネルに指定機能を入れ込むためにカーネルの設定で指定するオプションのことだ。これで、自分のほしいサポートだけを必要不可欠なだけ入れて、不要なデバイスのサポートははずせる。カーネルをカスタマイズするためのオプションは山ほどある。ここでは、いちばんよく使われるヤツの、ほんとにさわりだけを。もっと完全なオプション一覧がほしい人は、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 サブシステムオプション

5.3 - 自前のカーネルをビルドする

カスタムカーネルをつくるための詳細な指示は、 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を参照。

5.4 - 起動時に設定を加える

ときどき、システムを起動していると、カーネルがデバイスをちゃんと見つけていてもまちがった IRQ を割り当てたりしているのに気がつくだろう。そして、そのデバイスがすぐにも使いたいものだったりする。こんなとき、カーネルを再構築しなくても、 OpenBSD の起動時カーネル設定を使えばいい。これは、問題を一回限りで訂正してくれるだけだ。再起動したら、また同じことをくり返さなきゃいけない。だから一時的なフィックスだし、あとでちゃんとカーネルの設定をなおしてコンパイルしなおさなくてはいけない。ただしこの起動時設定を使うには、BOOT_CONFIG オプションが有効になっていなくてはダメだ。GENERIC カーネルでは有効になっている。

これについてのドキュメントのほとんどは、boot_config(8)の man ページにある。

起動時にユーザカーネル設定(User Kernel Config, 略してUKC)に入るには、 -c オプションを使おう。

boot> boot wd0a:/bsd -c

あるいは、起動に使いたいほかのカーネルを指定してもいい。これで UKC プロンプトが出てくる。ここから、カーネルに直接コマンドを出して、変更したいデバイスや無効にしたいデバイス、有効にしたいデバイスを指定できる。

UKCでよく使うコマンド一覧を以下に挙げる。

いったんデバイスの設定が終わったら、quit か exit を使えば起動が先に進む。これがすんだら、カーネルの設定を直して、カーネルをコンパイルしなおしておこう。これには自前のカーネルをビルド が役にたつだろう。

5.5 - 起動時の出力を省略なしにする

もっと省略せずに出力をしてもらうと、起動時の問題をデバッグするときにとても便利だ。起動フロッピーがブートしなくてもっと情報が必要なら、単に再起動をかければいい。 "boot>" プロンプトまできたら、boot -c で起動すること。すると UKC> に入るから、そこで以下のようにする:

UKC> verbose
autoconf verbose enabled
UKC> quit

さあこれで、思いっきり省略のない出力が起動時に得られるようになった。

5.6 - config(8) を使ってカーネルを変更する

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 Valid XHTML 1.0!

$OpenBSD: faq5.html,v 1.45 2000/09/17 19:56:18 ericj Exp $