[% title = "Debian Packaging Manual - パッケージ管理スクリプトと インストールの手順" %]


[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ next ]


Debian Packaging Manual
Chapter 6 - パッケージ管理スクリプトと インストールの手順


6.1 パッケージ管理スクリプトの手引き

パッケージをインストール、アップグレード、削除する際に、 dpkg が走らせるスクリプトをパッケージの 一部として供給することが可能です。

これらのスクリプトはパッケージの制御エリア内にある preinstpostinstprermpostrm というファイルです。これらは適正な 実行可能ファイルでなくてはなりません。もし、これらが スクリプトで(スクリプトであることを推奨します。)あるならば、 通常行われているように #! で始めなくてはなりません。 これらのスクリプトは誰でも読むことが可能で、実行可能である 必要があり、誰にでも書き込み可能であってはいけません。

dpkg はこれらのスクリプトからの exit status を見ます。dpkg が手続きを止められるように、 エラーがあった場合にはスクリプトが 0 でない status で 終了することが重要です。シェルスクリプトでは ほとんど常に set -e を使う必要が あるということを意味します(実際には、 通常シェルスクリプトを書く場合は一般に、このようにします)。 もちろん、全てがうまくいった場合に、0 でない status で終了しないことも重要です。

エラー回復手続きをできるようにするため、スクリプトは同じ 状況にあるときに、それを何度か起動しても無害でなければ なりません。もし、一回目の呼び出しが失敗した、または何らかの 理由によって途中で中止した場合、二回目の呼び出しでは、 一回目で残されたものがあれば、それを単に実行し、 成功 status で終了しなくてはいけません。

パッケージがアップグレードされる時には、アップグレード手続きの 他の段階の間に古いパッケージと新しいパッケージのスクリプトが、 組み合わせて呼び出されます。もし、あなたのスクリプトが とても複雑になっていく場合には、このことに注意し、 スクリプトの引数のチェックが必要になるでしょう。

大まかに言えば、preinst (ある特定のバージョンの)パッケージがインストールされる前に、 postinst はインストールされた後に呼び出されます。 prerm は(あるバージョンの)パッケージが 削除される前に、postrm は削除された後に 呼び出されます。

管理スクリプトから呼ばれるプログラムは、通常、 そのスクリプトにおいてプログラムの前にパスをつけて呼び出しては いけません。インストールが始まる前に、dpkgldconfigstart-stop-daemoninstall-infoupdate-rc.dPATH 環境変数から発見できるかどうかをチェックします。 ですから、これらのプログラムや、PATH にあることを 期待してもいいようなプログラムについては、絶対パス名を つけずに呼び出するべきです。管理スクリプトは PATH をリセットしてはいけませんが、PATH の前か後に、 パッケージに対して特別なディレクトリを付け加えるという方法を 採るのはかまいません。このような考慮は、実際には、 全てのシェルスクリプトに対して当てはまるものです。


6.2 管理スクリプトの 呼び出され方の一覧


6.3 インストールやアップグレードでの ファイルの展開段階の詳細

