2006年6月15日木曜日

(VMware)FreeBSD 6.1Rのカーネル再構築(2) 不要なモジュールをビルドしないようにする

ふと思い出したので、先日のお話・・・

(VMware)FreeBSD 6.1Rのカーネル再構築

のつづきというか、落ち穂ひろいです。



カーネル再構築は、けっこう時間がかかります。VMwareの仮想マシンでやってるので処理が遅くなる、っていう理由もあるのですけれども、とくに、初めて実行したときは、たくさんのファイルをコンパイルするので、時間がかかります。



ええ、たくさんのファイルをコンパイルしてるのですが、実は、いらないもの、使いもしないものを、無駄にコンパイルしてたりしています。そのいらないものってのは、

カーネル・モジュール(*.ko)のほとんど

です。通常、/boot/kernel/というディレクトリの中に、カーネルのファイル(kernel)と一緒に、*.koという名前のファイルが大量に入っています。

> cd /boot/kernel/
> ls *.ko
3dfx.ko                 if_ex.ko                ng_ppp.ko
3dfx_linux.ko           if_faith.ko             ng_pppoe.ko
aac.ko                  if_fatm.ko              ng_pptpgre.ko
aac_linux.ko            if_fe.ko                ng_rfc1490.ko
accf_data.ko            if_fwe.ko               ng_socket.ko

(多すぎるので以下省略。全部で449個ありました)

一方、このなかで、実際に使っているものは何か?っていうと、kldstatというコマンドで、今ロードされているモジュールの一覧が表示されます。



これは、たとえば、ってことで極端な例ですが、

> kldstat
Id Refs Address    Size     Name
1    3 0xc0400000 3c02dc   kernel
2    1 0xc07c1000 66190    acpi.ko

1番はカーネル、2番がacpiのモジュール、・・・それだけ。
つまり、449個中、1個しか使ってないわけで、ほかは、ただの「ディスクの肥やし」。肥やしを作るのに、馬鹿にならないくらい時間がかかってるんです。



そりゃぁないじゃん・・・というわけで、いらないモジュールはコンパイルしない/必要なモジュールだけをコンパイルする方法、ってのがちゃんとあります。



■ /etc/make.conf



/etc/make.confというファイルがあって、これは、FreeBSDでいろんなプログラムをコンパイルするとき(カーネルやportsも)、コンパイル条件などを指定するファイルです。「man make.conf」で、詳しい説明が見られますし、/usr/share/examples/etc/make.conf に、サンプルが載っています。



このmake.confに、たとえば、

NO_MODULES=true

とかいておくと、カーネル再構築のときに、モジュールが一切コンパイルされなくなります。



ちなみに、man make.confを見るとわかりますが、注意事項が1つあります。manを見ると、NO_MODULESにはboolと書かれています。boolというのは、変数(てゆーかマクロか?!)が定義されているかいないか、だけに意味があるので、

NO_MODULES=false

と書いてあっても、やっぱり、モジュールはまったくコンパイルされなくなります。



さてさて、これだと、acpi.koも作られなくなってしまうので、ちょっと困ってしまいます。



ほしいモジュールだけコンパイルして欲しい場合は、MODULES_OVERRIDEで指定します。たとえば、

MODULES_OVERRIDE="linux acpi/acpi"

とかくと、linux.koacpi.koだけが作られます。



ちゃんと調べてないですが、どうやら、MODULES_OVERRIDEに指定するのは、ディレクトリ/usr/src/sys/modules以下にあるディレクトリ名だと思われます。

> ls /usr/src/sys/modules/
3dfx                    ichwd                   procfs
3dfx_linux              ida                     pseudofs
Makefile                idt                     pst
Makefile.inc            ie                      puc
aac                     if_bridge               ral

(長いので以下省略)

acpiというディレクトリの中には、さらに、ディレクトリがあるので・・・



> ls /usr/src/sys/modules/acpi/
Makefile        acpi            acpi_fujitsu    acpi_panasonic  acpi_toshiba
Makefile.inc    acpi_asus       acpi_ibm        acpi_sony       acpi_video



