-->

2009-11-28

genkernel の ロードする kernel モジュールを最低限にする。

gentoo で genkernel を利用している場合で、起動時にロードされる kernel モジュールを減らしたい場合の参考です。実行後 lsmod の内容が減りますが その利点は、使用するメモリが減ることです。

実行すると ssh 接続が切れますので、ネットワークモジュールを消さないか、ローカル上のターミナルで rmmod を実行することを、お勧めします。
$ lsmod |awk '{print "sudo rmmod "$1}' > rmmod.txt

ダイレクトにアンロードする場合
$ lsmod |`awk '{print "sudo rmmod "$1}'`

コマンドを実行すると使っているモジュール以外はアンロードされます。
2回以上実行して lsmod の内容に変化が無くなるまで行います。
この例の場合 r8169(miiは自動で呼ばれる) 以外はアンロードできないので、最低限のモジュールになったと判断しています。
この場合の r8169 はマザーボードや pci などの LAN カードによって名前が変わります。
この場合の LAN カードは Realtek 8111C (マザーボードに付属)です。
$ lsmod
Module                  Size  Used by
r8169                  35212  0
mii                     5944  1 r8169
ipv6                  268672  14
raid1                  21816  4
usbcore               157520  1
ahci                   38152  8
libata                188396  1 ahci

genkernel の /boot/ にある initramfs(この例の場合initramfs-genkernel-x86_64-2.6.30-gentoo-r5)のオプションを減らします。
ext2, ext3 はこの例の場合モジュールではないのですが、使っているので残しました。
$ cat /usr/share/genkernel/arch/x86_64/modules_load
# Module groups for genkernel initramfs auto-loading

# RAID
MODULES_ATARAID=""
MODULES_DMRAID=""
MODULES_EVMS="raid1"
MODULES_LVM=""
MODULES_MDADM="raid1"

# Hardware (IDE/SCSI/SATA)
MODULES_PATA="libata"
MODULES_SATA="ahci libata"
MODULES_SCSI=""
MODULES_WAITSCAN=""

# Hardware (Network)
MODULES_NET="r8169 mii ipv6"

# Hardware (Pluggable)
MODULES_FIREWIRE=""
MODULES_PCMCIA=""
MODULES_USB="usbcore"

# Filesystems
MODULES_FS="ext2 ext3"

再作成します。
$ sudo genkernel initramfs

再起動して、無事起動に成功した場合は lsmod の結果が期待した内容より少し多い状態になっています。
この例の場合、設定したものより多い理由は
lm-sensors の場合は it87, i2c-core など
ソフトウェアごとに必要なモジュールが、そのソフトウェアの起動時に呼ばれているためです。
$ grep ^MOD /etc/conf.d/lm_sensors
MODULE_0=it87

$ grep MODULE_ /etc/init.d/lm_sensors
                if [ -z "${MODULE_0}" ]; then
                        eerror "MODULE_0 is not set in /etc/conf.d/lm_sensors, try running sensors-detect"
                        module=`eval echo '$'MODULE_${i}`
                        module_args=`eval echo '$'MODULE_${i}_ARGS`
                # find the highest possible MODULE_ number
                        module=`eval echo '$'MODULE_${i}`
                        module=`eval echo '$'MODULE_${i}`

また floopy などは /sys/bus/pci/devices/ からハードウェアを検索して、モジュールを自動で追加するので問題ないです。
例えば floppy を使わない場合は bios で停止してください。
$ lsmod
Module                  Size  Used by
it87                   25056  0
hwmon_vid               2952  1 it87
hwmon                   3096  1 it87
i2c_core               27744  0
ohci1394               30340  0
ieee1394               95520  1 ohci1394
ehci_hcd               35716  0
processor              39720  0
ohci_hcd               23444  0
floppy                 58968  0
rtc                     8464  0
thermal                17368  0
sg                     31536  0
thermal_sys            16208  2 processor,thermal
button                  6920  0
ipv6                  273696  20
nf_conntrack           75760  0
r8169                  35324  0
mii                     5944  1 r8169
raid1                  21816  4
usbcore               157568  3 ehci_hcd,ohci_hcd
ahci                   38232  8
libata                188412  1 ahci

また実行するに当たって grub などのブートローダーで、古いカーネルが呼べる状態であるか
1CD Linux などでレスキュー可能であるなどの、回復が可能な環境でなければ、実行しないことを、お勧めします。

0 件のコメント: