Fedora Core 3 Configuring my kernel [ぱそ関係]
Kernel をコンパイルできる環境があるなら、自分だけの Kernel を作ってみたいと思うのが人情。 ということで、作ってみた。
といっても、ちょっとしたパッチをあてて Kernel Config をいじったぐらいなのであんまり期待しないでネ。
---------------------------
●check currently using kernel modules.
時代の流れとは逆行するが、loadable module を static link に変更すれば、insmod の時間を省略することができる。(RAM展開の時間は長くなるけど)
マザーボードに付いてて起動に必要なデバイスは全部 static にリンクして、全然関係ないデバイスドライバは module も作らないようにする。
まずは、現状把握から。
[root@localhost drivers]# /sbin/lsmod Module Size Used by parport_pc 28421 1 lp 12489 0 parport 40201 2 parport_pc,lp autofs4 26181 0 sunrpc 164485 1 pcmcia 26465 4 ipt_REJECT 7105 1 ipt_state 1857 4 ip_conntrack 40601 1 ipt_state iptable_filter 2881 1 ip_tables 19777 3 ipt_REJECT,ipt_state,iptable_filter dm_mod 59221 0 video 15813 0 button 6609 0 battery 9285 0 ac 4805 0 md5 4161 1 ipv6 259201 8 ohci1394 39129 0 ieee1394 309145 1 ohci1394 yenta_socket 21065 3 rsrc_nonstatic 10433 1 yenta_socket pcmcia_core 47993 3 pcmcia,yenta_socket,rsrc_nonstatic uhci_hcd 33497 0 hw_random 6101 0 i2c_i801 8653 0 i2c_core 21953 1 i2c_i801 snd_intel8x0 34049 2 snd_ac97_codec 71097 1 snd_intel8x0 snd_pcm_oss 51953 0 snd_mixer_oss 18241 2 snd_pcm_oss snd_pcm 99657 3 snd_intel8x0,snd_ac97_codec,snd_pcm_oss snd_timer 33093 1 snd_pcm snd 56741 8 snd_intel8x0,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer soundcore 10785 2 snd snd_page_alloc 9669 2 snd_intel8x0,snd_pcm 8139too 29505 0 mii 4929 1 8139too floppy 64753 0 sr_mod 18917 0 ext3 131145 1 jbd 82777 1 ext3 aic7xxx 175641 0 sd_mod 19265 0 scsi_mod 139817 3 sr_mod,aic7xxx,sd_mod [root@localhost drivers]#
各 module が何か(ソース上のどれか、Kernel Config のどのあたりに関係在りそうか)というのは /sbin/modinf <module name> コマンドで調べることができる。
基本的に、フロッピー、IDE、ネットワーク、サウンド関係を static にした。
こちらが Static にリンクした Kernel での lsmod。
[root@mx3gk ~]# /sbin/lsmod Module Size Used by ohci1394 34584 0 ieee1394 305848 1 ohci1394 tsdev 7616 0 aic7xxx 170680 0 sd_mod 18576 0 scsi_mod 92388 2 aic7xxx,sd_mod [root@mx3gk ~]#
---------------------------
●CPU の種類も調べておこう。
Fedora Core の設定は、intel のみではなく AMD をはじめとする互換CPUを全部サポートすることになっている。 この辺も絞れそう。
[root@localhost linux-2.6.11]# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 3 cpu MHz : 868.880 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 mtrr pge mca cmov pat pse36 mmx fxsr sse bogomips : 1724.41 [root@localhost linux-2.6.11]#
いらないかも知れないけどPCIデバイスの一覧。
[root@mx3gk ~]# /sbin/lspci 00:00.0 Host bridge: Intel Corp. 82815 815 Chipset Host Bridge and Memory Controller Hub (rev 02) 00:01.0 PCI bridge: Intel Corp. 82815 815 Chipset AGP Bridge (rev 02) 00:1e.0 PCI bridge: Intel Corp. 82801AA PCI Bridge (rev 02) 00:1f.0 ISA bridge: Intel Corp. 82801AA ISA Bridge (LPC) (rev 02) 00:1f.1 IDE interface: Intel Corp. 82801AA IDE (rev 02) 00:1f.2 USB Controller: Intel Corp. 82801AA USB (rev 02) 00:1f.3 SMBus: Intel Corp. 82801AA SMBus (rev 02) 00:1f.5 Multimedia audio controller: Intel Corp. 82801AA AC'97 Audio (rev 02) 01:00.0 VGA compatible controller: nVidia Corporation NV11 [GeForce2 MX/MX 400] (rev a1) 02:09.0 SCSI storage controller: Adaptec AIC-7892A U160/m (rev 02) 02:0a.0 Multimedia video controller: Sony Corporation: Unknown device 8087 (rev 01) 02:0b.0 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev 80) 02:0b.1 CardBus bridge: Ricoh Co Ltd RL5c476 II (rev 80) 02:0d.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) 02:0e.0 FireWire (IEEE 1394): Texas Instruments FireWire Controller (rev 01) 07:00.0 Communication controller: Agere Systems (former Lucent Microelectronics) LT WinModem [root@mx3gk ~]#
もっといらないかもしれないけど、USBデバイスの一覧
[root@mx3gk ~]# /sbin/lsusb Bus 001 Device 004: ID 046d:c030 Logitech, Inc. iFeel Mouse Bus 001 Device 003: ID 054c:0036 Sony Corp. Bus 001 Device 002: ID 050f:0003 KC Technology, Inc. KC82C160S Hub Bus 001 Device 001: ID 0000:0000 [root@mx3gk ~]#
------------------------------
●ACPI の Disable
古いマシン(VAIO MX3GK)なので、Windows XP で ACPI 対応でうごくとはいえ、CPU の動作周波数が動的に切り替わるわけじゃないし、ACPI モードでも Suspend がうまく動かなかった(原因のひとつは AIC7xxx SCSI カードのドライバにあるらしい)ので、あまりACPI のメリットは感じられない。
一応、APM もサポートしてるっぽいので、APM + PnP に切り替えておこう。
------------------------------
●linux-tiny patch
http://www.selenic.com/tiny-about/
一応、組込み関係が発端らしいが、別にデスクトップマシンにあててもいいんじゃない? ということで、あんまり動作に悪影響を与えないと思われる範囲であててみた。
broken-out っていう、項目ごとにパッチが分れてる方をダウンロードして、series っていうファイルをみながら上から順番にパッチをあてていく。 最初に80個ぐらいあるパッチをみたときはどれからあてるのか途方に暮れたが、順番って英語で series なのさという閃きにより解決。
あてたのは
tiny stuff
Unconditional bits
build options
measurement bits
trimmed debugging support
のあたり。
[2.6.11-1.27FC での Update]
net 関係はなんかパフォーマンスがもの凄く落ちそうな気がしたのでパス。
あと Unconditional の 06-crypt もわけわからんのでパス。
trimmed debugging support の tiny-panic と no-panic も手パッチがめんどくさいのでパス。
patch -p1 < 2.6.11-tiny1/core-small.patch patch -p1 < 2.6.11-tiny1/pid-max.patch patch -p1 < 2.6.11-tiny1/user-hash.patch patch -p1 < 2.6.11-tiny1/futex-queues.patch patch -p1 < 2.6.11-tiny1/tvec_bases.patch patch -p1 < 2.6.11-tiny1/con_buf.patch patch -p1 < 2.6.11-tiny1/small-8023.patch patch -p1 < 2.6.11-tiny1/tg3-oops.patch patch -p1 < 2.6.11-tiny1/namei-inlines.patch patch -p1 < 2.6.11-tiny1/buffer-inlines.patch patch -p1 < 2.6.11-tiny1/fs_open-inlines.patch patch -p1 < 2.6.11-tiny1/inode-inlines.patch patch -p1 < 2.6.11-tiny1/ext2namei-inlines.patch patch -p1 < 2.6.11-tiny1/fslocks-inline.patch patch -p1 < 2.6.11-tiny1/tiny-cflags.patch patch -p1 < 2.6.11-tiny1/kmalloc-accounting.patch patch -p1 < 2.6.11-tiny1/audit-bootmem.patch patch -p1 < 2.6.11-tiny1/bloat-o-meter.patch patch -p1 < 2.6.11-tiny1/deprecate-inline.patch patch -p1 < 2.6.11-tiny1/func-size.patch patch -p1 < 2.6.11-tiny1/no-doublefault.patch patch -p1 < 2.6.11-tiny1/kill-printk.patch patch -p1 < 2.6.11-tiny1/nobug.patch patch -p1 < 2.6.11-tiny1/no-elf-core.patch patch -p1 < 2.6.11-tiny1/no-kcore.patch patch -p1 < 2.6.11-tiny1/change-hz.patch patch -p1 < 2.6.11-tiny1/cpu-support.patch
といっても、遊びで enable にしてみたけど、遅くて Kernel としては問題ありな測定関係などは本番では disable。 printk を削除するヤツとか、HZ マクロを変更できるやつは便利ですな。
HZ マクロは kernel.org のソースは 100 (10msんごとにプロセスを切り替える)だけど、カジュアルOS でほとんど決まった少数のアプリしか動かさないのにそんなに頻繁にプロセスを切り替えるのって無駄じゃん? Windows だって 80ms ごとぐらいでしかプロセス切り替えてないんだし。 ということで、HZ を100より小さな値に設定する。
10 に設定しようとしたが、32 以上でないとコンパイル時にエラーが出るらしい。
50 だとゼロ割り算でカーネルパニックになる(コンパイル時にいっぱいワーニングが出る)。
40 だとコンパイルエラーが出るが、kernel/dump.c の udelay(1000000/HZ) の所のエラーは mdelay(1000/HZ)に変更。(そんなのでいいのか?)
ということで、とりあえず40にした。これでも25ms毎にプロセスを切りかえる。
そのほか、Undefined function が出たら基本的にからっぽの関数をついかして誤魔化す。
●/proc/config.gz をenable
忘れ易いので、どんな kernel config にしたかは、kernel さん本人におぼえておいてもらいましょう。
ちなみに、起動してる kernel の設定をみるときは、
zcat /proc/config.gz | less
------------------------------
●/boot/grub/grub.conf の設定#1 bootchart
ブートチャートっていう kernel の起動のようすを視覚化して把握しやすくしてくれるツールがある。
http://www.bootchart.org/
で、これをインストールしていろんなパターンでconfig した kernel の起動時間を測定。
bootchart の設定は、インストールスクリプトでインストールして、kernel のコマンドラインオプションにinit=/sbin/bootchartd を追加するだけなのでやってみそ。
/var/log/bootchart.tgz ファイルを http://www.bootchart.org/download.html で upload すると png ファイル(チャート)がダウンロードできる。
●grub の設定#2 rhgb
Fedora Core はデフォルトで rhgb(Redhat Graphical Boot)を使うようになっているが、別にそんなにゴージャスじゃなくてもいいので、disable。
------------------------------
●ファイルシステム側の設定変更
このへんも @ITとかを眺めながらいろいろいじってみた。
1. /etc/inittab
do not use virtual consoles. delete mingetty
@ITネタ。
2. application - settings - network
hostname を付ける。 別に最適化じゃないけど、いつまでも localhost っていうのも芸が無いかなと思って、mx3gk という名前をつけた。。。やっぱり芸がない。
3. disable services
acpid, cpuspeed, lm_sensors, mdmonitor, ntpd,
kudzu, mDNSResponder, irqbalance, isdn, etc.,...
kudzu の話は @ITにものってますな。
[root@mx3gk Desktop]# /sbin/chkconfig --list kudzu 0:off 1:off 2:off 3:on 4:on 5:off 6:off rpcgssd 0:off 1:off 2:off 3:on 4:on 5:on 6:off tux 0:off 1:off 2:off 3:off 4:off 5:off 6:off psacct 0:off 1:off 2:off 3:off 4:off 5:off 6:off cups-config-daemon 0:off 1:off 2:off 3:on 4:on 5:on 6:off smartd 0:off 1:off 2:on 3:on 4:on 5:on 6:off rpcsvcgssd 0:off 1:off 2:off 3:on 4:on 5:on 6:off diskdump 0:off 1:off 2:off 3:off 4:off 5:off 6:off netdump 0:off 1:off 2:off 3:off 4:off 5:off 6:off snmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off irda 0:off 1:off 2:off 3:off 4:off 5:off 6:off nscd 0:off 1:off 2:off 3:off 4:off 5:off 6:off nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off canna 0:off 1:off 2:on 3:on 4:on 5:on 6:off pcmcia 0:off 1:off 2:on 3:on 4:on 5:on 6:off vncserver 0:off 1:off 2:off 3:off 4:off 5:off 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off squid 0:off 1:off 2:off 3:off 4:off 5:off 6:off xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off saslauthd 0:off 1:off 2:off 3:off 4:off 5:off 6:off vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off spamassassin 0:off 1:off 2:off 3:off 4:off 5:off 6:off portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off autofs 0:off 1:off 2:off 3:on 4:on 5:on 6:off haldaemon 0:off 1:off 2:off 3:on 4:on 5:on 6:off netplugd 0:off 1:off 2:off 3:off 4:off 5:off 6:off ypbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off winbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off readahead_early 0:off 1:off 2:off 3:off 4:off 5:on 6:off netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off lm_sensors 0:off 1:off 2:on 3:on 4:on 5:off 6:off mdmonitor 0:off 1:off 2:on 3:on 4:on 5:off 6:off xfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off ntpd 0:off 1:off 2:off 3:on 4:off 5:off 6:off yum 0:off 1:off 2:off 3:off 4:off 5:off 6:off nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off snmptrapd 0:off 1:off 2:off 3:off 4:off 5:off 6:off mDNSResponder 0:off 1:off 2:off 3:on 4:on 5:off 6:off nifd 0:off 1:off 2:off 3:on 4:on 5:on 6:off acpid 0:off 1:off 2:off 3:on 4:on 5:off 6:off iiim 0:off 1:off 2:on 3:on 4:on 5:on 6:off dc_server 0:off 1:off 2:off 3:off 4:off 5:off 6:off gpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off rpcidmapd 0:off 1:off 2:off 3:on 4:on 5:on 6:off cups 0:off 1:off 2:on 3:on 4:on 5:on 6:off isdn 0:off 1:off 2:on 3:on 4:on 5:off 6:off iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off FreeWnn 0:off 1:off 2:off 3:off 4:off 5:off 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off bluetooth 0:off 1:off 2:off 3:off 4:off 5:off 6:off messagebus 0:off 1:off 2:off 3:on 4:on 5:on 6:off rhnsd 0:off 1:off 2:off 3:on 4:on 5:on 6:off NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off cpuspeed 0:off 1:on 2:on 3:on 4:on 5:off 6:off microcode_ctl 0:off 1:off 2:off 3:off 4:off 5:off 6:off readahead 0:off 1:off 2:off 3:off 4:off 5:on 6:off anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off irqbalance 0:off 1:off 2:off 3:on 4:on 5:off 6:off smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off apmd 0:off 1:off 2:on 3:on 4:on 5:on 6:off mdmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off dc_client 0:off 1:off 2:off 3:off 4:off 5:off 6:off httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off xinetd based services: time-udp: off daytime: off daytime-udp: off cups-lpd: off echo: off kshell: off klogin: off telnet: off tftp: off rsync: off time: off chargen-udp: off krb5-telnet: off dbskkd-cdb: off chargen: off gssftp: off eklogin: off echo-udp: off
4. noauto option to /etc/fstab
必須のDisk は起動時にマウントしてもらわないと困るが、Windows が入ってる方の Disk とか、必要なときにマウントすればいいかなっていうドライブには noauto オプションを付けて、起動時にはマウントしないようにした。
5. rename klogd
top コマンドでみていると、klogd っていうやつがやたらと CPU パワーをくってるみたいなのでさくっと mv /sbin/klogd /sbin/klogd.bak した。
サーバーじゃないしログなんか見ないもん。
------------------------------
●ということで、Kernel config の結果
Kernel Config 20050519-4
http://blog.so-net.ne.jp/yoga/kc-20050519-4
大きいくてブログに一緒にでてくると邪魔なので別にしました。 下書き直リンでお楽しみ下さい。
起動時間が 1分50秒 → 49秒に短縮できたので、一応満足。
ちなみに、SELinux を Disable すると40秒。
こちらが、証拠 PNG。(っていうほどのものでもないけど)