MODULES_OVERRIDE="acpi" と、「acpi」とだけ指定してカーネル再構築を行った場合は、

> ls /boot/kernel/acpi*
/boot/kernel/acpi.ko            /boot/kernel/acpi_panasonic.ko
/boot/kernel/acpi_asus.ko       /boot/kernel/acpi_sony.ko
/boot/kernel/acpi_fujitsu.ko    /boot/kernel/acpi_toshiba.ko
/boot/kernel/acpi_ibm.ko        /boot/kernel/acpi_video.ko

というような、acpiディレクトリ内のすべてがコンパイルされました。そのため、「acpi/acpi」というように限定してみました。



MODULES_OVERRIDE="linux acpi/acpi"と指定して、カーネルを再構築してみました。



freebsd# make install
thiskernel=`sysctl -n kern.bootfile` ;  if [ ! "`dirname "$thiskernel"`" -ef /boot/kernel ] ; then  chflags -R noschg /boot/kernel ;  rm -rf /boot/kernel ;  else  if [ -d /boot/kernel.old ] ; then  chflags -R noschg /boot/kernel.old ;  rm -rf /boot/kernel.old ;  fi ;  mv /boot/kernel /boot/kernel.old ;  sysctl kern.bootfile=/boot/kernel.old/"`basename "$thiskernel"`" ;  fi
kern.bootfile: /boot/kernel/kernel -> /boot/kernel.old/kernel
mkdir -p /boot/kernel
install -p -m 555 -o root -g wheel kernel /boot/kernel
cd ../../../modules; MAKEOBJDIRPREFIX=/usr/src/sys/i386/compile/VMware/modules MODDIR=/boot/kernel MODULES_OVERRIDE="linux acpi/acpi" MACHINE=i386 KERNBUILDDIR="/usr/src/sys/i386/compile/VMware" make  install
===> linux (install)
install -o root -g wheel -m 555   linux.ko /boot/kernel
===> acpi/acpi (install)
install -o root -g wheel -m 555   acpi.ko /boot/kernel
kldxref /boot/kernel



インストールされたのは、これだけです

freebsd# ls /boot/kernel
acpi.ko         kernel          linker.hints    linux.ko



■ /etc/make.conf は影響範囲が大きすぎる



/etc/make.confに書いた内容は、カーネルをコンパイルするとき以外に、portsからソフトをインストールするときにも効いてしまいます。たまたま同じ変数を参照する、異なるportsがあったりすると、両方のportsに効いてしまうわけですね。



カーネル再構築の話から脱線しちゃいますが、ついでに書いときます。



portsの場合は、/usr/local/etc/pkgtools.confというファイルの、MAKE_ARGSというところで、パッケージごとに、オプションを指定できるようになっています(ちょっと記述方法が独特で迷うかもしれませんが)。このファイルはportupgradeをインストールすると作られます。



make.confに書かずに、pkgtools.confのMAKE_ARGSに書いておいてから、

portinstallコマンドで、portsをコンパイルします。

はい、ここ重要です!!「makeコマンド」でコンパイルしちゃうと、pkgtools.confは参照されません(make.confは参照されるんですけどね・・・)。



portsのコンパイルがはじまった直後に、pkgtools.confからどういうオプションが適用されたかが表示されるので、慣れないうちは、その表示を念入りに確認するといいでしょうね。





■ makeoptionsでカーネルごとに個別指定できる



カーネル再構築の場合は、どうするか?
べつにmake.confでもいいかもしれませんが、1台のFreeBSDマシン(処理が高速なマシン)で、別のマシン(処理がのろいマシン)のカーネルをコンパイルするようなケースがあるので、そういうときは、カーネルごとに、別のコンパイルオプションを指定したいです。make.confを毎回書き換えるっては、スマートじゃありません。
・・・ってことで、ちゃんと方法があります。



カーネルのコンフィギュレーション・ファイルに、

