[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:27672] Re: 起動スクリプトの変更



佐野@浜松です。

In <20010327153853.F34CACF37@xxxxxxxxxxxxxxxxxxxxxxxxx>,
  on "Wed, 28 Mar 2001 00:19:19 +0900',
   with "Re: 起動スクリプトの変更",
 Junichi Uekawa <dancer@xxxxxxxxxxxxx> さん wrote:

> まず,ポリシーは現状を追認するという立場にあることを確認して,

もともとはそうだったのですが、最近はそうとも言えないかも。

 FHS 移行の話もポリシーが先に変更されてしまって大多数の
パッケージが取り残された状態になっていたり、Build-Depends も
ポリシー優先で「乗り遅れた」大量のパッケージが massive BTS report の
標的にされたりと「ポリシーで決めてさえしまえばこっちのもの」的
行動が増えてきたような気がします。

たしかに筋から言えば debian-policy での議論に参加して異議があれば
その場で object すべきだし、FHS にしろ Build-Depends にしろ良い方向
への動きだとは思う (Build-Depends は auto-apt みたいなアプローチで
もうすこし自動化してくれると楽なのだけど) ので、個々の動きについて
異議申し立てをするつもりもありませんが、他のパッケージが構成を変更
した影響を受けて Build-Depends を変更しなければいけなくなったりとか
そういうのが増えてくると、だんだん「面倒だから早く orphan したいな」
「誰か take over してくれないかな」と思うことも増えてくるような気が
しないでもなかったり。

 version 3.5.2.0, 2001-02-18 の debian-policy には

     In this manual, the words _must_, _should_ and _may_, and the
     adjectives _required_, _recommended_ and _optional_, are used to
     distinguish the significance of the various guidelines in this policy
     document.  Packages that do not conform the the guidelines denoted by
     _must_ (or _required_) will generally not be considered acceptable for
     the Debian distribution.  Non-conformance with guidelines denoted by
     _should_ (or _recommended_) will generally be considered a bug, but
     will not necessarily render a package unsuitable for distribution.
     Guidelines denoted by _may_ (or _optional_) are truly optional and
     adherence is left to the maintainer's discretion.

     These classifications are roughly equivalent to the bug severities
     _important_ (for _must_ or _required_ directive violations), _normal_
     (for _should_ or _recommended_ directive violations) and _wishlist_
     (for _optional_ items).  [2]

と記載してあって、"_must_" "_required_" な基準を満たしていない場合は
ディストリビューションに含まれる資格が無いということになってます。

> さらに,
> 
> policy (3.5.2.0)の 10.3.3に
>                       update-rc.d <package> defaults >/dev/null
> 
> というのをpostinstにつっこめ,と書いてあるところを鑑み,
> 手元にあるスクリプトを全部調べたところ,
> 32 (grep update-rc.d *postinst| cut -d: -f1 | uniq -c | wc -l )
> 個あったうちの内訳は:
> 
> postinst の "$1"="configure"の場合だけupdate-rc.dを呼ぶ : 
>  acct apmd exim isapnptools libc6 netbase sysklogd
> postinst で 無条件にupdate-rc.dを呼ぶ : 
>  alsa-base apache at canna cron devfsd fetchmail gdm
>  gpm ifupdown kbd login lpr makedev nfs-user-server portmap ppp pppconfig
>  procps setserial ssh util-linux xfs-xtt
> postinstで無条件にLinkを自前で設定する: sysvinit
> 
> で,どれもすでに設定されている状況をチェックすると言うような事はやっていないように
> 見受けられます.update-rc.d defaultsを呼んでいます. 

これは既に <200103231053.TAA07155@xxxxxxxxxxxxxxxxx> で

 | > man update-rc.d には次の記述があります。
 | > >  ファイル /etc/rcrunlevel.d/[SK]??name がすでに存在する場合
 | > >  には、update-rc.d は何もしない。これは、システム管理者が
 | > >  ひとつでもリンクを残していた場合に、その設定を上書きされる
 | > >  ことがなく、別の場所に移動させることができるようにするため
 | > >  である。
 | > 
 | >  たぶん、postinstでは次の一行のみだと思うのです。
 | > >  update-rc.d package defaults >/dev/null
 | >  この場合、リンクはそのまま残ります。

と書かれていたように、update-rc.d コマンドの中で「既に設定されている
状況をチェック」しているからでしょう。

具体的には /usr/sbin/update-rc.d の

