kernel 更新後の初回起動時にリビルドなどの処理を自動的にしてくれる init スクリプト
最近の Vine Linux 4.2/VineSeed は、 apt-get upgrade としたら、通常 kernel 関連パッケージも更新されてしまいます。このため、
- kernel 更新後の初回起動時に NVIDIA のドライバーモジュールをリビルドするのを忘れていて X が起動しなかったり、
- VMware Player の kernel モジュールのリビルドを忘れていて起動しなかったり、
- Vine に madwifi-hal のカーネルモジュールがないから、毎回ビルドしなきゃ!
など、うっかりとやってしまう場合がしばしばあります。
ということで、「起動時の処理や kernel 更新時への処理を、自前で init スクリプトを用意しときましょ!」それだけの話です。ハイ。某所向けに作成した init スクリプトを骨抜きしまくって作りました。
インストール方法を説明します。
- 以下のスクリプトをたとえば /etc/init.d/my-updates として保存します。具体的な処理については、適当に修正してください。以下のスクリプトはサンプルも兼ねています。
- /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 月ごろから VineSeed で Gnome メニューの「シャットダウン...」を選択して、再起動やシャットダウンを選択しても全く実行されなくなってしまった。
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>
$ sudo /etc/init.d/haldaemon restart HAL デーモンを停止中: [ OK ] HAL デーモンを起動中: [ OK ]
再び USB メモリをぶち込むと、(デフォルトだと、)自動的に gnome-mount が実行されて、無事に (FreeBSD の!?) NIS ユーザーでもマウントすることができました。