ふと思い出したので、先日のお話・・・
のつづきというか、落ち穂ひろいです。
カーネル再構築は、けっこう時間がかかります。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.koとacpi.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 件のコメント:
コメントを投稿