インストール/アップグレード/上書き/消失(すなわち、 dpkg --unpack が走っているとき、または dpkg --install の展開段階のとき) の手続きは以下の通りになります。どのような場合においても、 もしエラーが起こればそこでの動作は、一般に逆方向へ 走らされます。これは、管理スクリプトが異なる引数で逆順に 走らされるということです。このような呼び出しは以下では 「エラー回復」呼び出しとして以下に記しています。

    1. 対象となるパッケージの、あるバージョンが既に インストールされている場合は次の呼び出しをします。

             old-prerm upgrade new-version
      
    1. もし、これがエラーとなったら (つまり、ゼロでない exit status であったら)、 dpkg はかわりに次の呼び出しをします。

             new-prerm failed-upgrade old-version
      

      上の両方の場合におけるエラー回復:

             old-postinst abort-upgrade new-version
      
  1. 「衝突する」パッケージが同時に削除される場合

    1. もし、その衝突するパッケージに依存する パッケージがあり、 --auto-deconfigure が 指定されているならば、そのようなそれぞれの パッケージについて、次の呼び出しを行います。

             deconfigured's-prerm deconfigure \
              in-favour package-being-installed version \
               removing conflicting-package version
      

      エラー回復:

             deconfigured's-postinst abort-deconfigure \
               in-favour package-being-installed-but-failed version \
                 removing conflicting-package version
      

      もし、--install が使われたら、 再設定可能な場合に再設定が行われるようにするため、 設定破棄されたパッケージには設定を要求する マークが付けられます。

    1. 衝突しているパッケージを削除するための準備として、 次の呼び出しが行われます。

             conflictor's-prerm remove in-favour package new-version
      

      エラー回復:

             conflictor's-postinst abort-remove \
               in-favour package new-version
      
    1. パッケージがアップグレードされる場合には、 次の呼び出しが行われます。

             new-preinst upgrade old-version
      
    1. そうではない場合、もし、そのパッケージの以前の バージョンからの設定ファイルがあった (すなわち「設定ファイルのみ」の状態にあった) ならば、次の呼び出しが行われます。

             new-preinst install old-version
      
    1. そうでもない (つまり、そのパッケージが完全排除されていた)場合、 次の呼び出しが行われます。

             new-preinst install
      

      それぞれに対するエラー回復:

             new-postrm abort-upgrade old-version
               new-postrm abort-install old-version
                 new-postrm abort-install
      
  1. 新しいパッケージのファイルが展開され、システムに 既にあるファイル、例えば同じパッケージの 古いバージョンからのファイルや、他のパッケージからの ファイルに上書きされます。(古いファイルの バックアップが残され、もし何か問題が起これば dpkg がエラー回復の一部としてそれらを 元に戻そうとします。)

    あるパッケージが、現在システムにある別のパッケージの ファイルと同名のファイルを含んでいる場合、 Replaces が指定されていない場合にはエラーに なります。(Replaces - ファイルの上書きとパッケージの置換, Section 8.5 を見てください。) 現在のところ --force-overwrite フラグが 有効にされており、このエラーは警告に格下げされています。 いつもこうであるわけではありません。

    パッケージにとってもっと深刻なエラーとなるのは, 他のパッケージからのディレクトリがある場所に, そのパッケージが普通のファイルやほかのディレクトリで ないような内容物を含んでいた場合です。 (ここでも、Replaces が使われていない場合に おいてです。)もし望むなら、 --force-overwrite-dir を使うことで このエラーを無効にすることができます。 しかしこれは勧められません。

    お互いのファイルに上書きするパッケージは、 決定論的に決まるのではあるけれども、システム管理者には 理解しがたい振る舞いをします。この状態では、 簡単にプログラムを「見失う」事態が起こり得ます。 例えば、他のパッケージからのファイルに上書きするような パッケージをインストールして、それから、そのパッケージを 削除することで起こります。 [19]

    ディレクトリは、決してディレクトリへの シッンボリックリンクに置き換わってしまうことが ありませんし、その逆もありません。そのかわりに、 現在ある状態(シンボリックリンクであるのか、 そうではないのか)は変化させず、もしシンボリックリンクが あれば dpkg はそれを追いかけます。

    1. もし、パッケージがアップグレードされている 最中なら、次の呼び出しを行います。

             old-postrm upgrade new-version
      
    1. もしこれに失敗したら、dpkg は次の呼び出しを試みます。

             new-postrm failed-upgrade old-version
      

      上の両方の場合におけるエラー回復:

             old-preinst abort-upgrade new-version
      

    ここが戻れなくなるポイントです。dpkg がさらに先に進むと、エラーがあった場合には このポイントより前には戻りません。この場合、パッケージが 非常に悪い状態で残ります。これをきれいにするためには、 再インストールを成功させる必要があります。ですが、 このときから、dpkg は戻ることの できない作業を始めることになります。

  1. 古いバージョンのパッケージにはあって、 新しいものには無いファイルは削除されます。

  1. ファイルリストが、古いものから新しいものに 置き換えられます。

  1. 新しい管理スクリプトが、古いものを置き換えます。

  1. あるパッケージに属するファイルが、インストールの間に 全て上書きされ、依存の要求も無いような場合、 そのパッケージは削除されたとみなされます。 そのようなパッケージそれぞれに対して、

    1. dpkg は次の呼び出しを行います。

             disappearer's-postrm disappear \
               overwriter overwriter-version
      
    1. パッケージ管理スクリプトが削除されます。

    1. パッケージ状態のデータベースには、正常な状態、 つまりインストールされていないものとして 記録されます。(そのパッケージが持っていた 設定ファイルがあれば、それは dpkg によって削除されるのではなく、無視されます。) dpkg は前もって、そのパッケージが 消失されそうなのか知らないので、消失される パッケージの prerm は 呼び出されないということに注意してください。

  1. 展開しようとしているパッケージの中にあって、 他のパッケージのファイルリストにも記されている全ての ファイルは、これらのリストから削除されます。 (これにより、もし「衝突する」パッケージがあれば、 その衝突するパッケージのファイルリストが修正されます。)

  1. 今までのインストール作業の中で作成されていた バックアップファイルを消去します。

  1. 新しいパッケージの状態は、今では正常になっていますので、 「展開」として記録されます。ここがもう一つの 戻れなくなるポイントです。もし衝突するパッケージの 削除に失敗したばあいでも,これから後の インストール作業を戻すようなことはしません。 衝突したパッケージは半分削除された亡霊状態で 残ってしまいます。

  1. もし衝突するパッケージがあれば、(これから示される) 削除作業へ移り、実行します。削除作業は衝突する パッケージのファイルを削除することから始まります。 (インストールされたパッケージの中にもあるファイルは、 すでに、衝突するパッケージのファイルリストから 削除されているので、今、削除されてしまうことは ありません。)


