作成開始 : 2006/11/27(月)  最終更新 : 2006/12/17(日)

カーネル再構築を試す


デフォルトのカーネルには必要のないものも含まれているのでメモリを占有したりして良いことはありません。
自分用に要らないデバイス等を省いて、スマートなカーネルにしましょう。これによって軽快に動作するOSになります。

・・・・・・なぁーんてことのようです。


 ↑
実験したのは上段のPC(PC-9821 V200)です。


1.環境の確認

カーネルを再構築するには、カーネル用のソース等がインストールされている必要があります。 /usr/src/sys 以下のファイル群です。
私はいつも「一般的なユーザ」オプションでインストールしてしまうので、カーネルソースがありません。
そこで /usr/sbin/sysinstall でカーネルソースをインストールしました。
PC-98x1シリーズだと、/usr/src/sys/pc98/confGENERIC98 というのがあるらしいのですが、今回使う FreeBSD(98) 6.1 RELEASE にはありませんでした。
試しに /usr/src/sys/i386/conf を見てみました。

 ↑
あきらかにファイルサイズが違いますね。

/usr/src/sys/pc98/conf にある GENERIC が PC-98x1用であると思って作業を進めることにしました。
下のは初期の GENERIC です。
さて、上のようにしてカーネル再構築のために必要な環境は準備しました。(本来ならCvsup とかで常に最新のソースを同期しておくといいのでしょうが・・・)
GENERIC の 他に GENERIC.hints というのがあります。
GENERIC はカーネルコンフィグレーション・ファイルで GENERIC.hints は、FreeBSD 5.0 からあるものでデバイス情報の設定を行うものだそうです。
ちなみに、/boot/device.hints というものがあります。これは、ブート時に読込むデバイス設定ファイルなのだそうです。
この時点では、diff /usr/src/sys/pc98/conf/GENERIC.hints /boot/device.hints 結果は全く差異がありませんでした。
(同じものです、タイムスタンプは違ってましたが!)
下のは初期の/usr/src/sys/pc98/conf/GENERIC.hintsです。

2.実際の作業

作業は全てスーパー・ユーザで行いました。
・・・・っと、その前にこの時点でのカーネル・サイズを保存しておきました。
(1)カスタムカーネル用コンフィグレーション・ファイルを用意
a.カレントディレクトリを /usr/src/sys/pc98/conf に移動しました。 ( cd /usr/src/sys/pc98/conf )
b.カスタムカーネル用コンフィグレーション・ファイル を MYKERNEL として用意しました。 ( cp GENERIC MYKERNEL )
 デバイス設定ファイルである hints も MYKERNEL.hints として用意しました。( cp GENERIC.hints MYKERNEL.hints )
 慣習として、このファイルの名前はすべて大文字でつづられるとのことです。名前は適当に付与していいです。
(2)カスタムカーネル用コンフィグレーション・ファイルの編集
a.各行は1つのキーワードと1つ以上の引数を含んでいます。
b.#に続くものはすべてコメントとして扱われ、無視されます。したがって作業は主に # を付けたり外したりでしょう。
c.もし、ある行の目的や必要性に疑 問を持ったら最初に LINT をチェックしてください。・・・・とのことです。
 LINT とは現在のカーネルで指定できるデバイス名やオプション等を全て網羅したカーネルの設定ファイルのことです。
 LINT ファイルを参照するとカーネルの構築時に設定ファイルで定義できる項目を容易に調べられるので作成しておきます。
 LINT はカーネルのコンフィグレーションディレクトリで make LINT を実行すると、カーネルのリリースノート(/usr/src/sys/conf/NOTES)から自動的に作成されます。 

 ↑
