kernel 更新後の初回起動時にリビルドなどの処理を自動的にしてくれる init スクリプト

最近の Vine Linux 4.2/VineSeed は、 apt-get upgrade としたら、通常 kernel 関連パッケージも更新されてしまいます。このため、

  • kernel 更新後の初回起動時に NVIDIA のドライバーモジュールをリビルドするのを忘れていて X が起動しなかったり、
  • VMware Player の kernel モジュールのリビルドを忘れていて起動しなかったり、
  • Vine に madwifi-hal のカーネルモジュールがないから、毎回ビルドしなきゃ!

など、うっかりとやってしまう場合がしばしばあります。

ということで、「起動時の処理や kernel 更新時への処理を、自前で init スクリプトを用意しときましょ!」それだけの話です。ハイ。某所向けに作成した init スクリプトを骨抜きしまくって作りました。

インストール方法を説明します。

  1. 以下のスクリプトをたとえば /etc/init.d/my-updates として保存します。具体的な処理については、適当に修正してください。以下のスクリプトはサンプルも兼ねています。
  2. /sbin/chkconfig my-updates on を実行します。
#!/bin/bash
# 	$Id: my-updates,v 1.6 2009/05/08 17:57:34 munepi Exp $	
#
# my-updates		my updates
# 
# Author:		munepi <munepi えっくすわいぜっと あっとまーく じーめーる どっと こむ>
# chkconfig:		345 99 01
# description:		automatically updates this system
# processname:		my-updates

### BEGIN INIT INFO
# Provides: my-updates
# Required-Start: nfslock rpcbind ypbind
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
### END INIT INFO

# source function library
. /etc/rc.d/init.d/functions

ARCH=$(uname -i)
[ "$ARCH" = "i386" ] && ARCH=x86
RETVAL=0

MY_KERNEL_VERSION=/etc/my_kernel_version

MY_EEEPC_HOSTNAME="eeevine"

## Shared Folders for VMware Player
install -d -m0775 /tmp/vmware/
chown munepi:users /tmp/vmware/

## for tmpfs
install -m755 -d /var/cache/apt/archives/partial

### <eeevine>
if [ "$(hostname)" = "${MY_EEEPC_HOSTNAME}" ]; then
# Optional: swap zero
    echo 0 > /proc/sys/vm/swappiness
fi
### </eeevine>

## automatically rebuild some kernel modules
[ -f $MY_KERNEL_VERSION ] || \
    echo "$(uname -r)" > $MY_KERNEL_VERSION
MY_KERNEL=$(cat $MY_KERNEL_VERSION)
NEW_KERNEL=$(uname -r)

## NVIDIA driver
Rebuild_nvdrv(){
    NVDRV_DIR=/park/src/nvidia
    echo -n "    Rebuilding kernel modules for NVIDIA drivers ... "
    bash $(ls ${NVDRV_DIR}/*-${ARCH}-* | tail -1) -s > /dev/null 2>&1
    echo "done."
}

## VMware Player
Rebuild_vmplayer(){
    Rebuild_vmplayer_25x
}

## VMware Player 2.5.x
Rebuild_vmplayer_25x(){
    echo -n "    Rebuilding kernel modules for VMware Player ... "
    vmware-modconfig --console --install-all > /dev/null 2>&1
    echo "done."
    # /etc/init.d/vmware restart > /dev/null 2>&1
}

## VMware Player 2.0.x
Rebuild_vmplayer_20x(){
    echo -n "    Rebuilding kernel modules for VMware Player ... "
    yes | ${__sed} s/y// | sudo vmware-config.pl
    echo "done."
    /etc/init.d/vmware restart > /dev/null 2>&1
}

### <eeevine>
## eeevine-utils: run make install
## 701: madwifi-hal
## 901: rt2860sta
Rebuild_eeevine(){
    echo -n "    Rebuilding kernel modules for Wireless LAN ... "
    pushd /usr/local/share/eeevine  > /dev/null 2>&1
    make install  > /dev/null 2>&1
    popd > /dev/null 2>&1
    echo "done."
}
### </eeevine>

start(){
    echo "Starting my updates: "
    if [ "$NEW_KERNEL" != "$MY_KERNEL" ]; then
    
	if [ "$(hostname)" = "${MY_EEEPC_HOSTNAME}" ]; then
	    Rebuild_eeevine
	else
	    Rebuild_nvdrv
	    Rebuild_vmplayer
	fi

	echo $(uname -r) > $MY_KERNEL_VERSION
    fi
    RETVAL=$?
    [ $RETVAL -eq 0 ] && action "" /bin/true || action "" /bin/false
}

status(){
    [ -f $MY_KERNEL_VERSION ] \
	&& echo "$(cat $MY_KERNEL_VERSION) done." \
	|| echo "none done."
} 

case "$1" in
    start)
	start
	;;
    status)
	status
	;;
    *)
	echo $"Usage: $0 {start|status}"
	exit 1
esac

exit 0

### end of file