oracle-xeのLSB tagを修正する(debian lenny / squeeze)

※実際には12/24のネタです。

■「apt-get upgrade」したら、oracle-xeのinitスクリプトでWarningが出た。
 というか導入時にも出てました。。。

insserv: warning: script 'K01oracle-xe' missing LSB tags and overrides
insserv: warning: script 'oracle-xe' missing LSB tags and overrides

 参考:Debian init.d script の LSB tag
 http://is.ec.kagawa-u.ac.jp/wp/archives/430

■以下の両方、というよりdebian系を使っている人が対象です。

 Debian LennyにOracle11g Express Editionを導入する
 http://ameblo.jp/labunix/entry-11109590013.html

 Debian SquuezeにもOracle11g Express Editionを入れてみた。
 http://ameblo.jp/labunix/entry-11109670450.html

■実質1箇所だけ修正すれば良い。

$ ls -l /etc/init.d/oracle-xe | cut -c 47-
/etc/init.d/oracle-xe

$ ls -l /etc/rc*/K01oracle-xe | cut -c 44-
/etc/rc0.d/K01oracle-xe -> ../init.d/oracle-xe
/etc/rc1.d/K01oracle-xe -> ../init.d/oracle-xe
/etc/rc6.d/K01oracle-xe -> ../init.d/oracle-xe

■一行目にbashを使う記述がある。

$ sudo head -1 /etc/init.d/oracle-xe
#!/bin/bash

■そんな記述があるのはoracle-xeだけだったw。

$ for list in /etc/init.d/*;do grep bash "$list" > /dev/null 2>&1 && echo "$list";done
/etc/init.d/oracle-xe

■PATH変数指定が必要な、cronをサンプルに見てみる
 ※雛形は、「/etc/init.d/skeleton」にある。

$ head -17 /etc/init.d/cron
#!/bin/sh
# Start/stop the cron daemon.
#
### BEGIN INIT INFO
# Provides:          cron
# Required-Start:    $remote_fs $syslog $time
# Required-Stop:     $remote_fs $syslog $time
# Should-Start:      $named slapd autofs ypbind nscd nslcd
# Should-Stop:       $named slapd autofs ypbind nscd nslcd
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Regular background program processing daemon
# Description:       cron is a standard UNIX program that runs user-specified
#                    programs at periodic scheduled times. vixie cron adds a
#                    number of features to the basic UNIX cron, including better
#                    security and more powerful configuration options.
### END INIT INFO

■なるほど。chkconfigでcronとoracle-xeの起動リストをチェック

$ sudo chkconfig --list cron oracle-xe
cron                      0:off  1:off  2:on   3:on   4:on   5:on   6:off
oracle-xe                 0:off  1:off  2:on   3:on   4:on   5:on   6:off

■各変数の意味はdebianの公式ページにあった。

 参考:How to LSBize an Init Script
 http://wiki.debian.org/LSBInitScripts

■以下にもありました。

 参考:Oracle 11g XEをUbuntuにインストール
 http://blog.liris.org/2011/09/oracle-11g-xeubuntu.html

■というわけで以下のように修正

$ sudo head -13 /etc/init.d/oracle-xe
#!/bin/bash
# Start/stop the oracle-xe daemon.
#
### BEGIN INIT INFO
# Provides:          oracle-xe
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Oracle 11g R2 Express Edition
# Description:       Enable service provided by root
#
### END INIT INFO

■今後は「update-rc.d」では無く、「insserv」を使うとの事なので、
 以下のようにします。

$ sudo /sbin/insserv -v oracle-xe
insserv: creating .depend.boot
insserv: creating .depend.start
insserv: creating .depend.stop

■おまけ

 コメント内には、「SS KK」が「80 05」となってますが、これはrpm用です。
 squeezeでは「K01」「S18」、lennyでは「K01」「S19」となっています。
 debianの場合は自動設定されます。(手動設定はしない方がよさそうです)

$ sudo grep chkconfig /etc/init.d/oracle-xe
# chkconfig: 2345 80 05

■debian系の「update-rc.d/insserv」について

 参考:Dependency based boot sequence
 http://wiki.debian.org/LSBInitScripts/DependencyBasedBoot

 ★squeeze(update-rc.d)
$ ls /etc/rc*/S*oracle-xe
/etc/rc2.d/S18oracle-xe  /etc/rc4.d/S18oracle-xe
/etc/rc3.d/S18oracle-xe  /etc/rc5.d/S18oracle-xe