できましたね。
参考のため NOTESLINT を載せておきます。
そして、準備した /usr/src/sys/pc98/conf/MYKERNEL を vi で編集しました。「FreeBSDハンドブック」を参考にしながら、関係なさそうなところを # でリマークしていきました。大事そうなとことリマーク箇所だけ記載しときます。
・マシンのアーキテクチャー
これは i386, alpha, pc98 のいずれかでなければなりません。・・・とありましたが・・・・
machine pc98 i386
になっています。ちなみに /usr/src/sys/i386/conf/GENERICi386 だけでした。とりあえず、このままにしとくことにしました。
・CPU タイプ
これは、このマシンのCPU タイプです。複数のタイプを書いてもかまわないようなのですが、せっかくカスタムするのですから1つだけにしたいと思いました。
/var/log/messages を見たら CPU: Pentium/P55C (199.67-MHz 586-class CPU) なので次のようにしました。
# cpu I486_CPU
cpu I586_CPU
# cpu I686_CPU
・カーネルの識別名
(1)で作った カスタムカーネル用コンフィグレーション・ファイル の名前を指定します。
ident MYKERNEL
・ちょっとわからないけど・・・
# To statically compile in device wiring instead of /boot/device.hints
#hints "GENERIC.hints" # Default places to look for devices.
   ↓ ( /boot/device.hints) に同期するのかな?)
# To statically compile in device wiring instead of /boot/device.hints
hints "MYKERNEL.hints" # Default places to look for devices.
・コンパイル時のデバック・オプション(?)
makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
   ↓
# makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
・NFSは使わないのでリマーク
# options NFSCLIENT # Network Filesystem Client
# options NFSSERVER # Network Filesystem Server
# options NFS_ROOT # NFS usable as /, requires NFSCLIENT
・EPSON機でないのでリマーク
# options EPSON_BOUNCEDMA # use bounce buffer for 15-16M
# options EPSON_MEMWIN # EPSON memory window support
・SCSI機器は使わないのでリマーク
# options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
# SCSI Controllers
# device adv # Advansys SCSI adapters
# device ahc # AHA2940 and onboard AIC7xxx devices
# device amd # AMD 53C974 (Tekram DC-390(T))
# device isp # Qlogic family
# device ncr # NCR/Symbios Logic
# device sym # NCR/Symbios Logic (newer chipsets + those of

# device aic # PC-9801-100
# device ct # host adapter using WD33C93[ABC] chip (C bus)

# device ncv # NCR 53C500
# device nsp # Workbit Ninja SCSI-3
# device stg # TMC 18C30/18C50


# SCSI peripherals
# device scbus # SCSI bus (required for SCSI)
# device ch # SCSI media changers
# device da # Direct Access (disks)
# device sa # Sequential Access (tape etc)
# device cd # CD
# device pass # Passthrough device (direct SCSI access)
# device ses # SCSI Environmental Services (and SAF-TE)
・PCMCIAカードは使わないのでリマーク
# PCCARD (PCMCIA) support
# PCMCIA and cardbus bridge support
# device cbb # cardbus (yenta) bridge
# device pccard # PC Card (16-bit) bus
# device cardbus # CardBus (32-bit) bus
・使ってないNICはリマーク
# PCI Ethernet NICs.
# device de # DEC/Intel DC21x4x (``Tulip'')
# device em # Intel PRO/1000 adapter Gigabit Ethernet Card
# device txp # 3Com 3cR990 (``Typhoon'')
# device vx # 3Com 3c590, 3c595 (``Vortex'')

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!

device miibus # MII bus support
# device bfe # Broadcom BCM440x 10/100 Ethernet
# device bge # Broadcom BCM570xx Gigabit Ethernet
# device dc # DEC/Intel 21143 and various workalikes
device fxp # Intel EtherExpress PRO/100B (82557, 82558)
# device lge # Level 1 LXT1001 gigabit Ethernet
# device nge # NatSemi DP83820 gigabit Ethernet
# device pcn # AMD Am79C97x PCI 10/100 (precedence over 'lnc')
# device re # RealTek 8139C+/8169/8169S/8110S
# device rl # RealTek 8129/8139
# device sf # Adaptec AIC-6915 (``Starfire'')
# device sis # Silicon Integrated Systems SiS 900/SiS 7016
# device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet
# device ste # Sundance ST201 (D-Link DFE-550TX)
# device ti # Alteon Networks Tigon I/II gigabit Ethernet
# device tl # Texas Instruments ThunderLAN
# device tx # SMC EtherPower II (83c170 ``EPIC'')
# device vge # VIA VT612x gigabit Ethernet
# device vr # VIA Rhine, Rhine II
# device wb # Winbond W89C840F
# device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
・ISAネットワーク・カードやPCカードは使ってないのでリマーク
# ISA Ethernet NICs. pccard NICs included.
# 'device ed' requires 'device miibus'
# device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards
# device ep # Etherlink III based cards
# device fe # Fujitsu MB8696x based cards
# device lnc # C-NET(98)S
# device sn # SMC's 9000 series of Ethernet chips
# device snc
# device xe # Xircom pccard Ethernet
・無線LANカードは使ってないのでリマーク
# Wireless NIC cards
# device wlan # 802.11 support
# device an # Aironet 4500/4800 802.11 wireless NICs.
# device awi # BayStack 660 and others
# device ral # Ralink Technology RT2500 wireless NICs.
# device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
# device wl # Older non 802.11 Wavelan wireless NIC.
・USBは使う気ないのでディフォルト(全てリマーク)のまま