6.4 設定の詳細

パッケージを設定する(この状況は dpkg --install--configure により生じます)とき、 まず設定ファイルを更新し、それから次の呼び出しが行われます。

       postinst configure most-recently-configured-version

設定中にエラーが起こった後、回復は行われません。

もし設定されたバージョン(上の呼び出しの most-recently-configured-version) が存在しなければ、dpkg は引数に対して何も 渡しません。この場合に、古いバージョンの dpkg<unknown> (角括弧も含めて)を渡します。さらに古いバージョンの dpkg では、どのような状況においても二番目の 引数には何も渡しません。


6.5 削除と設定の完全削除の詳細

  1.        prerm remove
    
  1. パッケージのファイルを(設定ファイルを除いて)削除します。

  1.        postrm remove
    
  1. postrm 以外の管理スクリプトを全て削除します。

    もしパッケージを完全削除しているのでなければ、 ここで止まります。パッケージに postrm も設定ファイルもないのであれば、削除(remove) のときには dpkg の状態以外に違いが無いので、 自動的に完全削除されることに注意してください。

  1. 設定ファイルと全てのバックアップファイル (~ ファイル、#*# ファイル、 % ファイル、.dpkg-{old,new,tmp} など) が削除されます。

  1.        postrm purge
    
  1. パッケージのファイルリストが削除されます。

削除中にエラーが起こった後、回復は行われません。


[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ next ]


Debian Packaging Manual

version revision 1.13, 2000-08-22

Ian Jackson ijackson@gnu.ai.mit.edu
校正: David A. Morris bweaver@debian.org
メンテナー: Christian Schwarz schwarz@debian.org
メンテナー: Manoj Srivastava srivasta@debian.org
メンテナー: Julian Gilbey J.D.Gilbey@qmw.ac.uk
メンテナー: The Debian Policy group debian-policy@lists.debian.org
日本語版メンテナー: 早瀬 茂規 shayase@tky3.3web.ne.jp
日本語版校正: Japanese Debian Documentation Project debian-doc@debian.or.jp