$ sudo update-rc.d oracle-xe defaults 18 01
update-rc.d: using dependency based boot sequencing

 ★lenny(update-rc.d)
$  ls /etc/rc*/S*oracle-xe
/etc/rc2.d/S19oracle-xe  /etc/rc4.d/S19oracle-xe
/etc/rc3.d/S19oracle-xe  /etc/rc5.d/S19oracle-xe

$ sudo update-rc.d oracle-xe defaults 19 01
 System startup links for /etc/init.d/oracle-xe already exist.

 ★squeeze(insserv)
$ sudo /sbin/insserv -v oracle-xe
insserv: creating .depend.boot
insserv: creating .depend.start
insserv: creating .depend.stop

 ★lenny(insserv)
$ sudo /sbin/insserv oracle-xe
insserv: creating .depend.boot
insserv: creating .depend.start
insserv: creating .depend.stop

$ sudo /sbin/insserv -v oracle-xe 2>&1 | grep warning
insserv: warning: current start runlevel(s) (0) of script `halt' overwrites defaults (empty).
insserv: warning: current start runlevel(s) (0 6) of script `umountroot' overwrites defaults (empty).
insserv: warning: current start runlevel(s) (0 6) of script `sendsigs' overwrites defaults (empty).
insserv: warning: current start runlevel(s) (0 6) of script `umountfs' overwrites defaults (empty).
insserv: warning: current start runlevel(s) (6) of script `reboot' overwrites defaults (empty).
insserv: warning: current start runlevel(s) (0 6) of script `umountnfs.sh' overwrites defaults (empty).
■lennyについては上記の警告通り、空だった。

$ echo "halt umountroot sendsigs umountfs reboot umountnfs.sh" | \
  for list in `xargs`;do grep Default-Start /etc/init.d/"$list";done | uniq -c
      6 # Default-Start:

■cronの場合は以下のようになっている

$ grep Default-Start /etc/init.d/cron
# Default-Start:     2 3 4 5

■chkconfig で見てみると。。。

$ echo "halt umountroot sendsigs umountfs reboot umountnfs.sh" | \
  for list in `xargs`;do sudo chkconfig --list "$list";done | \
  sed s/"[0-6]:off"//g
halt                      0:on
umountroot                0:on
sendsigs                  0:on
umountfs                  0:on
reboot
umountnfs.sh              0:on

※試しにhaltスクリプトを「Default-Start:0」とすると、Warningが消えます。
 修正は不要ですので、無視します。

■ソースを探る。
 alianで変換したrpmパッケージなので、debian用のスクリプトが無いが、
 debian がポリシーに沿って自動的に割り当てているものなので
 変更する必要は無いようだ。

★ コメントにある「# chkconfig: 2345 80 05」を読み込んでいない。 

$ for list in postinst prerm ;do echo -n "$list :" ;grep chkconfig "$list";done
postinst :        /sbin/chkconfig --add oracle-xe
prerm :                /sbin/chkconfig --del oracle-xe

※debパッケージからのファイルの取得方法は以下の通り

$ ar -x oracle-xe_11.2.0-2_amd64.deb
$ tar zxvf control.tar.gz

★以下の通り、「/etc/SuSE-release」のようなdebian向けのスクリプトが無い。

$ sudo grep -A 1 -B 7 chkconfig postinst
if [ -f /etc/SuSE-release ]
then
        cp -f /u01/app/oracle/product/11.2.0/xe/config/scripts/oracle-xe.sles /etc/init.d/oracle-xe
        /usr/lib/lsb/install_initd /etc/init.d/oracle-xe > /dev/null 2>&1
        /sbin/insserv /etc/init.d/oracle-xe > /dev/null 2>&1
        /sbin/SuSEconfig > /dev/null 2>&1
else
        /sbin/chkconfig --add oracle-xe
fi

$ sudo grep -B 5 -A 1 chkconfig prerm
        if [ -f /etc/SuSE-release ]
        then
                /usr/lib/lsb/remove_initd /etc/init.d/oracle-xe > /dev/null 2>&1
                /sbin/SuSEconfig > /dev/null 2>&1
        else
                /sbin/chkconfig --del oracle-xe
        fi