3.カーネルのコンパイルとインストール

(1) カーネルソースコードを生成するため、config(8) を実行しました。ディレクトリは /usr/src/sys/pc98/conf です。
v200# /usr/sbin/config MYKERNEL
Kernel build directory is ../compile/MYKERNEL
Don't forget to do ``make cleandepend; make depend''
v200#
ソースコード生成できたのかな? どれどれ

 ↑
できているっす。
(2) カーネルを構築するためのディレクトリに移動しました。ディレクトリは /usr/src/sys/pc98/compile/MYKERNEL ですね。
v200# cd ../compile/MYKERNEL
v200#
(3) カーネルをコンパイルしました。
v200# make depend
v200# make
※make depend は このPCで 22分 で終了しました。
※make は このPCで 2時間40分 かかりました。
(4) 新しいカーネルをインストールしました。
v200# make install
※make install は このPCで 3分 でした。

 ↑
おぉ、確かに kernel は小さくなっている。
再構築する前のは /boot/kernel.old にある。この時点ではこれが次ぎに確実に起動できるモジュールになる。
これは、次にカーネル構築すると上書きされてしまうので、確実に起動できるカーネルを残しておきたい時は /boot/kernel.oldの全てを別に保存しておくといいでしょう。

4.カスタム・カーネルでの起動

次に、ワクワク・ドキドキしつつシャットダウンし起動してみました。
とりあえず無事に起動しました。・・・・があまり変化は感じられず(元々超低スペックだから劇的な変化は無理?)・・・・でした。
まぁ、追加のモジュールも無しなので、とりあえずカーネル再構築の雰囲気を味わうことはできました。

[追記]

さて、今回はうまく起動できたが、もし起動しない時は次のようにして一つ前のカーネルをロードすることになる。
Welcome to FreeBSD!

1. Boot FreeBSD [default]
2. Boot FreeBSD in Safe Mode
3. Boot FreeBSD in single user mode
4. Boot FreeBSD with verbose logging
5. Escape to loader prompt
6. Reboot

Select option, [Enter] for default
or [Space] to pause timer 5
上のメッセージが表示されている時に 5 (Escape to loader prompt ) を入力すると、 loader の画面が表示されるので、更に Enter 以外の任意のキーを入力する。
そうするとloaderのプロンプト ok が表示されるので、 unload コマンドで現在のカーネルをアンロードした後、 load コマンドで確実に起動できるカーネルを選択し boot コマンドにより起動させカーネルを再度構築する。
カーネルの名称が不明な場合はlsコマンドを実行すると、ファイルの一覧が表示される。
Hit [Enter] to boot immediately, or any other key for command prompt
Booting [kernel] in 9 second...

Type '?' for a list of commands, 'help' for more detailed help.
ok unload
ok ls boot/kernel.old
boot/kernel.old
  kernel
  accf_data.ko
  accf_http.ko
:
ok load boot/kernel.old/kernel
boot/kernel.old/kernel text=0x... data=0x... syms=[0x4+0x...]
ok boot
・・・・ってな感じでしょうか。間違っていたらすいません。

戻る

サイトトップへ