sub makelinks {
    my($t, $i);
    my @links;

    if (&checklinks) {
        print " System startup links for $initd/$bn already exist.\n";
        exit (0);
    }

このあたりですね。

メインのコードは

$_ = $ARGV[0];
if    (/^remove$/)       { &checklinks ("remove"); }
elsif (/^defaults$/)     { &defaults; &makelinks }
elsif (/^(start|stop)$/) { &startstop; &makelinks; }
else                     { &usage; }

exit (0);

となっていて defaults の場合も makelinks() が呼ばれますから、
上記の部分で checklinks() によってリンクが既に存在しているか
どうかチェックして、ひとつでも既にあればそこで exit 0 します。

リンクを全部消して動作させなくしたつもりだと、default の動作で
張り直されてしまいますが、Sxx を Kxx に変更して動作させなくした
場合や特定のランレベルで Sxx を Kxx に変更した場合などは
update-rc.d defaults を実行しても変更されません。

以前からこうなっていたかどうかはわかりませんが、cvs.debian.org で
調べた範囲ではすくなくとも 1999/1 には既にそうなっていたように
見えます。dpkg の changelog を見ると 1997 より前は sh script だった
とか perl のコードも現在とは別物だったとかいうことが書いてあるみたい
なので、もしかすると以前は現在と挙動が違っていたのかもしれません。

> dh_installinit はどうやら,無条件で postinst で update-rc.d を
> 呼ぶようになっているようです.ということで,postinstが実行される
> 時には,リンクはほぼ確実に破壊されるということになると思います.

ということで、この推定は間違いだと思います。

問題は、例えば現在の potato でたまたま手元にあったもので言うと

netbase.postinst:            update-rc.d -f networking remove >/dev/null 2>&1
netbase.postinst:        update-rc.d -f netbase remove >/dev/null 2>&1
util-linux.postinst:  update-rc.d -f hwclock.sh remove 2>/dev/null > /dev/null

のように postinst でリンクを削除しているパッケージです。

ただ、netbase のほうは設定ファイルの構成変更があったので
仕方が無いという面もありますね。-f netbase remove のほうは
 potato では不要になったファイルだし、-f networking remove は

  # only do this for people who were running unstable
  if dpkg --compare-versions "$2" ge 3.16-1; then
      echo "BUGFIX: Resetting runlevels at which /etc/init.d/networking is run."
      update-rc.d -f networking remove >/dev/null 2>&1
  fi

となっていて開発版のユーザだけに関係する BUG FIX だということを
表示するようにしています。

もっと問題なのは

#
#       Check if links to hwclock.sh are present in runlevel "6".
#       If not, remove the ones from runlevel "S" so that
#       update-rc.d will do it's job.
#
if [ ! -f /etc/rc6.d/???hwclock.sh ] && [ ! -f /etc/rc0.d/???hwclock.sh ]
then
        rm -f /etc/rcS.d/???hwclock.sh
fi

# hwclock does not work on PowerPC/PReP systems
if [ "$Arch" != "PReP" ]
then
  update-rc.d -f hwclock.sh remove 2>/dev/null > /dev/null
  update-rc.d hwclock.sh start 50 S . stop 25 0 6 . > /dev/null
fi

if [ -x /usr/sbin/update-mime ]; then
        update-mime
fi

を実行している util-linux のほうでしょうね。これだと確実に
リンクを破壊されます。ただ、モノが hwclock.sh という、ほぼ
確実に S 0 6 以外で起動させることは無いと考えられるものだから
特に問題とされることは無かったのではないかという気がします。

手元にある現在の開発版を見ると、他にもいくつか postinst で
 update-rc.d remove してるパッケージがありますが、上に挙げた
 netbase と util-linux を除けば、「以前は起動スクリプトだったが
現在は使われなくなったファイル」を削除するために使われている
ようです。

こういうのはリンクを操作しようが起動スクリプトを編集しようが
ローカルな設定を反映させるために手間を必要とする点は同じなので
どちらの対処でも大きな差異は無い、と言えるかもしれません。

> それはつまるところ,アップグレードするたびにリンクをはりなおす
> はめになるということなので,/etc/init.d 以下のスクリプトを
> いじりましょう,ということが結論として導きだされるようです.

たしか以前、リンクを変更したつもりがいつのまにか元に戻っていた
ということがあったような気がしたので設定ファイルを編集したほうが
いいかという気がしたのですが、単に起動するランレベルを変更する
だけなら Snn<name> を Knn<name> に、あるいはその逆にするという
対処のほうが楽かもしれませんね。

コマンドオプションの編集などについても、起動スクリプト自体は
編集しなくて良いように、デフォルト値をスクリプトに書いておいて
ユーザーがカスタマイズする場合は /etc/default/ 以下にファイルを
置いてデフォルト値を override できるようにするほうが望ましいと
いう話をどこかで見かけたような気もするし、むしろ conffile である
起動スクリプト自体はなるべく編集の必要が無いようにしようという
方向も Debian 的にはあるかもしれません。

-- 
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)