makeoptions  MODULES_OVERRIDE="linux acpi/acpi"

のように書きます。ファイルにこのように書き込んでおいてから、「config ファイル」を実行して、カーネルをコンパイルすればいいだけです。これなら、カーネルごとに、異なるオプションを指定できます。



ところで、この書き方は、/usr/src/sys/conf/NOTES というファイルを見てて学びました。このファイルと、あと/usr/src/sys/i386/conf/NOTESには、カーネル・コンフィギュレーション・ファイルの書き方のヒントがたくさんのっています。
それと、「man 5 config」と実行すると、カーネルのコンフィギュレーション・ファイルの書式など、ごく基本的な情報が得られます。



■ VMwareの中のFreeBSD用カーネル・コンフィギュレーション・ファイル



上記を反映し、もうちょっと見直して、コンフィグファイルを書き変えてみました。



makeoptions MODULES_OVERRIDE="~"を追加して、IPv6も削除しちゃいました。splashも削ってしまっているので、スクリーンセーバーも使えなくなっているかと思います(まあ、VMwareの中では不要でしょう)。



machine         i386
cpu             I686_CPU
ident           VMware
options         SCHED_4BSD              # 4BSD scheduler
options         PREEMPTION              # Enable kernel thread preemption
options         INET                    # InterNETworking
options         FFS                     # Berkeley Fast Filesystem
options         SOFTUPDATES             # Enable FFS soft updates support
options         UFS_ACL                 # Support for access control lists
options         UFS_DIRHASH             # Improve performance on big directories
options         MD_ROOT                 # MD is a potential root device
options         NFSCLIENT               # Network Filesystem Client
options         NFSSERVER               # Network Filesystem Server
options         NFS_ROOT                # NFS usable as /, requires NFSCLIENT
options         MSDOSFS                 # MSDOS Filesystem
options         CD9660                  # ISO 9660 Filesystem
options         PROCFS                  # Process filesystem (requires PSEUDOFS)
options         PSEUDOFS                # Pseudo-filesystem framework
options         GEOM_GPT                # GUID Partition Tables.
options         COMPAT_43               # Compatible with BSD 4.3 [KEEP THIS!]
options         COMPAT_FREEBSD4         # Compatible with FreeBSD4
options         COMPAT_FREEBSD5         # Compatible with FreeBSD5
options         SCSI_DELAY=5000         # Delay (in ms) before probing SCSI
options         KTRACE                  # ktrace(1) support
options         SYSVSHM                 # SYSV-style shared memory
options         SYSVMSG                 # SYSV-style message queues
options         SYSVSEM                 # SYSV-style semaphores
options         _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extension
s
options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev
options         ADAPTIVE_GIANT          # Giant mutex is adaptive.
device          apic                    # I/O APIC
device          pci
device          ata
device          atadisk         # ATA disk drives
device          atapicd         # ATAPI CDROM drives
options         ATA_STATIC_ID   # Static device numbering
device          scbus           # SCSI bus (required for SCSI)
device          da              # Direct Access (disks)
device          atkbdc          # AT keyboard controller
device          atkbd           # AT keyboard
device          psm             # PS/2 mouse
device          vga             # VGA video card driver
device          sc
device          agp             # support several AGP chipsets
device          pmtimer
device          lnc             # NE2100, NE32-VL Lance Ethernet cards
device          loop            # Network loopback
device          random          # Entropy device
device          ether           # Ethernet support
device          tun             # Packet tunnel.
device          pty             # Pseudo-ttys (telnet etc)
device          md              # Memory "disks"
device          bpf             # Berkeley packet filter
device          uhci            # UHCI PCI->USB interface
device          usb             # USB Bus (required)
device          ugen            # Generic
device          umass           # Disks/Mass storage - Requires scbus and da
device          sound
device          snd_es137x
makeoptions     MODULES_OVERRIDE="linux acpi/acpi"



「VMware.FreeBSD.CONFIG2.txt」をダウンロード



0 件のコメント:

コメントを投稿