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

Dock (風)アプリケーションやグローバルメニューを試してみた

次期 Vine Linux 5.0 は、ユーザーごとに今風の派手な重量デスクトップ環境として使うか、軽量デスクトップとして使うかのどちらかに分かれるんじゃないかと予想しています。

今風な Linux デスクトップには、 3D デスクトップや Compiz 、 Mac OS X ライクな Dock アプリケーション (Avant Window Navigator や Cairo Dock) 、グローバルなメニューが流行りなんだろうと思います。

手元の Eee PC 4G-X の VineSeed 上では、 Gnome + ランチャー + グローバルメニューの組み合わせにしてみました。

このようなデスクトップアプリケーションも Vine にあっても良いんじゃないかと思い、重量デスクトップでも軽量デスクトップでもどちらでもいけるように、 Vine Linux へ収録すべく、いくつかのアプリケーションを試してみました。

avant-window-navigator

Avant Window Navigator は、 Compiz Fusion 使用時でしか使えない Dock アプリケーション。 Cairo Dock よりも軽量な気がします。

ただ、ランチャーとしてアプリケーションを追加するときに、ドラッグ&ドロップで追加していけないのが面倒だった。

wbar

こちらはうってかわって、 Dock 風な軽量ランチャーです。

gOS にも標準で使われているアプリケーションで、 Python + GTK2 だけで動くので、 Compiz Fusion は不要で、 Window Manager に依存せずに使うことができます。

ランチャーとしてアプリケーションの追加がドラッグ&ドロップで可能でした。

ただし、ランチャーのアイコンに svg 形式を使うことができなかった。どうも svg 形式には未対応みたいです。

すでに Vine Linux 向けに rpm を作成していて、 wbar_util や wbarconf も同梱しており、細かなカスタマイズ済みです。まさに Vine 向けに用意された Dock 風なランチャーですか???

gnome-globalmenu

メニューバーはユーザーインターフェースの中でも基本的なインターフェースで、ウィンドウ毎に決まった場所に付いているか、特殊なソフトならば別の実装がされています。

Mac OS X で一番気に入っているのが、 Dock よりもむしろこの「グローバルメニュー」。いつも画面の上部にすべてが集約されていて、インターフェースの統一感があります。

VineSeed で試したところ、 Firefox のメニューバーが反映されなかった。たぶんツールキットが GTK2 じゃないのかな。 vlc も最新版だと qt4 になっているので、グローバルメニューになってくれませんでした。

特に、最近流行のネットブックなどの解像度が小さなモニタの場合に、ウィンドウ毎のメニューバーが無くなるだけで、ずいぶん画面が大きくなります。

ここらへんの自由度がもう少し効くようにならば、 Linux でも十分グローバルメニューが使い物になると思う。かなりおすすめです。

VineSeed で Gnome メニューの「シャットダウン...」から再起動やシャットダウンができない

なぜだか分からないんだけど、 1 月ごろから VineSeedGnome メニューの「シャットダウン...」を選択して、再起動やシャットダウンを選択しても全く実行されなくなってしまった。

Gnome のシャットダウンや再起動のアクションは、 GDM で設定されています。

/usr/share/gdm/defaults.conf がデフォルトで、ローカルで変更したい場合は、 Vine Linux だと /etc/X11/gdm/custom.conf および /etc/X11/gdm/ 以下を弄ることで設定できます。

実際に、シャットダウンや再起動は /usr/share/gdm/defaults.conf で以下のように設定されています。

# System command support.
#
# Reboot, Halt and suspend commands, you can add different commands separated
# by a semicolon.  GDM will use the first one it can find.
RebootCommand=/usr/bin/reboot;/sbin/reboot;/sbin/shutdown -r now;/usr/sbin/shutdown -r now
HaltCommand=/usr/bin/poweroff;/sbin/poweroff;/sbin/shutdown -h now;/usr/sbin/shutdown -h now
SuspendCommand=

/usr/bin/reboot や /usr/bin/poweroff はユーザー権限でも実行ができるので、どこが変更されたのか原因究明中です。

仕方ないのでしばらくの間、 zenity で「シャットダウン...」もどきを作ってみました。

#!/bin/sh

isReboot="再起動"
isShutdown="シャットダウン"
isLogout="ログアウト"
itemLIST="$isReboot $isShutdown $isLogout"

isGNOME="GNOME"
isLXDE="LXDE"

Mygnomelogout() {
    echo -n "$CurrentWM: stating logout process ... "
    lxdelogout
    echo "done. "
}

Mygnomelogout() {
    echo -n "$CurrentWM: stating logout process ... "
    gnome-session-save --logout
    echo "done. "
}

Logout(){
    CurrentWM=$(ps x | grep -m1 '[l]xde-settings'>/dev/null && echo $isLXDE)
    [ "$CurrentWM" = "$isLXDE" ] && Mylxdelogout
    CurrentWM=$(ps x | grep -m1 '[g]nome-settings'>/dev/null && echo $isGNOME)
    [ "$CurrentWM" = "$isGNOME" ] && Mygnomelogout
    exit 0
}

CMD=$(zenity --list \
    --title "シャットダウンの選択" \
    --width=240 --height=210 \
    --text "あなたは現在 \"$LOGNAME\" でログインしています。
このシステムを今すぐシャットダウンしますか?" \
    --column "動作" $itemLIST)
REP=$?
[ $REP = 1 ] && exit 1

case "$CMD" in
    "$isLogout")
	Logout;
	;;
    "$isReboot")
	shutdown -r now
	;;
    "$isShutdown")
	shutdown -p now
	;;
esac

[ $REP = 0 ] && shutdown -p now

exit

Fedora 8 で FreeBSD の NIS ユーザーだとなぜか gnome-mount ができなかった件

たとえば USB メモリを差し込むと,大抵自動認識しますよね。ところがしてくれなかったので、手動で gnome-mount を実行してみました。

$ gnome-mount -t -d /dev/sdb1
gnome-mount 0.7

** (gnome-mount:8290): WARNING **: Mount failed for /org/freedesktop/Hal/devices/volume_uuid_48CF_8F0F
org.freedesktop.Hal.Device.PermissionDeniedByPolicy : org.freedesktop.hal.storage.mount-removable no <-- (action, result)

すると、 org.freedesktop.hal.storage.mount-removable の値がどうも no らしいんですね。

いやね、ローカルユーザーならば、何もしなくても自動でマウントしてくれるんですが、 (FreeBSD の!?) NIS ユーザーだと違うんでしょうね。

そこで、/etc/PolicyKit/PolicyKit.conf に設定をぶち込んでみました。

<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->

<!DOCTYPE pkconfig PUBLIC "-//freedesktop//DTD PolicyKit Configuration 1.0//EN"
"http://hal.freedesktop.org/releases/PolicyKit/1.0/config.dtd">

<!-- See the manual page PolicyKit.conf (5) for file format -->

<config version="0.1">
        <match action="org.freedesktop.hal.storage.mount-removable">
        <return result="yes" />
        </match>
</config>

にこんな感じでぶち込みます。そして、 HAL を再起動します。

$ sudo /etc/init.d/haldaemon restart
HAL デーモンを停止中:                                      [  OK  ]
HAL デーモンを起動中:                                      [  OK  ]

再び USB メモリをぶち込むと、(デフォルトだと、)自動的に gnome-mount が実行されて、無事に (FreeBSD の!?) NIS ユーザーでもマウントすることができました。