%versiondata; ]> Debian ポリシーマニュアル バージョン &version;, &date; このマニュアルでは、Debian GNU/Linux ディストリビューションのポリシー (方針)、すなわち Debian に要求されるいくつかの必要条件について説明します。 このポリシーには、Debian アーカイブの構成と内容、オペレーティングシステムとしての Debian の設計に関するいくつかの事項に加えて、 それぞれのパッケージがディストリビューションに受け入れられるために満たさなければならない技術的な必要条件も含まれます。 Copyright © 1996,1997,1998 Ian Jackson and Christian Schwarz.

このマニュアルはフリーソフトウェアです。フリーソフトウェア財団発行の GNU 一般公有使用許諾書 (GPL) バージョン 2 が規定する条件の下での再配布および改変を許可します。 GPL に関しては、バージョン 2 以降のものであればどれを採用してもかまいません。

この文書は有用であるという期待の下に配布されていますが、 無保証です。 販売に、あるいは特定の目的に適するという保証は、明示されているか否かを問わず一切存在しません。 詳しくは GNU 一般公有使用許諾書をご覧下さい。

GNU 一般公有使用許諾書のコピーは、Debian GNU/Linux ディストリビューションでは /usr/share/common-licenses/GPL として、World Wide Web 上では GNU Public License として 入手可能です。また、Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. に請求しても手に入ります。

このマニュアルについて 扱う範囲

このマニュアルでは、Debian GNU/Linux ディストリビューションのポリシー (方針)、すなわち Debian に要求されるいくつかの必要条件について説明します。 このポリシーには、Debian アーカイブの構成と内容、オペレーティングシステムとしての Debian の設計に関するいくつかの事項に加えて、それぞれのパッケージがディストリビューションに受け入れられるために満たさなければならない技術的な必要条件も含まれます。

このマニュアルは Debian パッケージ作成に関連した形で Debian ポリシーを記載していますが、これはパッケージ作成手順を記載した手引きではなく、パッケージングシステムの挙動について網羅的に記載したものでもありません。 このマニュアルは、このような手引きというよりは、開発者が精通しておく必要のあるパッケージ管理システムとのインターフェースを規定することをねらったものです

非公式には、ここに収録される内容の選択基準は、次のどちらかに属していることです。 標準インターフェース

記載された内容はパッケージングシステムのインターフェースとして使うべきものであり、実際に多数のパッケージで使われており、従って綿密なレビューなしには変更するべきでないようなものである場合です。 そのような場合にはパッケージメンテナはインターフェースがころころ変わらないことを期待できますし、パッケージ管理ソフトウェアの作者はそのインターフェース定義への互換性を確認するだけですみます (コントロールファイルや changelog ファイル形式がその一例です)。

選ばれた取り決め

いくつか技術的には取りうる選択肢があり、相互互換性のためそのうちの一つを選ばなければならない場合です。 バージョン番号の形式などがその例です。

これらが相互に排他なものではないことに注意してください。選ばれた取り決めが標準インターフェースになることはしばしばあります。

このマニュアル中の脚注は単に説明のためのものであり、Debian ポリシーの一部ではありません。

このマニュアルでは しなければならないすべきであるしてもよい という語、および 必要な推奨されたオプションとして という形容詞はこのポリシー文書中の様々なガイドラインの重要度を示すために使われています。 しなければならない とされた、または 必要な とされたガイドラインに従っていないパッケージは一般的に Debian ディストリビューションに受け入れて配布することはできないと判断されます。 一方、すべきである または 推奨された ガイドライン への不適合は通常はバグと見なされますが、ディストリビューションと して配布不適合とまではされません。してもよい または オプションとして となっているガイドラインは本当にオプションであり、ガイドラインに従うかどうかはメンテナの判断に任されています。

この分類は大雑把に言って、バグ分類の serious (しなければならない必要な の部分に違反)、 minornormalimportant (すべきである または 推奨された の部分に違反)、wishlist (オプションとして の類)に相当しています

RFC 2119 参照。 但し、これらの単語は本文中で違ったやり方で使われています。

このマニュアルに載っている情報の多くは、Debian アーカイブへの収録以外の方法で配布するような、 あるいはお手元で使うだけで配布はしないといったパッケージを作成する際にも役に立つでしょう。

この文書の新しい版

この文書の最新版は常に Debian の FTP サーバ ftp.debian.org 上の /debian/doc/package-developer/policy.txt.gz (幾つかの他のフォーマットも同じディレクトリに用意されています: 具体的には、policy.html.tar.gzpolicy.pdf.gzpolicy.ps.gz です) あるいは Debian の WWW サーバ上の Debian ポリシーマニュアルページ として入手できます。

加えて、このマニュアルは Debian パッケージ debian-policy としても配布されています。

debian-policy にはこのドキュメントのバージョン間の変更を記載した upgrading-checklist.txt ファイルも含まれています。

作者とメンテナ

最初 "Debian GNU/Linux Policy Manual" という名であったこの文書は、 1996 年に Ian Jackson さんにより書かれました。最初の改訂は 1996-11-27 に David A. Morris さんによるもので、Christian Schwarz さんが 1997-03-15 に新たな章を加え、1997 年の 4 月から 7 月に掛けて手を入れてまとめ直しました。 Christoph Lameter さんが "Web Standard" の部分を作成しました。

1998 年 9 月以降は、この文書の内容の文責は debian-policy メーリングリストに移りました。 提案はそこで討議され、合意が得られた後ポリシーに追加されます。 Debian 用の policy パッケージは、ポリシー自体を編纂する権限は無い数人のメンテナによって管理されています。 現時点でのメンテナは次の通り: Julian Gilbey Branden Robinson Josip Rodin Manoj Srivastava

誤植その他のいかなる誤りも入れないよう、この文書の筆者たちは非常に努力しましたが、それでも間違いは生じます。 もしこの文書の内容に誤りを見つけたり、何らかの意見や提案、批評を私たちに伝えたいという場合には、Debian ポリシーメーリングリスト debian-policy@lists.debian.org まで電子メールをお送り頂くか、debian-policy パッケージに対してバグ報告を出して頂けると幸いです。

Policy の変更に関して、直接著者やポリシーマニュアルのメンテナに連絡しないでください。

日本語訳は、Debian-doc-jp メーリングリスト (八田、森本、かねこ、 早瀬、芳尾) によります。 この日本語訳に関するご意見ご感想は debian-doc メーリングリスト debian-doc@debian.or.jp までお送り下さい。

Debian アーカイブ

Debian GNU/Linux システムは パッケージ の集合体として 管理、配布されています。Debian には非常に数多くの (現在優に 6000 個以上の) パッケージが含まれますので、取り扱いを簡略化するためパッケージは セクションプライオリティ によって分類されています。

Debian プロジェクトはフリーなオペレーティングシステムの構築を目指して努力を重ねていますが、私たちが利用可能にしたいと思う全てのパッケージが私たちの定義に沿った フリー (詳しくは下記記載の をご覧下さい) なものとなっているわけではなく、また制限なしに輸出入ができるものともなっていません。 そこで、Debian アーカイブは更に mainnon-freecontribnon-US/mainnon-US/non-freenon-US/contrib の各セクションに分割されています。 これらのセクションについては以下で詳しく説明します。

Debian GNU/Linux ディストリビューション とは mainnon-US/main の二つのセクションをあわせたものです。

この二つ以外のセクションに収録されているパッケージは Debian ディストリビューションの一部とは見なされません。 しかしながら私たちはそれらのパッケージの使用を支援しますし、 またそれらに対するインフラストラクチャー (バグ追跡システムやメーリングリストなど) を提供します。 Debian ポリシーマニュアルの記述はこれらのパッケージにも適用されます。

パッケージの著作権とセクション

この節の意図は次のようなものです。

可能な限り多くのソフトウェアを利用可能にしたい。

すべての人に、フリーソフトウェアを書くことを奨励したい。

そして人々が私たちのシステムの CD-ROM を、いかなるライセンス、 輸出入制限、その他の法にも違反することなく簡単に制作できるようにしたい。

Debian フリーソフトウェアガイドライン

Debian フリーソフトウェアガイドライン (DFSG) は私たちが 「フリー」であると考えるソフトウェアの定義です。 自由な再配布

Debian を構成する個々の部分要素 (パッケージなど) のライセンスでは、その部分要素をいくつかの異なる出自を持つプログラムを複数含む集積されたソフトウェアの配布物の一部として、販売ないし無料で配布することを、いかなる個人または団体に対しても制限してはなりません。 このような販売に対してライセンスはロイヤリティーその他の料金を要求してはいけません。

ソースコード

プログラムはソースコードを含んでいなければならず、コンパイル済み形式の配布だけでなくソースコードの配布も許可しなければなりません。

派生物作成の許諾

ライセンスはソフトウェアの変更、およびその派生物の作成を許可しなければなりません。 また、それらがオリジナルのソフトウェアのライセンスと同じ配布条件の元で配布されることを許可しなければなりません。

作者のソースコードへの変更の制限と配布条件

プログラムをビルドする際にソースコードを変更するための 「パッチファイル」を、そのライセンスがソースコードと共に配布することを許可している場合に 限り、ライセンスは変更されたソースコードの配布を制限することができます。 この場合、ライセンスは変更されたソースコードからビルドされたソフトウェアの配布を明示的に許可していなければなりません。 ライセンスが派生物に対して、オリジナルのソフトウェアとは異なった名前ないしバージョン番号を冠することを要求することは認められます (これは妥協です。Debian プロジェクトではすべての作者にソース、バイナリを問わずいかなるファイルへの変更をも制限しないことを推奨しています)。

個人ないし団体に対する排斥の禁止

ライセンスはいかなる個人ないし個人からなる団体に対しても差別をしてはなりません。

使用分野に対する排斥の禁止

ライセンスは誰に対しても、プログラムをある特定の分野で使用することを制限してはなりません。 例えば、ライセンスでプログラムを商用で使用すること、または遺伝子研究に使うことを制限してはなりません。

ライセンスの配布時の均一性

プログラムに付属する諸権利は、そのプログラムが再配布されるすべての人びとに、その人びとによるライセンスの追加条項の履行を必要とせずに適用されなければなりません。

ライセンスは Debian においてのみ適用されるものであってはならない

プログラムに付属する諸権利はそのプログラムがある Debian システムの一部であるということに依存するものであってはなりません。 もしそのプログラムが Debian から取り出され、Debian 抜きで使用ないし配布されるとしても、そのプログラムのライセンスが定める条件の範囲内で扱われる限り、そのプログラムが再配布された全ての人びとは、Debian システムとの関連に基づいて認められていたのと同じ諸権利を有さなければなりません。

ライセンスは他のソフトウェアに影響を及ぼしてはならない

ライセンスはそのライセンスが適用されたソフトウェアと一緒に配布される他のソフトウェアに制限を設けてはなりません。 例えば、ライセンスは同じメディアで配布される他のプログラム全てがフリーソフトウェアであることを主張してはなりません。

ライセンスの例

「GPL」、「BSD」、「Artistic」ライセンスなどが 私たちが フリー であると見なすライセンスの例です。

main セクション

main および non-US/main に収録されるパッケージは全て DFSG (Debian フリーソフトウェアガイドライン) に準拠していなければなりません。

加えて、main に収録されるパッケージは

コンパイルおよび実行に main の範囲外のパッケージを必要としてはなりません (即ち、パッケージは main 以外に収録されたパッケージに「依存」や「推奨」や 「ビルド時依存」関係を宣言してはなりません)。

あまりにバグだらけで私たちがサポートすることを拒否するようなものであってはいけません。

このマニュアルで示されている全てのポリシー要求に適合していなければいけません。

同様に、non-US/main に収録されるパッケージは

コンパイルおよび実行に main または non-US/main の範囲外のパッケージを必要としてはなりません。

あまりにバグだらけで私たちがサポートすることを拒否するようなものであってはいけません。

このマニュアルで示されている全てのポリシー要求に適合していなければいけません。

contrib セクション

contrib および non-US/contrib に収録される全てのパッケージは DFSG に準拠していなければなりません。

これに加えて、contribnon-US/contrib のパッケージは

あまりにバグだらけで私たちがサポートすることを拒否するようなものであってはいけません。

このマニュアルで示されている全てのポリシー要求に適合していなければいけません。

更に、contrib のパッケージはコンパイルおよび実行に non-US セクションのパッケージを必要としてはなりません。

contrib または non-US/contrib に含められるようなパッケージの例としては

contrib または non-free に属するパッケージ、 またはそもそも私たちのアーカイブに存在しないパッケージを、コンパイル時または実行時に必要とするフリーなパッケージ。

非フリーなプログラム用のラッパーパッケージ、あるいは非フリーなプログラム向けのフリーな付属物など。

non-free セクション

DFSG に準拠していないパッケージ、または特許やその他の法的問題のために配布に問題のあるパッケージは non-free または non-US/non-free に収録しなければいけません。

これに加えて、non-freenon-US/non-free のパッケージは

あまりにバグだらけで私たちがサポートすることを拒否するようなものであってはいけません。

このマニュアルで示されている全てのポリシー要求に可能な限り適合していなければいけません

例えばソースが用意できない、などのパッケージが満たすことのできない要求があることは構いません。 これらの状況は個々に処置する必要があります。

non-US セクション

暗号に関わるプログラムコードを含むフリーでないプログラムは 「non-US」サーバに置く必要があります。 アメリカ合衆国がそのようなプログラムに対して輸出制限を加えているからです。

特許が取得されているアルゴリズムを使ったプログラムで、制限のあるライセンスを持つものも同様に「non-us」サーバに置く必要があります。 これは、この「non-us」サーバは、アルゴリズムに対して特許が許諾されない国に設置してあるためです。

non-us サーバ経由で配布されている他のパッケージに依存するパッケージも、同様に non-us サーバに置かなければいけません。

より突っ込んだ著作権に関する考察

全てのパッケージは、その著作権や配布ライセンスの無修正のコピーを /usr/share/doc/package/copyright ファイルとして同封して配布されなければなりません (詳細は を参照ください)。

私たちは、下記のような場合にファイルを私たちのアーカイブへ収録することを制限する権利を留保します。

その使用ないし配布が何らかの法に抵触する。

その配布や使用に道徳的な見解の相違がある。

私たちがライセンスに署名する必要がある。

その配布がプロジェクトの他の方針と矛盾する。

ユーザに対して、作者への寄付を奨励しているプログラムを main で配布することは、その作者が寄付をしないことを非道徳的であるとか、非倫理的であるとか、違法であるとか何かそれに類する主張をしていない限りなんら問題ありません。 そうでなければそのプログラムは non-free に分類しなければいけません。

その著作権認可表示が (あるいは特許問題によって) バイナリのみの再配布すら認めておらず、また特別な許可も得られていないプログラムのパッケージは、 Debian の FTP サイトにもそのミラーにも置いてはいけません。

国際著作権法 (これはアメリカ合衆国でも適用されます) の下では、 明確にそう示されていない限り、ある作品の配布や変更は 認められていない ことに注意してください。 著作権表記が明記されていないプログラムにも著作権は 存在する のであり、そのようなプログラムに何らかの形で 手を加えるということは、いつ訴えられてもおかしくないということです! 同様に、著作権は明記されているが何が許可されているか述べられていないプログラムでは、なにも許可されていないということに他なりません。

多くの作者は、制限のきつい著作権 (あるいは著作権表示の欠如) が彼らの、意図としてはフリーなはずだったソフトウェアのユーザにもたらす数々の問題について気がついていません。 そこで、そのような作者たちと連絡をとって丁重に交渉し、彼らのライセンス条項を変更してもらうよう頼むのは多くの場合やってみる価値があることです。 しかし、これは政治上難しいことの一つであり、まずは 以下記載のように debian-legal で助言を求めるべきでしょう。

もし著作権について疑問点があれば、 debian-legal@lists.debian.org にメールを出しましょう。 私たちに問題の著作権表示を提供できるよう準備しておいてください。 GPL で保護されたソフトウェア、パブリックドメインソフトウェア、そして BSD スタイルの著作権は問題ありません。 「商用利用は禁止」あるいは「配布に制限あり」といった言い回しに注意してください。

サブセクション

取り扱いを簡略化するため、maincontribnon-free の各セクションに含まれる全てのパッケージは更に サブセクション に分類されます。

それぞれのパッケージのセクションとサブセクションはパッケージの Section コントロールファイル (control record) で指定すべきです。但し、 Debian ディストリビューションとしての一貫性を保証するため Debian アーカイブの管理者がこの選択を上書きすることがあるかもしれません。 Section フィールドは以下の形式をとります:

subsection これはパッケージが main セクションに属する場合です。

section/subsection これはパッケージが contrib または non-free セクションに属する場合です。

non-US, non-US/contrib または non-US/non-free これらはパッケージが順に non-US/mainnon-US/contrib 及び non-US/non-free セクションに属する場合です。

Debian アーカイブメンテナがサブセクションの公式リストを提供します。 現時点では、それらは下記の通りです。 adminbasecommcontribdeveldoceditorselectronicsgamesgraphicshamradiointerpreterslibsmailmathmiscnetnewsnon-USnon-freeoldlibsotherosfsscienceshellssoundtextextutilswebx11

プライオリティ

それそれのパッケージには所定の プライオリティ (priority) 値が設定されているべきです。この値はパッケージの コントロールファイル に含まれています。この情報は Debian のパッケージ管理ツールがプライオリティの高いパッケージを重要性の低いパッケージから選別する際に用いられます。

Debian パッケージ管理システムが認識する priority の値 を下記に示します。 required

システムが適切に機能するために必要なパッケージです。 これらのパッケージを削除してはなりません。 万一削除してしまうとシステムは完全に動作不能となり dpkg で復旧することすら不可能になってしまいます。 required なパッケージのみのシステムはおそらく実用的ではないでしょうが、システム管理者がシステムを起動し、より多くのソフトウェアをインストールするに足るだけの機能は備えています。

important

どんな Unix ライクなシステムに於いても見つかることが期待されるような重要なプログラムはこのプライオリティに属します。 そのプログラムが欠けていることに気づいた時、Unix 経験豊富なユーザが「foo は一体全体どこだ?」と悪態をつくと思われるような場合には、それは important に含まれるべき

私たちは何にもましてまずフリーな Unix を創ろうとしているわけですから、これは重要な基準です。

です。それ無しではシステムが良好に動作しなかったり、 あるいは使い物にならないといった種類のパッケージもここに含められるべきです。 このカテゴリには Emacs、X ウィンドウシステム、TeX といった大規模なアプリケーションは 含まれませんimportant なパッケージには一般に存在が期待される、または必要といえるような、かつその最小の集合と考えられるツール類のみが含まれています。

standard

これらのパッケージはほどよく小規模ながらもあまり制限のきつくない、キャラクタベースのシステムを提供します。 このパッケージ群がユーザが何も他に選択しなかった場合、デフォルトでインストールされます。多くの大規模なアプリケーションは含まれません。

optional

(語の意味から言えば本来必要でないものはみんなオプション なのですが、ここでは違った意味内容を示します。) これは、そのパッケージが何か知らなくとも、また特殊な要求が無い場合にも、 とりあえずインストールしておく価値があると思われる全てのパッケージです。 これは X ウィンドウシステムや完全な TeX ディストリビューション、多くのアプリケーションを含み、ずっと大規模なシステムを構成します。 optional なパッケージは互いに conflict しないようにすべきです。

extra

プライオリティとして required、important、standard、optional のいずれかが指定されている他のパッケージと衝突するパッケージは全てこれに含まれます。 また、それが何なのかすでに知っている場合や、特段の要求事項がある場合にのみ有用であると考えられるパッケージ群もこのプライオリティに収録されます。

パッケージはそれよりも低いプライオリティ評価が与えられたパッケージに依存してはなりません (ビルド時の依存は除きます)。 これを保証するため、一つまたは複数のパッケージのプライオリティを調整しなければならない場合があります。

バイナリパッケージ

Debian GNU/Linux ディストリビューションは dpkg と呼ばれる Debian パッケージ管理システムに基礎を置いています。 このため、Debian ディストリビューションに含まれる全てのパッケージは .debファイル形式で提供されなければなりません。

パッケージ名

全てのパッケージは Debian アーカイブ内において重複しない名前を持っていなければなりません。

パッケージ名はアルファベット小文字 (a-z)、数字 (0-9)、プラス (+) 記号、マイナス (-) 記号、またはピリオド (.) のみで構成されていなければなりません。 少なくとも二文字以上で、英数字で始まっていなければいけません。

パッケージ名は .deb ファイルのファイル名の一部であり、 コントロールファイル中の制御フィールド情報に含まれます。

パッケージのメンテナ

全てのパッケージには一人または一グループの Debian メンテナ (一人の個人であっても、共通の一つのメールアドレス (たとえばメーリングリスト) で連絡の取れるグループであっても構いません) を持たなければなりません。 この人物は、そのパッケージが適切なディストリビューションに収録されていることに対する責任を持ちます。

Debian パッケージのメンテナは各パッケージの Maintainer 制御フィールドに、正しい名前と有効な電子メールアドレスの両方により指定されていなければなりません。 もしその人がいくつかのパッケージを管理している場合、個々のパッケージの Maintainer フィールドに異なった形式の名前と電子メールアドレスを記入することは避けるべきです。

もしあるパッケージのメンテナが Debian プロジェクトを辞めたなら、 誰か他の人がその仕事に志願するまで Debian QA グループ packages@qa.debian.org がパッケージの管理を引き継ぎます

これを丁寧に行うやり方の詳細は Debian Developer's Reference (開発者の手引き) に書かれています。この手引きは、 developers-reference パッケージ、または Debian FTP サーバ ftp.debian.org/debian/doc/package-developer/developers-reference.txt.gz そして ウェブページから入手できます。

。 このようなパッケージは orphaned パッケージ と呼ばれます。

パッケージの説明

全ての Debian パッケージには、コントロールファイル中の適切なフィールドに詳細な説明文が記入されていなければなりません。

説明文は、システム管理者がそのパッケージをインストールするかどうか決めるために知る必要があることを伝えられるように、書かれているべきです。 説明文はプログラムの説明文書をそのままコピーしただけのものとすべきではありません。 また、そのパッケージを設定したり使ったりするための解説を含めるべきではありません (それはインストールスクリプト、マニュアルページ、Info ファイルなどで扱われるべきです)。 著作権表示やその他管理に関係する種々のことも含まれるべきではありません。 それら向けには copyright ファイルが用意されています。

依存関係

全てのパッケージには、それが正しく動作するためにまず必要となる他のパッケージについての依存情報が指定されていなければなりません。

例えば、パッケージに含まれている、動的にリンクされた実行形式バイナリが必要とする共有ライブラリは、依存関係のエントリで明示していなければなりません。

但し、Essential (下記 参照) と指定されているパッケージに対してそれ以外のパッケージが依存関係を宣言する必要はありません。 また、そのようなパッケージの特定のバージョンに依存しているのでなければ、依存関係を宣言すべきではありません。

時々、あるパッケージが、それをインストールする前にもう一つのパッケージがインストールされ かつ 設定されていることを必要とすることがあります。 この場合、そのパッケージには Pre-Depends エントリを指定しなければなりません。

debian-devel メーリングリストで議論して同意が得られる前に、パッケージに Pre-Depends エントリを指定するべきではありません。

仮想パッケージ

多かれ少なかれ同じような仕事をこなすパッケージがいくつか存在するということがあります。 この場合、パッケージが持つ共通の機能を説明する名前の 仮想パッケージ を定義するのが便利です (仮想パッケージは論理的に存在するだけで、物理的には存在しません。 これがそれらが 仮想 と呼ばれる理由です)。 特定の機能を持つこういったパッケージ群は皆仮想パッケージを 提供 します。 そうしておけば、その機能を必要とする他のパッケージは単にその仮想パッケージに依存するようにすれば、 可能性のある全てのパッケージをいちいち列挙しなくても良いわけです。

全てのパッケージはそうするのが適当なときには仮想パッケージ名を使うべきで、もし必要ならば新しい仮想パッケージ名を作るようにしなければなりません。 但し、同意が得られ、仮想パッケージ名の一覧に掲載されるまで、新しい仮想パッケージ名を使うべきではありません (非公式に、互いに関連する一群のパッケージの間で使う場合は除く)。 この項に関しては、 を参照下さい。

正式な仮想パッケージ名の一覧の最新版は ftp.debian.org/debian/doc/package-developer/virtual-package-names-list.txt か、このサイトのお近くのミラーで見つかります。加えて、 この一覧は debian-policy パッケージにも含まれています。 このリストを更新するための手続きについてはこの一覧ファイルのはじめに記述されています。

Base システム

base システムは、新しいシステムに於いて他の全てに先だってインストールされる、 Debian GNU/Linux システムの最小のサブセットを形成します。 従って、必要となるディスク使用量を非常に小さく保つため、ほんの数パッケージのみが base セクションへの収録を認められています。

これらのパッケージのほとんどは、プライオリティ評価が required であるか、少なくとも important です。また、それらの大半には essential 指定 (下記 参照) が付加されているでしょう。

Essential パッケージ

いくつかのパッケージには Essential 指定が付加されています (それらパッケージのコントロールファイル中で Essential: yes という指定がされている)。 このフラグはシステムにとって 不可欠な パッケージに用いられます。

これらのパッケージは簡単には削除できません (削除するには dpkg に特別な 強制オプション を指定しなければならない) ので、このフラグはどうしても必要な場合にのみ使うようにしなければなりません。 共有ライブラリのパッケージに Essential 指定をしてはいけません。 依存関係により誤った削除を阻止できますし、新しいものに入れ替える際には上書きできるようになっている必要があるからです。

dpkg は Essential パッケージが未設定な状態でも他のパッケージのアップグレードを止めることはありませんので、 Essential パッケージはすべて、未設定状態でも基本機能はすべて提供している必要があります。 あるパッケージがこの条件を満たせない場合にはこのパッケージに Essential 指定を行ってはいけませんし、そのパッケージに依存する他のパッケージは明示的に適切な依存関係フィールドを与えなければいけません。

debian-devel メーリングリストで議論して同意が得られない限り、パッケージに Essential 指定を付加してはなりません。

タスク (Tasks)

Debian のインストールプロセスでは、ユーザに Debian システムを使うに当たって多数の一般的な用途の中から選択できるようになっています。 tasksel プログラムを使ってこの用途 (タスク) を選択すると、そのタスクを行う上で役に立つ一連のパッケージがインストールされます。

この一連のパッケージは、全てパッケージの制御ファイルの Task フィールドに選択したタスク名をもつパッケージです。 このフィールドのフォーマットは、タスクをカンマで区切って列挙したものです。

前もって debian-devel メーリングリストで議論して、収録の合意が得られるまでは、 パッケージをあるタスクに属させるという指定をすべきではありません。

サードパーティ向け (及び歴史的経緯のある場合) には、tasksel は タスクパッケージ (task package) によるタスクの作成をサポートしています。これらは名前が task- で始まるパッケージです。タスクパッケージは Debian アーカイブに収録すべきではありません。

メンテナスクリプト

パッケージのインストールスクリプトでは、ユーザにとって見る必要がない情報を出力することを避けるべきです。 また、大量のパッケージをインストールする際にユーザが退屈するのを避けるのも、dpkg に任せておくべきです。 中でも、install-info を使うときは --quiet オプションを使いましょう。

インストールスクリプトの実行中に起こったエラーはチェックしなければなりませんし、インストールはエラーの後実行を続けてはなりません。

全体として の内容はパッケージのメンテナスクリプトにも適用されます。

あるパッケージのメンテナと協議せずに、そのパッケージに属するファイルを置き換えるべく dpkg-divert を使うべきではありません。

「共通の」コマンド名 (あるいは、一般的にファイル名) の具体的な実装を提供するすべてのパッケージは update-alternatives を使って同時に (複数の実装が) インストールできるようにすべきです。 (まだ) update-alternatives を使っていない、このような共有コマンド名を提供する他のパッケージを強制的にインストール解除するためには Conflicts を使わなければいけません (この場合に限って、以前の update-alternatives を使っていなかったバージョンに対する Conflict を指定してもかまいません。 これはこのようなバージョン競合の指定を許さない一般則への例外とします)。

メンテナスクリプト中のプロンプト使用について

パッケージメンテナスクリプトは必要に応じてプロンプトを使ってユーザに入力を促すことができます。 プロンプト表示は自分で作成しても良く、Debian 設定管理仕様の第二版以降に準拠したプログラム (例えば debconf) を介して行っても構いません Debian 設定管理仕様の第二版は、debian-policy パッケージの debconf_specification ファイル中に含まれています。 また、FTP サイト ftp.debian.org/debian/doc/package-developer/debconf_specification.txt.gz にも置かれています

現時点で 4 % の Debian パッケージがインストール時に debconf を使っています [ name="Debconf stats">]。 またその数は毎日増加しています。debconf を使う利点は に簡単に説明されていますが、事前の設定が可能なこと、ほとんど対話の必要のないインストールが可能なこと、 不必要なプロンプトを避けられること、一貫したユーザインターフェースを実現できることなどがあげられましょう。

debconf を使ったパッケージ数の増加と、Debian 設定管理システムの第二版 (cdebconf) もまだ初期段階ですが出てきたこと、 そしてこれらが使っているプロトコルが安定してきたことから、 今回の時点でこれらの用法についてポリシーに取り込むことにしました。

Debian 設定管理仕様を用いるパッケージには制御アーカイブ中に追加で config スクリプトと templates ファイルを含めることができます。 config は、preinst の前、かつパッケージがアンパックされる前、かつ 依存関係 (dependency) および先行依存関係 (pre-dependency) が満たされる前に走ることがありますので、 Essential パッケージに属するツールのみを

初期設定が始まるまでに Debian 設定管理仕様を満たす Debconf や他のツールもインストールされていて、 それらからのバージョン指定の依存関係がある場合、それがあらかじめ満たされている必要があります。

使う必要があります。

パッケージはそれらが必要とする質問の量を最小化するよう努力するべきです。 また、パッケージはユーザにそれぞれの質問を一回だけ聞くようになっていることを確認しておくべきです。 噛み砕いて言うと、パッケージはそれ自身が必要とする一連の情報のために毎回質問するのではなく、 適切な共有の設定ファイル (例えば /etc/papersize/etc/news/server のような) や debconf 共有変数を使うように努力するべきであるということです。

これはまた、アップグレード時に、ユーザが dpkg --purge を用いてそのパッケージの設定を削除するよう指定していない限り、同じ質問を二度するべきではないということも意味します。 設定の質問の答えはユーザが変更できるよう /etc 内の適切な場所に保存されていなければならず、またこれがどうされたかは文書化されているべきです。

もしそのパッケージがユーザに知らせなければならない非常に重要な情報を持っているとしたら (例えば「このままで実行しないでください。下記の設定ファイルを最初に編集しないと、 あなたのシステムがぐちゃぐちゃなメッセージを吐き出してしまう危険があります」) その情報は config または postinst スクリプトにて表示し、ユーザにリターンキーを押して承認するよう質問するべきです。 著作権表示は極めて重要なものとは見なされません (それらは /usr/share/doc/パッケージ名/copyright に収録してください)。 プログラムの使い方の説明もこの種の情報ではありません (これらはオンライン文書として全てのユーザが読めるよう収録されるべきです)。

どんな必要な質問も、たいていの場合は configpostinst スクリプトからに限られるべきです。 そして質問が postinst 中で行われていた場合、パッケージのインストールが失敗して postinstabort-upgradeabort-remove、あるいは abort-deconfigure を引数として呼ばれたときには不必要な質問をしないよう、条件式によって必要以外の時に呼ばれないようにされているべきです。

ソースパッケージ 基準への準拠

ソースパッケージの Standards-Version フィールドに、あなたのパッケージが最後の更新の際パッケージのコンパイルで準拠した最新のパッケージング基準のバージョンを指定すべきです。 現在のバージョン番号は &version; です。

この情報は、あなたのパッケージがあまりにも旧式になってしまったときに自動的にバグレポートが提出されるのに使われます。

バージョンナンバーはメジャー及びマイナーバージョン番号、さらにメジャー及びマイナーパッチレベルの 4 つの数字からなります。 全てのパッケージに渡って変更がなされる場合にはメジャーバージョンを変更します。 多くのパッケージに修正作業が必要な重要な変更の場合には、マイナーバージョンを変更することによってそれを示します。 パッチレベルについては、小さい変更であっても、それが基準の変更を伴う場合にはメジャーパッチレベルの変更となります。 マイナーパッチレベルの変更となるのは、表面上の変更、文書上の修正など意味合いの変化の無い場合、またパッケージの内容に関して影響を与えない場合になります。

従ってマニュアルバージョンのうち最初の 3 つの数字が一般的なバージョンとしての意味を持ちます。 この数字を 3 つにするか 4 つ全てを使ってバージョンを規定するかは、オプション

以前はバージョンを指定するのに、`2.3.0.0' という様に常に 全バージョン番号で表していましたが、最終桁のパッチレベルの変更は新しいポリシー内容を新規に導入するのではないため、 厳格なポリシーをゆるめて最初の 3 つの数字、この例では `2.3.0' でバージョンを示すようにしたほうが、より良いだろうと思われるからです。 ただし、4 つ使いたければ使ってもかまいません。

です。

常に最新のポリシーマニュアルをチェックしておきましょう。 あなたが過去にパッケージしたものがあって、それが古くなってしまっているなら特に必要です。 その上で必要があればパッケージのアップデートを行って下さい。 あなたのパッケージが新しい基準

この文書の各版の間でポリシーにどのような変更が加えられたかについては upgrading-checklist ファイルを参照ください。

に則った際には、ソースパッケージの Standards-Version を変更してリリースするべきです。

パッケージ同士の依存関係

ソースパッケージには、ビルドするためにインストールされていなければならない、またはインストールされていてはいけないようなバイナリパッケージが明記されているべきです。 例えば特定のコンパイラでないとビルドができない場合、ビルド時依存としてそのコンパイラが指定されているべきです。

しかしコンパイルに最小限必要なパッケージ (例えば C や C++ で書かれた "Hello World!" のようなプログラムをコンパイル、リンクし、 Debian パッケージ化するために必要なもの) までビルド時依存のものとして指定する必要はありません。 このような場合に必要となるパッケージは build-essential と呼ばれ、build-essential パッケージに収録されているファイル /usr/share/doc/build-essential/list

原則の解説:

これによって、このリストはポリシー関連文書とは別に管理されます (このリストはポリシー関連文書に必要な厳密な管理を行う必要はないので)。

独立パッケージにすることによってあるマシンに build-essential なパッケージを依存関係によってインストールすることができますし、同時に他のパッケージ (例えばタスク) から build-essential パッケージのインストールを同様に依存関係によって要求することができます。

また、これは独立したパッケージとしての管理を行っていますので、このパッケージのバグレポートの管理は BTS を使ったポリシー管理プロセスとは分けて考える必要があります。

にリストアップされています。

ビルド時依存のパッケージを指定する場合、目的のパッケージをビルドするのに直接必要であるもののみをリストアップするべきです。 ビルド時依存として挙げたパッケージが依存しているという理由でパッケージを列挙する必要はありません

これは、依存関係は変化するものですし、そしてあなたは 自分 が直接必要なもの だけ を列挙するべきだからです。他のパッケージはその人達の責任です。 例えば、libimlib だけにリンクしたいならば、ビルド時依存を libimlib2-dev に指定する必要がありますが、 libjpeg* パッケージに指定する必要はありません。これは libimlib2-dev が現在 libjpeg* に依存していても同じです。 libimlib2-dev パッケージをインストールすることで、実行時の依存関係が満たされることは自動的に保証されます。

ビルド時の依存関係が指定されている場合、essential パッケージ、build-essential パッケージ、及び依存関係を満たすためのパッケージが全て (それらのパッケージが依存している物も含めて) 揃っているシステムでパッケージのビルドができなければいけません。 このことは、依存関係が正しく満たされている場合に、間違っていたり矛盾を含んだパッケージを作り出さないよう、ビルド時依存に対するバージョン番号が厳密に指定されるべきであることを意味します。

アップストリームのソースへの変更

ソースコードへの変更が Debian システムでの固有の必要によるものでないなら、アップストリームの作者にその作者たちが望む形でその変更を含めることができるよう、その変更を送るべきです。

パッケージを Debian もしくは Linux 向けに修正する必要があり、 アップストリームのソースがそれを行う手段を提供していない場合、 そのような手段を追加すべきです。(例えば autoconf によるテストや #define 等) そしてデフォルトが修正前と同じになっているようなパッチをアップストリームの作者に送ります。 そうすれば簡単にあなたの debian/rules かどこか適当なところでデフォルトを置き換えることができます。

configure ユーティリティには正しくアーキテクチャを指定できる文字列を検出させるようにすべきです (具体的には を参照)。

もし、GNU の configure スクリプトが作る Makefile を修正する必要にせまられた場合、直接 Makefile に手を加えずに .in ファイルを変更しましょう。 こうすることでユーザーによるパッケージの再ビルドが可能となります。 あなたが configure を行い、 その後 Makefile を変更すれば、だれもそのあとでパッケージの再ビルドができなくなってしまいます。

あなたがソースパッケージに加えた変更や更新は、 debian/changelog ファイルに適切に記述しておくべきです。 詳細は、 を参照下さい。

makefile でのエラーを捕捉する

make が makefile (あなたのパッケージの上流が用意した makefile も debian/rules も含む) で指定されたコマンドを呼び出す際には、sh を使います。 このため、sh のエラー処理の出来が悪いという欠点が露呈してしまいます。 あなたの makefile に、そこから呼び出されるコマンドの一つとして小さなスクリプトが含まれている場合、 もし適切に手を打たなければエラーは何も検出されず、make は問題が起こった後ものんきに処理を続けてしまうでしょう。

一つ以上のシェルコマンド (これにはループの使用も該当します) を makefile 内のコマンドとして使うときにはいつでも、 エラーが捕捉されているかどうか確かめなければなりません。 ディレクトリを移ってあるプログラムを実行する、というような単純な複合コマンドでは、コマンドセパレータとしてセミコロンを使うのではなく、 && でつなげば十分でしょう。 多くのループや条件式といったより複雑なコマンド群に対しては、 実際にはこれらの小さなシェルスクリプトの一つを呼び出している makefile コマンドのそれぞれの先頭に独立した set -e を含めるべきです。

時代遅れになった構成物やライブラリの取り扱い

インクルードファイル <varargs.h> は非常に古いソフトウェアをコンパイルするエンドユーザをサポートするために提供されています。 また、libtermcap ライブラリはすでにそれに対してリンクされてしまっているソフトウェア (古いプログラムか、あるいは Netscape のようにバイナリ形式でしか入手できないもののどちらか) の実行をサポートするために提供されています。

Debian 用パッケージは、上記ファイルではなく <stdarg.h>ncurses を使うように変更されるべきです。

コントロールファイルと、その各フィールド

パッケージマネージメント関連の多くのツールは、コントロールデータ として知られている共通のフォーマットのデータを操作します。 このデータは多くの場合、コントロールファイル 中に格納されます。 バイナリおよびソースパッケージはコントロールファイルを持っています。 また、アップロードされたファイルのディストリビューションへのインストールを制御する .changes ファイルもコントロールファイルと同じ形式を持っています。 また、dpkg の内部のデータベースも同様のフォーマットです。

コントロールファイルの書式

コントロールファイルは、一つ以上のフィールドのパラグラフで構成されます。 パラグラフは、空白行によって分けられます。 いくつかのコントロールファイルは、一つのパラグラフのみを許します。 また別の場合には複数個を許しますが、その場合にそれぞれのパラグラフが異なるパッケージを参照することがしばしばあります (例えば、ソースパッケージでは最初のパラグラフはソースパッケージを示し、以降のパラグラフではソースから生成されるバイナリパッケージを示します)。

各パラグラフは、一連のフィールドと値からなります。 各フィールドは、フィールド名と、それに続くコロン、そのフィールドのデータないしは値から構成されます。 フィールドは行末で終了します。 水平方向の空白 (スペース、およびタブ) は、値の前後に置くことができ、無視されます。 コロンの後で一文字の空白を入れることは、慣行となっています。 例えば、フィールドは以下のようなものです。 Package: libc6 この場合、フィールド名は Package で、フィールドの値は libc6 です。

いくつかのフィールドの値は、複数の行に及ぶかもしれません。 その場合それぞれの継続行は空白またはタブで始まっていなければ いけません。 フィールド値の各行の終わりに続く空白およびタブは無視されます。

明確にそう記載されている場合を除いて、フィールド本体中のデータは一行のみが許され、空白は意味を持ちません。 パッケージ、アーキテクチャ、ファイルまたは他のものを示す名前中に空白を入れることはできません。 また、バージョン番号または、複数文字のバージョン関係を示す文字間に空白を入れることもできません。

フィールド名には、大/小文字の区別はありません。 しかし、慣習的に下記に記載のように大文字小文字を混ぜて用い、適宜大文字にするのが普通です。

空白行、あるいはスペースとタブだけを含む行はフィールド値の中、およびフィールド間では許されません。それは、新しいパラグラフを意味することになります。

フィールドのリスト

ここで記載されたリストは網羅的なものではありません。 殆どのフィールドはこの文書の他の部分で扱われています。

Package

バイナリパッケージの名前です。 パッケージ名はアルファベット小文字 (a-z)、数字 (0-9)、プラス (+) 記号、マイナス (-) 記号、あるいは ピリオド (.) でのみ構成されていなければなりません。

パッケージ名は少なくとも二文字で、英数字から始まっていなければいけません。 作成しようとしているパッケージ (または他フィールドで参照しているもの) に既に大文字が含まれている場合を除いては、すべて小文字のパッケージ名を使わなければいけません。

Version

これは、バイナリパッケージのバージョン番号です。 を参照ください。

Standards-Version

あなたのパッケージが準拠したパッケージング基準 (ポリシーマニュアルと関連の文書) の最新バージョンを記載します。 これはソースパッケージを最新の標準に準拠するよう編集する際に手で修正する必要があります。 時には、パッケージのチェックを行う必要があることを知らせるのにも使えます。 このフォーマットはこの文書中に記載されています。 の項を参照ください。

Distribution

.changes ファイル、または構文解析された changelog の出力のこのフィールドには、このパッケージがインストールされていた、 またはこれからインストールされるディストリビューションの名前が (複数ある場合は空白で区切られて) 含まれます 現在、ディストリビューションの取り得る値は stable

これは、現在の Debian GNU/Linux のリリースバージョンです。 ディストリビューションが、stable (安定版) になった後は、セキュリティ修正と大きなバグフィックスだけが許されます。 このディストリビューションに変更が加えられるときは、リリース番号が増えます (例えば、1.2r1 は 1.2r2 になり、1.2r3 になります)。

unstable

このディストリビューションは、Debian の配布ツリーの中で、開発中 のものであるということを示します。 新しいパッケージおよびパッケージの上流の最新のバージョン、バグフィックスは、この unstable へ収録されます。 自己責任においてダウンロードしてください。

testing

このディストリビューション名は Debian のディストリビューションのうち、テスト 中の部分を示します。このディストリビューションでは unstable ディストリビューションからのパッケージを、unstable 中で大きな問題が発生しないことを確認する短い猶予期間をおいて、受け入れます。 これは unstable よりは問題が起こる可能性は少ないでしょうが、危険性は残っています。 パッケージを直接 testing にアップロードすることはできません。

frozen

潮時を見て testing ディストリビューションは stable としてリリースするための準備のため、 `code-freeze' 状態に移行します。 この期間は現時点ですでに分かっていたり、新たに発見されたバグの修正のみ許されます。 この段階の詳細はリリースマネージャが決定します。

experimental

このディストリビューションのパッケージは、メンテナから、ハイリスクであると宣言されています。 しばしば、様々な出所の初期のβ版や開発中のパッケージであって、メンテナとしては他の人に試してほしいと考えてはいるものの、Debian の他のディストリビューションに含めてよいだけの完成度ではないものが含まれています。 自己責任においてダウンロードしてください。

このフィールドには、そのパッケージがインストールされる、すべて のディストリビューションを列挙しなければいけません。 。 有効なディストリビューションの名前は、アーカイブメンテナが決定します。

Version 番号付け

全てのパッケージは、コントロールファイルの Version フィールドにバージョン番号を持っています。

パッケージ管理システムはバージョン番号に従った順序付けを行い、 これによってパッケージがアップグレードされるのか、 あるいはダウングレードされるのかを知ることができ、 さらにパッケージフロントエンドプログラムが、 あるパッケージがシステムにインストールされているものよりも新しいものかどうかを判断することができるようになります。 バージョン番号の形式は (比較に関する限り) 重要なものが前にくる順となっています。

バージョン番号のフォーマットは、 [epoch:]upstream_version[-debian_revision] です。

バージョンを構成する 3 つの要素は epoch

これは一桁の符号なし整数です。普通は小さい数になるはずです。 ゼロと仮定して良い場合は省略できます。省略した時には、 upstream_version にコロンを含めてはいけません。

これはパッケージの古いバージョンのバージョン番号の誤りを許したり、 パッケージの以前のバージョン番号体系をそのままに残しておくためにあります。

upstream_version

これがバージョン番号の主要部分です。通常支障ない場合は .deb ファイルが作られたオリジナルの (`上流の') パッケージのバージョン番号になります。 普通は上流の作者によって定められたものと同じ形式になりますが、 パッケージ管理システムと比較手法に沿って修正を加えなければならないかもしれません。

upstream_version に関するパッケージ管理システムの比較の挙動については次節で述べます。 バージョン番号中で、この upstream_version の部分は必須です。

upstream_version は英数字

英数字は A-Za-z0-9 のみです。

と文字 . + - : (ピリオド、プラス、ハイフン、コロン) だけから構成されており、数字で始まるようにすべきです。 ただし、debian_revision がない場合、ハイフンは許されません。 また、epoch がない場合、コロンは許されません。

debian_revision

バージョンのこの部分は、そのパッケージを Debian バイナリパッケージにするためにほどこした修正のバージョン番号を表わしています。 これは英数字と +. (プラスとピリオド) の二記号のみからなり、upstream_version と同じやり方で比較されます。

この部分はオプションです。 debian-revision を持たない場合には、 upstream-version はハイフンを含んでいてはいけません。 この debian-revision を持たない形式のものは Debian バイナリパッケージになるように特別に書かれたソフトウェアであることを示しています。 そのようなソフトウェアの『Debian化』は一つだけですから、レビジョンの追加は必要ありません。

upstream_version が増加するたびに、 debian_revision1 に戻すのが慣習となっています。

パッケージ管理システムは文字列中の最後のハイフン (あれば) のところでバージョン番号を upstream_versiondebian_revision とに分割しようとします。 debian_revision がないものは、それがあるものより以前のものであるとして比較されます (ここでの記載に関わらず、debian_revision はバージョン番号の最下位部分であることに注意して下さい)。

upstream_versiondebian_revision の部分はパッケージ管理システムから同じアルゴリズムを用いて比較されます。

文字列は左から右へと比較されます。

最初に、比較対象となる2つの文字列の中で、全て非数字で構成される最初の部分を決定します。 両方の文字列に対する、この数字でない部分 (そのうちの一つは空であっても構いません) を辞書順で比較します。 もし違いが見つかれば、それを返します。 ここでの辞書順とは、すべての文字が非文字より先に来る様に修正した ASCII 順です。

次に、二つの文字列の残りの部分から、全て数字で構成される最初の部分を決定します。 この二つの数値を比較し、比較結果として見つかった違いを返します。 このとき、空文字列 (比較している一方もしくは双方のバージョン文字列の末尾においてのみ生じる) は 0 として数えます。

違いが見つかるか、双方の文字列を調べ尽くすかするまで、この二つのステップを (先頭から、最初の非数字の文字列と最初の数字の文字列を比較し、切り離しながら) 繰り返します。

epoch の目的はバージョン番号付けのミスをそのままにできるようにするため、またバージョン番号の付け方を変更した場合にそれをうまく扱えるようにするためだということに注意してください。 パッケージ管理システムが解釈することのできない文字 (ALPHApre- など) から成る文字列を含むバージョン番号や、思慮の浅い順序付け (このマニュアルの著者は、1.11.21.312.12.22 とバージョンが進んでいったパッケージのことを聞いたことがあります) をうまく処理するためでは ありません

もし上流のパッケージが問題のあるバージョン番号形式になっているならば、 Version フィールドではまともな形式に変換すべきです。

日付に基づくバージョン番号

一般的に、Debian パッケージは上流ソースと同じバージョン番号を使うべきです。

しかし、上流のバージョン番号が日付に基づくような場合 (例えば、開発中の `snapshot' リリースの場合) には、パッケージ管理システムはこのようなバージョン番号を epoch を使わずに扱うことはできません。 例えば、dpkg は `96May01' を `96Dec24' よりも大きいと判断するでしょう。

そのような場合に、今後の新しい上流バージョンに対して epoch を使わなくて済むようにするためには、バージョン番号を `19960501'、 `19961224' といった書式に変更すべきです。 上流のメンテナに、上流のバージョン番号も変更するようにお願いするかどうかはメンテナ次第です。

日付に基づいた、このほかのバージョン番号の書式がパッケージ管理システムによって正しく解析されるなら、そのバージョン番号を変更 すべきでない ことに注意して下さい。

Debian 固有のパッケージ (つまり、Debian 向けに特別に書かれたパッケージ) のバージョン番号に日付を含めるならば、 常に `YYYYMMDD' という書式を使うべきです。

パッケージング時の考慮点 タイムスタンプ

メンテナは可能な限り上流のソースファイルファイルの更新時刻をパッケージ中で変更しないでおくべきです

タイムスタンプを保持する理由付けとしては、ファイルの作成時間を知ることによって伝わる情報があるからです。 例えば、ある文書の修正時間を見ることによって、それが非常に古いものであることを知ることができる、などです。 ですから、上流のソースの修正時間を保持しておくのはとても良いことです。

debian/rules - メインのビルドスクリプト

このファイルは実行可能な makefile で、ソースからパッケージをコンパイルしバイナリパッケージをビルドするためのパッケージ特有のレシピを含んでいなければいけません。

このファイルの先頭は #!/usr/bin/make -f という行で始まっていなければなりません。 make を明示的に実行するのではなく、`debian/rules' という名前で実行できるようにする為です。

対話型の debian/rules スクリプトは、そのパッケージの自動コンパイルを不可能にし、さらにメンテナー以外の人が同じバイナリパッケージを再ビルドする作業を困難にします。 ですから、全ての 必要なターゲット は非対話的でなくてはなりません。 最小限の範囲で言えば、必要なターゲットとは、dpkg-buildpackage から呼び出されるターゲット、つまり cleanbinarybinary-archbinary-indepbuild のことです。 また、これらのターゲットが依存するターゲットも非対話的なものでなければいけません。

定義が必要なターゲット、およびオプションのターゲットは次の通りです。 build, build-arch (optional), build-indep (optional)

build ターゲットはパッケージの構築 (ビルド)、すなわち全てのパッケージの非対話的な設定とコンパイルを行ないます。 もしパッケージに対話型のビルド前の設定ルーチンがある場合は、Debian 化されたソースパッケージは設定作業を行なった後でビルドするか (これは、設定を再びせずにバイナリパッケージをビルド出来るようにするためです)、設定ルーチンを非対話型になるように変更しなければいけません。 アーキテクチャ固有の機能の検出が設定ルーチンで行われるようになっている場合は、後者の方が適切です。

いくつかのパッケージでは、同一のソースツリーからコンパイルのやり方を変えることで異なった二つのバイナリパッケージを生成する場合があります。 build ターゲットは、そういう場合には対応できません。 これらの場合では、それぞれのビルド方法に対応した二つまたはそれ以上のターゲット (build-abuild-b やその他) と、何も実行しない build ターゲットを用意するのがよいでしょう。 この場合は binary ターゲットで、各々のやり方でパッケージをビルドして、それぞれに対応したバイナリパッケージを生成することになります。

ルート権限が必要なことを build ターゲットで実行してはいけません。

また、build ターゲットの実行前には、clean ターゲットを実行しなければならないでしょう。 以降の節を参照ください。

パッケージの設定やビルドルーチンに長い時間がかかる時や、makefile があまり良く設計されていない時、 または build の前に clean の実行が必要な時、ビルドプロセスの終了時に touch build を実行しておくのがよいでしょう。 これによって、debian/rules build が再度実行されたときに、プログラム全体を再ビルドしなくてすみます

同様のことを行う際によく使われている別法に、 buildbuild-stamp に依存し、かつ何もしないようにしておき、 build-stamp で実際のビルド処理と touch build-stamp を終了時に実行するようにするやり方があります。 これは、ビルドルーチンが build という名のファイルやディレクトリを作成するようになっている場合、特に有効です。 この場合、build は偽ターゲットとして登録 (具体的には、.PHONY への依存関係を定義します) しておく必要があります。偽ターゲットの詳細については、 make のドキュメントを参照ください。

binary, binary-arch, binary-indep

binary ターゲットは、ユーザがこれだけでソースパッケージから生成されるバイナリパッケージ (複数のこともあります) をビルドできるようなものでなければいけません。 これらのすべてのターゲットは、非対話的に動作するものでなければなりません。 binary ターゲットは、二つの部分に分けられます: binary-arch は、特定のアーキテクチャ用のファイル、 binary-indep は、それ以外のものを生成します。

binary は、コマンドなしで単純に binary-archbinary-indep に依存するようなパッケージであることは許されますし、また普通のパッケージではそのようになっています。

両方の binary-* ターゲットは、 build ターゲット、あるいは build-arch または build-indep がある場合にはいずれかの適切なほうに依存すべきです。 このようにしておけば、もしパッケージビルド処理が済んでいないときはビルド処理が実施されます。 そしてその後 dpkg-gencontrol を使ってコントロールファイルを作成し、dpkg-deb でビルドを行って関連したバイナリパッケージを生成し、それをトップレベルディレクトリの親ディレクトリ中に置くべきです。

binary-archbinary-indep の両方のターゲットが 存在しなければいけません。 このうち一方がなにも作成するものがない場合でも (アーキテクチャ依存、非依存に関わらずソースから一つのバイナリパッケージしか生成しない場合がこれに当たります) 、両方のターゲットが存在しなければなりませんし、また処理が成功したという扱いにしなければなりません。

binary ターゲットは、ルート権限で起動されなければ

たいていの場合、fakeroot パッケージを使えばルートにならずともパッケージを正しくビルドできます。

いけません。

clean

buildbinary ターゲットによる実行結果を元に戻します。 ただし、binary ターゲットの実行により親ディレクトリに作成された出力ファイルはそのまま残します。 このターゲットは、非対話的でなければいけません。

前の項で述べたように、build ファイルが build ターゲット処理の最後に touch されて作成されていた場合、そのファイルは、clean の最初の作業として削除するべきです。 中断された clean の後に build が実行された場合、すべてが終了したと認識されてしまいかねないからです。

build ターゲットがルート権限で実行された後、及び binary ターゲットが実行された後には、clean ターゲットはルート権限で起動する必要があるかもしれません (例えば、build はディレクトリを作成することもあるからです)。

get-orig-source (optional)

主要なアーカイブサイトから最新版のオリジナルソースパッケージを取得します (FTP や WWW経由)。 これをオリジナルのソースの tar ファイル形式 (下記参照) に再構成し、現在のディレクトリに置きます。

このターゲットは、どのディレクトリからも実行しても構いません。 また残した一時ファイルを削除するよう気を遣うべきです。

このターゲットはオプションです。 しかしできる限りつけた方がよいでしょう。

The buildbinary 及び clean ターゲットはパッケージのトップディレクトリをカレントディレクトリとして実行されなければいけません。

公開されている、またはいないインターフェースのためや、パッケージ内部で使用するために debian/rules に他のターゲットを置くことは許されます。

パッケージを実際にビルドするマシンや、インストールの対象となるマシンのアーキテクチャは、dpkg-architecture を使って make 変数を設定することによって決定されます。 これにより、ホストマシン (パッケージの作成対象としているマシンタイプ) だけでなくパッケージのビルドをするマシン (ビルド作業に使っているマシン) の Debian 形式のアーキテクチャと GNU 形式のアーキテクチャ指定文字列を得ることができます。 次に、サポートされている make 変数を示します。

DEB_*_ARCH (Debian 形式のアーキテクチャ)

DEB_*_GNU_TYPE (GNU 形式アーキテクチャ指定文字列)

DEB_*_GNU_CPU (DEB_*_GNU_TYPE の CPU の部分)

DEB_*_GNU_SYSTEM (DEB_*_GNU_TYPE の システムの部分)

*BUILDHOST のどちらかです。 BUILD の場合はパッケージをビルドするマシンの指定になり、 HOST の場合にはホストマシンの指定になります。

rules ファイル中で必要な変数に適切な標準値を設定することによって、後方互換性を保つことができます。 詳しくは dpkg-architecture のドキュメントを参照して下さい。

DEB_*_ARCH は、ビルドするまたはビルド対象となるマシンの Debian アーキテクチャのみを決定するのだということを理解しておくことは重要です。 CPU や システムの情報を得るのにこれを使ってはいけません。 その場合には GNU 書式の変数を使わなくてはいけません。

debian/changelog (変更履歴)

このファイルは、パッケージの Debian 特有の部分の変更を

changelog の著者がパッケージの保守担当者でもある場合、パッケージの全ての変更に対してこの changelog を使うようにすることもできますが、その場合にはパッケージや元のソースの保守担当者が違う人になった時には、名前を変更しなければなりません。 但し、そのような場合にはそのパッケージを Debian 向けのパッケージとはせずに保守した方がより良いでしょう。

記録します。

このファイルは特別な書式を持っています。これは、パッケージのどのバージョンを現在ビルド中なのか、及びその他のリリース特有の情報を、パッケージビルドツールが認識できるようにするためです。

この書式は次に示すものがひとつらなりになったものです。 パッケージ名 (バージョン) ディストリビューション; urgency=緊急度

[空行を入れてもよい。出力からは削除されます]

* 変更内容 変更内容の続き

[空行を入れてもよい。この部分の空行は dpkg-parsechangelog の出力に含まれます]

* また別の変更内容

[空行を入れてもよい。出力からは削除されます]

-- メンテナ名 <電子メールアドレス>[空白二個]日付

packageversion は ソースパッケージの名前とバージョンです。

distribution(s) には、このバージョンがアップロードされるときにインストールされるディストリビューションがリストされます - これらは、.changes ファイルの Distribution フィールド にコピーされます。 をご覧ください。

urgency は、アップロード時の .changes ファイルの Urgency フィールドとして使われる値です。 コンマを含む値を使用することはできません。 dpkg の changelog フォーマットでは、コンマは keyword=value の各設定を分離するために使用されています (しかしながら、現在のところ keywordとして有効なものは urgency

urgency のとりうる値は lowmediumhighemergency です。 これはパッケージをどのぐらい急いで testing ディストリビューションに含めないといけないかの判断基準になり、またこのアップロードで含まれている修正の重要性を示唆する効果を持ちます。

だけです)。

詳細な変更点は、実際には最低二つのスペースではじまる一連の行に記されていればいいのですが、 慣習的に各変更箇所はアスタリスクと分離のためのスペースで始め、継続行はインデントし、はじめの箇所が分かるような文章にしておきます。 望むのであれば、一連の変更箇所を分離するのに空行が使用できます。

このアップロードがバグトラッキングシステム (BTS) で記録されたバグを修正するものならば、changelog 中に closes: Bug#nnnnn

より正確には、以下の Perl 正規表現にマッチするような文字列です。 /closes:\s*(?:bug)?\#?\s?\d+(?:,\s*(?:bug)?\#?\s?\d+)*/i

上記の正規表現では $pound 変数を使わざるを得ませんでした。 これは、そのようにしなければポリシー文書を処理するユーティリティがバックスラッシュ付きの "#" で目を回すためです。

列挙された一つまたは複数のバグ番号はアーカイブメンテナスクリプト (katie) で閉じられるか、NMU の場合には fixed とのマークが付けられます。

の文字列を含めることで、パッケージが Debian アーカイブに収録された時点でバグが自動的に閉じられます。

changelog ファイルに記載するメンテナの名前と電子メールアドレスは この バージョンをアップロードした人について記されているべきです。 必ずしも通常のパッケージ管理者である必要は ありません。 ここでの情報は、.changes ファイルの Changed-By フィールドにコピーされ、その後アップロードの完了時に通知を送るために使用します。

日付 は RFC822 フォーマット

これは 822-date プログラムで作成します。

訳注: RFC2822 参照。

にすべきです。 このフォーマットは、数字によって表現されたタイムゾーンを含むべきで、 オプションとしてかっこに入ったコメントの形でタイムゾーン名かその省略形を付加することができます。

パッケージ名ではじまる最初の `タイトル' の行は、左詰めにすべきです。 それに続く管理者、日付フィールドの詳細は正確に一つのスペースからはじめるべきです。 管理者の詳細と日付フィールドは、正確に二つのスペースによって区切られていなければいけません。

changelog の別書式の定義

使用したい書式のパーサを用意することで、標準的でない書式を使用することが可能です。

changelog パーサはユーザとの対話的処理を一切行ってはなりません。

debian/substvars と変数置換

dpkg-gencontroldpkg-genchanges 及び dpkg-source がコントロールファイルを生成するとき、 出力に書きこむ前に変数置換を行います。 変数置換は ${変数名} の書式を持ちます。 オプションであるファイルの debian/substvars 中に使用する変数置換定義を記載します。 また、変数置換はソースをパッケージするコマンドに -V オプションを指定することによって、直接 debian/rules から設定することもでき、同時に先行定義されている変数も使用できます。

debian/substvars ファイルは通常 debian/rules ターゲットによって生成され、動的に変更されます。 このようなやり方を採った場合には clean ターゲットによって削除しておかなければいけません。

debian/substvars のフォーマットを含んだソースの変数置換の詳細については、 をご覧ください。

debian/files

このファイルは、ソースツリーの恒常的な部分ではありません。 これはパッケージをビルドする途中、どのファイルが生成されたのかを記録するのに用いられます。 dpkg-genchanges は、.changes ファイルを生成するときにこれを用います。

これはアップロードされるソースパッケージに含めるべきではありません。 そして、それら (およびすべてのバックアップファイルと一時ファイル、例えば、files.new

files.newdpkg-gencontroldpkg-distaddfile が一時的なファイルとして使います。 エラーが起こったときに壊れたファイルをそのまま残しておかないようにするため、新しいバージョンの files を一旦このファイルに書き出し、その後でファイル名を変えます。

) は、clean ターゲットによって削除すべきです。また、 binary ターゲットのスタート時には、これらのファイルを、 削除するか空にして新しいスタートを確認することはよいやり方です。

dpkg-gencontrol をバイナリパッケージのため実行した際に、これは dpkg-deb --build をバイナリパッケージ作成のため実行した場合に作成される .deb のためのエントリを debian/files に追加します。 このため、たいていのパッケージが、 このファイルに関してやらなければいけないことは、clean ターゲットによって削除することだけです。

アップロードするべきファイルが、ソースパッケージと、 dpkg-gencontrol によってコントロールファイルが生成されたバイナリパッケージ以外のファイルを含んでいるときは、 それらのファイルはパッケージのトップ階層ディレクトリの親ディレクトリに置かれるべきです。 そして、debian/files のリストにファイルを追加するために dpkg-distaddfile を呼ぶようにすべきです。 ソースパッケージに含まれるものに対する制限

ソースパッケージには、ハードリンク

現在、ソースパッケージのビルド中にハードリンクは検出されず、 ソースパッケージの展開時にのみ検出されます。

将来、ハードリンクが許されるようになるかもしれませんが、 それにはまだ多くの作業が必要となります。

、デバイスファイル、ソケットファイル、及び setuid や setgid されたファイル

setgid されたディレクトリーは許されます。

が含まれていてはいけません。

パッケージの説明 - Description フィールド

説明文 (description) フィールドの内容は、プログラムに関する説明であり それまで使用したことのないプログラムをインストールするかどうかの 判断を助けることをねらったものです。パッケージ間の重要な依存関係 (dependency) や競合関係 (conflict) の情報も示されているべきです。 そうでないと、ユーザにはなぜ競合関係や依存関係の不具合が起きているのかが分かりません。

説明文を書く際の留意点

一行による要約は簡潔にすべきです。半角換算で 80 文字以下としてください。

パッケージ名を要約 (Synopsis) の行に入れないでください。 入れなくても、表示ソフトウェアはパッケージ名を自動的に表示するようになっています。 多くの場合、ユーザの目に ふれるのはこの要約行だけなので、なるべく分かりやすい要約にするようにしてください。

上記の一行要約からそのまま引き続いて説明文に続ける形を取らないでください。 これは説明文の全体が表示されている時にうまくいきませんし、 また要約 (一行の) のみが表示されているときには意味をなしません。

詳細の解説部分はそのパッケージ自体の説明、(例えば、このパッケージが Debian システム全体の中の、どの部分集合に属しているのか) について記します。

説明文は誰でも、例えばそのパッケージが扱っている分野のことを何も知らない人でも理解できるように

そのプログラムにもともと付いているアナウンスや README をそのままこの説明文に使用可能な ことはほとんどありません。通常これらの文章は そのソフトウェアがどの場面で使われているのかすでに知っている ユーザコミュニティ向けに書かれています。

書かなければいけません。

要約行および詳細の解説部分、これら両者において重要な情報を最初に持ってきてください。 実際の表示時に、要約行または詳細の解説部分の一部しか表示されないことがあるためです。 もっともそういう場合には、詳細の解説部分全体を表示することができるようになっていることを期待するのはかまいません。

もし望むならば、依存関係などの情報も説明文中に含ませることができます。

タブは使用しないでください。どういう動作をするか分かりません。

パッケージ管理スクリプトとインストールの手順 パッケージ管理スクリプトへの手引き

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

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

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

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

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

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

メンテナスクリプトの再入結果の同一性

メンテナスクリプトが再入結果の同一性をもつようにすることはとても重要です。

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

これがそうあるべきなのは、ユーザからの dpkg への割り込みや、他の予測できない状況が発生した際に dpkg が処理を再実行しようとした場合、ひどく壊れたパッケージを残さないようにするためです。

です。

メンテナスクリプトからのターミナルの制御

メンテナスクリプトは制御ターミナルがある状態で実行されており、ユーザとの対話ができることが保証されています。 パスワードの入力を求めたり、全画面を使った対話などを行いたい場合には /dev/tty を介して行うべきです。これは dpkg がある時点ではスクリプトの標準入出力をリダイレクトしてインストール作業のログを採っていることがあるためです。 同様に、スクリプトがログ採取の目的のため標準出力をパイプでリダイレクトしている場合があるため、Perl スクリプトでは出力がバッファされず直接出力されるように $|=1 と設定してバッファなし出力モードにすべきです。

各スクリプトは成功の場合には終了ステータスを 0 に、失敗の場合には 0 でない値にして帰ってください。

メンテナスクリプトの呼ばれ方のまとめ

new-preinst install

new-preinst install old-version

new-preinst upgrade old-version

old-preinst abort-upgrade new-version

postinst configure most-recently-configured-version

old-postinst abort-upgrade new-version

conflictor's-postinst abort-remove in-favour package new-version

deconfigured's-postinst abort-deconfigure in-favour failed-install-package version removing conflicting-package version

prerm remove

old-prerm upgrade new-version

new-prerm failed-upgrade old-version

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

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

postrm remove

postrm purge

old-postrm upgrade new-version

new-postrm failed-upgrade old-version

new-postrm abort-install

new-postrm abort-install old-version

new-postrm abort-upgrade old-version

disappearer's-postrm disappear overwriter overwriter-version

インストール時とアップグレート時のパッケージの展開段階の詳細

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

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

もし、これがエラーとなったら (つまり、 ゼロでない終了ステータスであったら)、 dpkg はかわりに次の呼び出しをします。 new-prerm failed-upgrade old-version 上の両方の場合におけるエラー回復は、次の通りです。 old-postinst abort-upgrade new-version

「衝突する (conflicting)」パッケージが同時に削除される場合には

もし、その衝突するパッケージに依存するパッケージがあり、 --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 が使われたばあいに再設定可能としておくため、 設定破棄 (deconfigured) されたパッケージには設定を要求するマークが付けられます。

衝突しているパッケージを削除するための準備として、次の呼び出しが行われます。 conflictor's-prerm remove \ in-favour package new-version conflictor's-prerm remove in-favour package new-version このときのエラー回復は conflictor's-postinst abort-remove \ in-favour package new-version です。

パッケージがアップグレードされる場合には、次の呼び出しが行われます。 new-preinst upgrade old-version

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

そうでもない (つまり、そのパッケージが完全削除されていた) 場合、次の呼び出しが行われます。 new-preinst install このときのエラー回復は、順に new-postrm abort-upgrade old-version new-postrm abort-install old-version new-postrm abort-install です。

新しいパッケージのファイルが展開され、システムに既にあるファイル、例えば同じパッケージの古いバージョンからのファイルや、 他のパッケージからのファイルに上書きされます 古いファイルのバックアップが一時的に保持され、もし何か問題が起こればパッケージ管理システムがエラー回復の一部としてそれらを元に戻そうとします。

あるパッケージが、現在システムにある別のパッケージの ファイルと同名のファイルを含んでいる場合、Replaces ( 参照) が指定されていない場合にはエラーになります。

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

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

問題のうちの一部は、おそらく、dpkg のバグとされている挙動のためです。

が起こります。

ディレクトリは、決してディレクトリへのシンボリックリンクに置き換わってしまうことはありませんし、その逆もありません。 そのかわりに、現在ある状態 (シンボリックリンクであるのか否か) はそのままにされて、シンボリックリンクの場合 dpkg はそのリンクをたどります。

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

もしこれに失敗したら、dpkg は次の呼び出しを試みます。 new-postrm failed-upgrade old-version 上の両方の場合におけるエラー回復は old-preinst abort-upgrade new-version です。

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

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

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

新しいメンテナスクリプトで、古いものを置き換えます。

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

dpkg は次の呼び出しを行います。 disappearer's-postrm disappear \ overwriter overwriter-version

パッケージ管理スクリプトが削除されます。

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

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

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

新しいパッケージの状態は、今では正常になっていますので、「展開」として記録されます。

ここが次の戻れなくなるポイントです。 もし衝突するパッケージの削除に失敗したばあいでも、これから後のインストール作業を戻すようなことはしません。 衝突したパッケージは半分削除された亡霊状態で残ってしまいます。

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

設定の詳細

パッケージを設定する (この状況は dpkg --installdpkg --configure で起きます) とき、まず conffile を更新し、それから次の呼び出しが行われます。 postinst configure most-recently-configured-version

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

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

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

prerm remove

パッケージのファイルを (conffile 群を除いて) 削除します。

postrm remove

postrm 以外のメンテナスクリプトを全て削除します。

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

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

postrm purge

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

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

パッケージ間の関連性の宣言

各パッケージは、そのコントロールファイルの中で、 同時にインストールすることができないパッケージや、 他のパッケージの存在に依存していたり、 特定の他のパッケージが存在している場合そのファイルを上書きするなど、 特定の他パッケージとの関連づけを宣言することができます。

この宣言には、コントロールファイルの DependsPre-DependsRecommendsSuggestsEnhancesConflictsProvides 及び Replaces フィールドを使用します。

ソースパッケージは、バイナリパッケージとの関連を宣言しても構いません。 バイナリパッケージとの関連とは、そのパッケージのビルド時に、 あるバイナリパッケージがインストールされている必要があること、 またはシステムに存在してはならないことを示すものです。

この宣言には、コントロールファイルの Build-DependsBuild-Depends-IndepBuild-Conflicts 及び Build-Conflicts-Indep フィールドを使用します。

関係性フィールドの書式

これらのフィールドは統一的な書式を持ちます。 それはコンマで区切られたパッケージ名のリストです。

パッケージの DependsRecommendsSuggestsPre-DependsBuild-Depends 及び Build-Depends-Indep の各コントロールファイルフィールド (他のパッケージに依存関係がある場合に宣言するフィールド) 内に記述するパッケージ名は、代替パッケージ名の一覧でも構いません。 代替パッケージ名は、 垂直バーシンボル | (パイプシンボル) で区切って書きます。 この場合、任意の代替パッケージの一つがインストールされていればこの部分の依存関係は満たされているものと判断されます。

Provides 以外のすべてのフィールドでは、パッケージ名ごとにそのバージョンを指定することができます。 その指定は、各パッケージ名の後に続く括弧の中で行なわれ、その括弧の中には、下記の一覧で示される (バージョン番号の) 関係を表す記号と、それに続いて で記載された書式に従ったバージョン番号を、記述します。

バージョン番号の関係を示すために使用する記号は、<<<==>= 及び >> で、順に「より小さい」「以下」「等しい」「以上」「より大きい」 を意味しています。既に廃止になった記号の書式 <> はそれぞれ「以下」「以上」 という意味であって、「より小さい」または「より大きい」 という意味ではありません。新しいパッケージでは、 <> は使うべきではありません (dpkg はまだこの書式をサポートしてはいます)。

空白は、 での規定に従って バージョン設定のどの部分に入れてもかまいません。また、 必要ならば空白を挿入してあいまいさを取りのぞかなければいけません。 ただし、空白にそれ以上の意味はありません。 なお、データの一貫性や、将来の dpkg の変更を見越して、 バージョン関係記号の後ろ、つまりバージョン番号の前に、空白を一ついれることを推奨します。 慣行として、コンマのあとに空白を一つ入れ、パイプシンボル「|」 の両側にも空白を入れます。また、開括弧の前にも空白を一つ入れます。

依存関係のリストの例を次に示します。 Package: mutt Version: 1.3.17-1 Depends: libc6 (>= 2.2.1), exim | mail-transport-agent

ビルド時のパッケージ間の関連を示す全てのフィールド (Build-DependsBuild-Depends-IndepBuild-Conflicts 及び Build-Conflicts-Indep) は、ある特定のアーキテクチャのセットに限定してもかまいません。 これは、それぞれのパッケージ名とオプションのバージョン指定の後に、 角括弧ではさんで指定します。角括弧のなかには、空白で区切られた Debian アーキテクチャの名前のリストを入れます。感嘆符 (!) を一つまたは複数の各アーキテクチャ名の前に置くこともできます (一部の名前に感嘆符を置き、他の名前に置かない、という指定は許されません)。 もし、現在の Debian ホストのアーキテクチャがこのリストに無く、感嘆符のついた指定も無い場合、もしくは感嘆符付きでこのリスト中にある場合には、 そのパッケージ名とバージョン指定はパッケージ間の関連を定義するためには使われず、完全に無視されます。

例を次に示します。 Source: glibc Build-Depends-Indep: texinfo Build-Depends: kernel-headers-2.2.10 [!hurd-i386], hurd-dev [hurd-i386], gnumach-dev [hurd-i386]

注意してほしいのは、バイナリパッケージの依存関係、例えば Depends など、はコントロールファイルのうちの一つのバイナリパッケージセクションで指定され、一方構築時の依存関係、例えば Build-Depends はコントロールファイルのソースパッケージセクション (最初のセクションです) で指定されることです。

バイナリの依存関係 - DependsRecommendsSuggestsEnhancesPre-Depends

これらの五つのフィールドはあるパッケージと他のパッケージとの依存関係を宣言するために使用します。 これらのフィールドは、Enhances を除いて依存する側のパッケージのコントロールファイルの中に記述されます。 Enhances は推奨される側のパッケージのコントロールファイルに記述されます。

Depends フィールドはパッケージを 設定する時にだけ 有効です。この依存関係の宣言は、依存関係を満たさないパッケージが、 未設定な状態でシステム中にインストールされることを妨げません。 すでに依存関係が満たされ、正しくインストールされているパッケージを、 依存関係の満たされていない、または満たせ得ないような別のバージョンのパッケージで置き換えることもできます。 この場合は、未設定のまま (設定しようとするとエラーが返りますので) ですので、当然正しく動作しないでしょう。 必要に応じ、パッケージが展開されていない場合にも部分的に有効な Pre-Depends 宣言を使うことができます。 これについては以降の節で詳しく説明します。その他の三つの依存関係、 RecommendsSuggestsEnhancesdpkg の各種フロントエンド (例えば dselect) だけが使います。

このため、最初のインストール時にはすべてのパッケージがまず展開されて、その後すべてのパッケージを設定 (configure) します。 こうすることによって、現存のシステムに存在しない、 新しいバージョンのパッケージに依存関係を宣言している新しいパッケージの依存関係を満たすことができます。

このように、Depends フィールドによって、パッケージのメンテナはパッケージの設定順序を指定できます。

五つの依存関係フィールドの意味は下記の通りです。 Depends

これは、完全に依存するパッケージを宣言します。 パッケージは Depends に列挙されたパッケージのすべてが正しく設定されていなければ設定できません。

Depends フィールドは依存する側のパッケージが、 その主要な機能を提供するために依存される側のパッケージが必要になる場合に指定するべきです。

Dependspostinstprerm 及び postrm の各スクリプトを実行するために特定のパッケージが必要になる場合にも指定すべきです。 但し、postrmpurge の際には Essential でないパッケージに依存することはできません。

Recommends

強い依存関係だけれども、絶対というほどではない依存関係の場合に宣言します。

この Recommends フィールドには、特別な場合でないかぎり一緒に使用されるパッケージが書かれます。

Suggests

一つまたは複数の他のパッケージが存在するとこのパッケージをより便利に使える場合、この依存関係を宣言します。 このフィールドはパッケージ管理システムとユーザに、 列挙されたパッケージはこのパッケージに関連があり、 おそらくこのパッケージの有用性を増すであろうけれども、 列挙されたパッケージをインストールしなくとも全然問題がないことを教えます。

Enhances

このフィールドは `Suggests' に似ていますが、逆向きに作用します。 これは、このパッケージがここに列挙されたパッケージの有用性を増すときに指定します。

Pre-Depends

このフィールドは Depends と似ていますが、この依存関係は目的のパッケージのインストール前に、先行依存 (predependency) するパッケージの完全なインストールを dpkg に強制します。

先行依存を指定したパッケージを 展開 しようとする際、先行依存関係は依存されたパッケージがきちんと設定されている場合、そして先行依存されているパッケージ (群) が、過去のある時点できちんと設定され、以後削除も部分的削除もされていない場合には、 そのパッケージが現時点で展開中や中途半端に設定されている状態で あっても 満たされます。 この場合は、以前に設定されていたパッケージのバージョンと、現在展開された、またはある程度設定されたバージョンとの両方が、Pre-Depends フィールドのバージョン部分を満たしている必要があります。

先行依存を宣言したパッケージを 設定 しようとする場合、先行依存関係は通常の Depends と同じ、すなわち依存するパッケージが正常に設定済である場合にのみ満たされていると判断されます。 これは、通常の Depends の場合と同じです。

Pre-Depends は濫用すべきではなく、 望ましくは対象となるパッケージの不完全な更新やインストールが、 システムで進行中の更新作業を続ける妨げとなる場合のみに使用するようにするべきです。

Pre-Depends は、preinst スクリプトが指定されたパッケージに依存している場合にも必要になります。 但し、この状況はできるだけ避けるのが賢明です。

依存関係のレベルを選択するにあたって、そのパッケージの機能において依存パッケージの機能がどの程度重要なのかを考えるべきです。 あるパッケージが、重要度の異なるいくつかの部品から構成されているとします。 そのとき、その各部品のなかでも重要度の高いものが必要とするようなパッケージを Depends として並べ挙げるべきです。 そのほかの部分が必要とするパッケージは、その部品の相対的な重要性にしたがって Suggests なり、Recommends として参照されることになります。

競合するバイナリパッケージ - Conflicts

あるバイナリパッケージが他のパッケージとの競合関係を Conflicts フィールドを使って宣言している場合、 dpkg は、それら二つのパッケージを同時にインストールすることを拒否します。

このようなパッケージをインストールするには、もう一方のパッケージをまず削除しなければいけません。 実際の動作としては、インストールしようとしているパッケージに、システム上にあるパッケージを置き換える ( 参照) ようにマークが付けられている場合、システムにインストールされているパッケージに選択を解除するようマークが付けられている場合、また両方のパッケージに Essential という宣言がされている場合は、 dpkg は、競合関係の原因となっているパッケージを自動的に削除します。 そうでない時は、エラーを出力し新規パッケージのインストールを中止します。 特に、インストールされているパッケージが Essential であり、新しくインストールしようとするパッケージがそうでない場合は エラーを出力するようになっています。

あるパッケージは単に設定ファイルがまだインストールされているために競合関係をひきおこすことはありません。 競合関係にあるためには最低でも half-installed の状態でなければいけません。

インストール中のパッケージ自身の名前やそれ自身が提供する仮想パッケージ ( を参照してください) との競合関係が宣言されている場合は特殊な例外です。この場合、 そのようなパッケージのインストールが妨げられることはありません。 また、問題のパッケージを置換する他のパッケージと競合させることもできます。 対象のパッケージだけがある特定の機能を提供するように指定したいときに、このような宣言を使用します。

Conflicts フィールドは、ほとんど常にバージョン番号の指定に「より古い」という指定を含むべきではありません。 このような指定を行うと、dpkg は、その競合関係を宣言しているパッケージが削除されるかアップグレードされるまでそのパッケージのインストールまたはアップグレードを中止します。

仮想パッケージ - Provides

実際に存在する (具体的な) パッケージと同様、パッケージの関連性を記述するフィールド DependsRecommendsSuggestsEnhancesPre-DependsConflictsBuild-DependsBuild-Depends-IndepBuild-Conflicts 及び Build-Conflicts-Indep には、仮想パッケージ名を記述することができます。

everywhere the virtual package name appears. この仮想パッケージ名は、あるパッケージのコントロールファイルの、 Provides フィールドに書かれるものです。 これによって、そのパッケージが所定の仮想パッケージ名が書かれているところすべてにリストされるという扱いになります ( 参照)。

同じ名前の実体のあるパッケージと仮想パッケージが存在していた場合、該当の名前を持つ実体のあるパッケージと、 該当の名前の仮想パッケージを提供する他の実体のあるパッケージのどちらによっても、依存関係が満足されたり競合関係が発生したりします。例えば、 Package: foo Depends: bar というパッケージがあった場合、他の人が bar パッケージの改良版 (例えば、non-US の派生版) をリリースした際には Package: bar-plus Provides: bar とすれば bar-plusfoo の依存関係を満たすことができます。

依存や競合関係にバージョン番号が付けられている場合は、 関係が満たされているかどうか (あるいは、競合関係が侵されていないか) を見るのには、実在のパッケージだけが考慮されます。 仮想パッケージを提供する実在のパッケージは、「正しい」バージョン番号ではないと見なされます。 従って、Provides フィールドには、バージョン番号を含んではいけません。 また、仮想パッケージとの競合または依存関係を決定するときには、その仮想パッケージを提供する実際のパッケージのバージョン番号は参照されません。

将来的には、dpkg に提供される仮想パッケージのバージョン番号を特定する機能が付加されることになるとは思います。 しかし、この機能は今はまだ実装されていませんし、またそれはめったに使われないことと思います。

ある仮想パッケージに関する依存関係で特定の実際のパッケージの集合を指定しなければならないときには、 仮想パッケージ名の前に、代替パッケージとして使われる実際のパッケージ名をフィールド中に列挙してください。

ファイルの上書きとパッケージの置換 - Replaces

コントロールファイルの Replaces フィールドは、異なった状況下で作用する二つの異なった目的を持っています。

他のパッケージ中の一部のファイルを上書きする

まず、以前言及したように、システム中の他のパッケージに含まれているファイルをインストールしようとするパッケージが含んでいるケースは、通常エラーです。

但しここで、上書きするパッケージが上書きしようとしているファイルを Replaces (置換) すると宣言していた場合、dpkg はその処理を実行し、古いパッケージ中のファイルを新しいファイルと置き換えます。 そのファイルは古いパッケージの所有リストからは削除されます。

このようにして、パッケージが完全に置き換えられてしまったときは、 dpkg はそのパッケージが持っているファイルが無く、 『消えてしまった』と考えます。この場合、「必要とされていない」 (削除の選択がされた) および「インストールされていない」 とのマークを古いパッケージに付けます。 そのパッケージの conffile 関係の詳細は無視されます。 これは、新しいパッケージによって引き継がれているだろうからです。 最終的な大掃除が必要であれば、そのパッケージの postrm スクリプトを必要に応じて実行することになるでしょう。 をごらんください。

もし、インストールされているパッケージ、例えば foo が他のパッケージ、bar を置き換えることを宣言してる場合、 dpkg はすでに foo に存在しているため上書きすることになる bar パッケージのファイルを捨てます。 これによって、古いバージョンのパッケージを問題なく上書きインストールできるようになります。

Replaces のこの使い方では、仮想パッケージ ( 参照) は Replaces フィールドを 見るときには考慮されません - 置きかえられると宣言されている パッケージはその実際の名前で言及されていなければなりません。

付け加えておくと、Replaces フィールドがこのように使われるのは、 二つのパッケージが一時的にせよシステム中に同時に存在する場合です。 つまり、これらのパッケージは競合関係にないか、またはその競合関係がすでに上書きされて解消されている場合です。

パッケージ全体の削除を伴う置換

もう一つは、Replaces が、競合が起きた際にパッケージ管理システムにどのパッケージを削除するのか指示する場合です。 これについては を参照ください。 この使い方が有効なのは、二つのパッケージが 実際に競合している 場合です。 従って、前節の場合の用法とこの場合がお互いに干渉することはありません。

この場合、置換することを指定されたパッケージは仮想パッケージでも構いません。 例えば、各メール送信エージェント (MTA) はコントロールファイル中に下記のように記述することで Provides: mail-transport-agent Conflicts: mail-transport-agent Replaces: mail-transport-agent MTA が一度に一つだけインストールされているようにすることができます。 ソースパッケージとバイナリパッケージ間の関連 - Build-DependsBuild-Depends-IndepBuild-ConflictsBuild-Conflicts-Indep

ソースパッケージは、ソースパッケージからバイナリパッケージをビルドする際に特定のパッケージの存在が必要である、 または存在してはいけないことを指示するために、バイナリパッケージに対する依存、あるいは競合関係を宣言することができます。 これはコントロールファイルの Build-DependsBuild-Depends-IndepBuild-Conflicts 及び Build-Conflicts-Indep を使って指定します。 これらの指示された依存、および競合関係は (上記のバイナリパッケージの場合と同様) 以下で記載するように、debian/rules 中のターゲットを起動するために満たされていなければいけません

If you make "build-arch" or "binary-arch", you need "build-arch" または "binary-arch" を作成する場合には、 Build-Depends が必要です。"build-indep" または "binary-indep" を作成する場合には、Build-Depends と Build-Depends-Indep が必要です。 "build" または "binary" を作成する場合には、両方が必要です。

Build-Depends-Arch はありません。オートビルダは build-arch と binary-arch のみを作成する方法が分かっている場合、 Build-Depends のみしか必要ではありません。 build-indep/binary-indep ターゲットをビルドしようとする方は、 基本的にはパッケージ全体をビルドするという仮定がされており、 ビルドに必要な依存パッケージはすべてインストールされます。

この分離の基本的目的は、確か、オートビルダが binary-indep だけのために必要な追加パッケージをインストールしなくて済むようにするためであったと記憶しています。 但し、殆どの作業は build ターゲットの作成であり、binary ターゲットの作成ではありませんから、build-arch/build-indep の分離なしでは、これは意味をなしません。

Build-Depends, Build-Conflicts

Build-DependsBuild-Conflicts フィールドは buildcleanbinarybinary-archbuild-archbuild-indepbinary-indep のどれかのターゲットを起動する際に満たされていなければいけません。

Build-Depends-Indep, Build-Conflicts-Indep

Build-Depends-IndepBuild-Conflicts-Indep フィールドは 、 buildcleanbuild-indepbinarybinary-indep のいずれかのターゲットを起動する際には満たされていなければいけません。

設定ファイルの取り扱い

この章は の内容で置き換えられました。

共有ライブラリ

共有ライブラリを含むパッケージの場合、その共有ライブラリがつねに使用可能となるように多少の注意を払って作成しなければなりません。 とりわけ、C ライブラリ (現在は libc6 です) などのシステム運用に関わる重要な共有ライブラリのときは特にこのことは重要です。

初めに、パッケージは、共有ライブラリを普通の名前でインストールするべきです。 例えば、パッケージ libgdbm1libgdbm.so.1.7.3/usr/lib/libgdbm.so.1.7.3 へインストールすべきです。 このファイルを prermpostrm スクリプトから名前を変更したり、再リンクしたりすべきではありません。 dpkg が実行中のプログラムに影響がないように、注意してファイル名の変更などの作業を実行しますし、これと競合するような処理はおそらく問題を起こすでしょう。

次に、パッケージは ldconfig の作成する共有ライブラリ用のシンボリックリンクを含むべきです。 例えば、libgdbmg1 パッケージは、 /usr/lib/libgdbm.so.1 から libgdbm.so.1.7.3 を含むべきです。これが必要なのは、dpkg がライブラリをインストールしてから postinstldconfig が実行されるまでの間にダイナミックリンカ (例えば、ld.sold-linux.so.*) がそのライブラリを見つけることができるようにするため

パッケージ管理システムでは、.deb ファイル中でのライブラリは、それへのシンボリックリンクが置かれるより先に置かれていることを要求しています。 これは、dpkg が (古いバージョンのライブラリを指すシンボリックリンクを上書きすることによって) 新しいシンボリックリンクをインストールする時点で、新しい共有ライブラリが既に存在していることを保証するためです。 以前は、これはシンボリックリンクを作成する前に一時的なパッケージ用のディレクトリにライブラリを作成することで実現していました。 あいにく、これはいつでも可能なことと言うわけではありませんでした。 というのは、.deb 中の tar ファイルの作成はファイルシステムのふるまいに大きく依存するからです。 ある種の (reiserfs のような) ファイルシステムはファイルを作る順番が問題にならないように、ファイルを並び換えます。 リリース 1.7.0 から、パッケージ作成時に dpkg が自動的にファイルそれ自身を並び換えるようになるので、このファイルを作る順序に配慮するという件は重要ではなくなっています。

です。

三番目に、関連の開発版 (development) パッケージは、バージョン番号なしの共有ライブラリへのシンボリックリンクを含むべきです。 例えば、libgdbm1-dev パッケージは、 /usr/lib/libgdm.so から libgdm.so.1.7.3 へのシンボリックリンクを含むようにすべきです。 このシンボリックリンクが必要となるのは、パッケージをコンパイルする際 リンカ (ld) は動的にリンクする際には libgdm.so しか探さないからです。

ダイナミックリンカの標準のディレクトリ (現在は /usr/lib/lib です)、または /etc/ld.so.conf に列挙されたディレクトリ

これは、現在下記です。

/usr/X11R6/lib/Xaw3d

/usr/local/lib

/usr/lib/libc5-compat

/lib/libc5-compat

/usr/X11R6/lib

にライブラリをインストールするパッケージは、 共有ライブラリシステムをアップデートするために ldconfig を使わなければいけません。 パッケージは最初の引数が configure であった場合 postinst スクリプト中で ldconfig を呼ばなければいけません。 postinst スクリプトではそれ以外の際に ldconfig を呼んでも構いません。 また、最初の引数が remove の際には postrm スクリプト中でldconfig を呼ぶべきです。 メンテナスクリプトでは、この節に記載されている以外ではいかなる場合にも ldconfig を起動してはいけません。

インストールまたはアップグレードの際には、preinst は新しいファイルがインストールする前に呼ばれますから、ここで "ldconfig" を呼ぶことは無意味です。 すでにインストールされているパッケージの preinst はアップグレードが失敗した際にも呼ばれますが、これは共有ライブラリが一時的名称でディスク上にあるかもしれない微妙なタイミングであり、ここで "ldconfig" を呼ぶことは危険であるため、現ポリシーでは禁止しています。

パッケージがインストールあるいはアップグレードされる際には、 "postinst configure" が新しいファイルがディスクに置かれたことを保証してから呼ばれます。 従って、ldconfig を無条件に postinst 中で呼ぶことは完全に安全ですし、パッケージでは引数をチェックしないで単に postinst 中で lsconfig を記載しても問題ありません。 postinst はアップグレード失敗の際の復旧作業でも呼ぶことができます。 これは新しいファイルのどれかがアンパックされる前に実行されますので、 この時点で "ldconfig" を呼ぶことは無意味です。

削除しようとしているパッケージの場合には、prerm が当該パッケージのファイルがそのままの状態で呼ばれますから、 "ldconfig" を呼ぶことは無意味です。prerm が呼ばれるもう一つの場合はアップグレードで、 この場合旧パッケージのファイルがディスクにある状態で呼ばれますから "ldconfig" をコールすることは的はずれです。

一方、postrm は remove の引数付きで、ファイルが削除された直後に呼ばれますから、postrm が呼ばれた時点は、共有ライブラリを提供していたパッケージが削除されたことをシステムに ldconfig を用いて伝えるのに適切なタイミングです。 postrm はこれ以外にも幾つかの場合に呼ぶことができます。"postrm purge" と "postrm abort-upgrade" 及び "postrm abort-upgrade" の場合には、 共有ライブラリはディスク上にないので "ldconfig" を呼んでも役に立ちません。そして、"postrm" が "upgrade"、 "failed-upgrade" または "disappear" の引数で呼ばれている際には、 共有ライブラリは一時的な名称でディスク上にあるかもしれません。

共有ライブラリの依存関係の扱い - shlibs システム

パッケージが共有ライブラリとリンクしたバイナリやライブラリを含む場合、 パッケージをシステムにインストールする際に、必要なすべてのライブラリも共にインストールされるようにする必要があります。 この要求から、shlibs システムが作られました。 これは設計上は非常に簡単なものです。共有ライブラリを 提供する パッケージはすべて、 そのライブラリの動作を保証するために必要なパッケージ依存関係の情報を提供しなければならず、 また共有ライブラリを 使用する パッケージは、 その共有ライブラリが必要とする依存関係を判断するためにこの情報を使います。 共有ライブラリから必要な依存関係の情報への対応を保持するファイルは shlibs ファイルと呼ばれます。

従って、共有ライブラリを含むパッケージをビルドする際には、他のパッケージが使えるよう shlibs を提供しなければいけません。 また、共有ライブラリやコンパイルされたバイナリを含むパッケージでは、 それらに対して dpkg-shlibdeps を実行して、それらが使っているライブラリと、それに伴ってそのパッケージで必要になる依存関係を判断できるようにしなければいけません

以前はリンクされた共有ライブラリの判断は ldd を呼ぶことで行っていましたが、現在は objdump で行うようになっています。 これに伴う唯一の変更は、パッケージビルド時に共有ライブラリに対しても dpkg-shlibdeps の実行が必要になったという点で、これは以前は不必要でした。 この注記の以下ではこの方法の利点について補足します。

バイナリ foo がライブラリ libbar にリンクされている場合 (すなわち、リンクの段階で -lbar フラグを使っている場合)、このバイナリはこのライブラリを 直接 使っています。 libbar が必要とするその他のライブラリは foo間接的に リンクされており、ダイナミックリンカは libbar をロードする際に自動的にそれらのライブラリをロードします。 間接的に使われているライブラリは自動的に引いてこられるため、 パッケージが依存関係を指定する必要があるのは直接リンクしているライブラリだけです。

ldd では、直接呼ばれるライブラリだけでなく間接的に呼ばれるライブラリも表示してしまうという問題があり、 その結果直接の依存関係と間接的な依存関係の両方が抽出されていました。 objdump は、直接使うライブラリだけを抽出するようにしてこの問題を回避します。

これがなぜ役に立つのかを示す良い例として、libimlib を (メジャーバージョン番号をそのままにしつつ) dgf という新しいグラフィックフォーマットに対応した新しいバージョンに更新する場合を考えます。 もし、古い ldd による方法を用いるとすれば、 libimlib を使うパッケージは全て libdgf にも依存するようにコンパイルしなおさなければなりません。 そうしなければ missing symbols となって実行できません。 しかし、新しいシステムでは、libimlib 自身に libdgf への依存関係を持たせられるので、 libimlib を使っているパッケージは libimlib への依存関係を指定しておけば、更新する必要がありません。

以下の節では、まず各 shlibs を探すべき場所について記載し、次に dpkg-shlibdeps の使い方について、最後に shlibs ファイルフォーマットと、あなたのパッケージが共有ライブラリを含む際にこのファイルをどう作るのかについて説明していきます。

システム中の shlibs ファイル

shlibs を探すべき場所は幾つかあります。以下は dpkg-shlibdeps から読まれる順に、その場所を列挙したものです。 最初に見つかった必要な情報を提供するものが使われます。

debian/shlibs.local

これはパッケージの情報を上書き変更するために使います。 使用法は以下 ( の項で) で説明します。

/etc/dpkg/shlibs.override

これはシステム全体の情報を上書きするために使います。 このリストは通常空です。 これはローカルのシステム管理者によって管理されます。

build ディレクトリ中の DEBIAN/shlibs ファイル

パッケージをビルドしようとする際、各 debian/shlibs ファイルは一時的に作成されたビルドディレクトリ中のコントロールファイル領域ににコピーされ、 shlibs という名が付けられます。 これらのファイルはパッケージに含まれる共有ライブラリの詳細情報を提供します

理解の助けになるよう例を挙げておきます。ソースパッケージ foo から二つのバイナリパッケージ libfoo2foo-runtime が作られるとします。 バイナリパッケージのビルドの際、二つのパッケージは順に debian/libfoo2debian/foo-runtime ディレクトリに作られます (うち一方の代わりに debian/tmp が使えます)。libfoo2libfoo を提供するので、shlibs ファイルを用意する必要があり、これは debian/libfoo2/DEBIAN/shlibs にインストールされます。これがこの後 /var/lib/dpkg/info/libfoo2.shlibs になったとします。 次に dpkg-shlibdeps は実行ファイル debian/foo-runtime/usr/bin/foo-prog に対して実行され、debian/libfoo2/DEBIAN/shlibs ファイルが調べられ、 foo-prog のライブラリ依存関係が libfoo2 が提供するライブラリで満たされるかどうかの判定が行われます。 このため、dpkg-shlibdeps はビルドディレクトリに個々のバイナリパッケージすべての shlibs ファイルがインストールされてから実行する必要があります。

/var/lib/dpkg/info/*.shlibs

ここの shlibs ファイルはシステムにインストールされている全パッケージに対するもので、各パッケージのメンテナによって管理されています。

/etc/dpkg/shlibs.default

ここに列挙されているファイルは、正しい shlibs ファイルが提供されていないパッケージに対するものです。 これは shlibs 設定が最初に導入されたときに使われましたが、現在は通常空です。 これは dpkg のメンテナに管理されています。

dpkg-shlibdepsshlibs の使い方

debian/rules ファイル中に dpkg-shlibdeps への呼出し処理を置いてください。バイナリだけを含んだパッケージ (つまり、スクリプトを含まない) の場合、次のコマンドが使えます。 dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/* \ debian/tmp/usr/lib/* それ以外の場合には、コンパイルされるバイナリとライブラリを明示的に列挙する

debhelper を使っているなら、これは dh_shlibdeps プログラムを使っておこなえます。 このプログラムは複数のバイナリパッケージの場合でも正しく処理します。

必要があります。

このコマンドは debian/substvars ファイル中に依存関係の情報を挿入します。 この情報は後で dpkg-gencontrol が使います。 これが正しく処理されるよう、Depends フィールドに ${shlib:Depends} 変数を置かなければならないでしょう。

dpkg-shlibdeps が何も文句を言ってこなかったなら、うまくいっています。 もし、エラーや警告などが出力されたのであれば、たぶん、自前の debian/shlibs.local を以下 ( 参照) で記載するように作成する必要があるでしょう。

複数のバイナリパッケージを生成する場合には、 dpkg-shlibdeps をコンパイルされたバイナリ及び共有ファイルを含む各パッケージ毎に実行する必要があります。 この場合、個別の substvars ファイルを指定するため dpkg ユーティリティの -T オプションを使う必要が出てくるでしょう。 このオプションについての詳細は を見てください。

shlibs ファイルフォーマット

shlibs は同じフォーマットを使います。# で始まる行はコメントとして扱われ、無視されます。 それぞれの行はつぎのものから構成されます。 library-name soname-version-number dependencies ...

zlib1g パッケージを例に取り説明していきます。 このパッケージは (これを書いている時点では) 共有ライブラリ /usr/lib/libz.so.1.1.3 をインストールします。

library-name は、共有ライブラリの名前です。 この場合には、libz です (これは共有ライブラリの .so ファイル名の部分と一致していなければいけません。以下参照のこと)。

soname-version-number はライブラリの .so ファイル名のバージョンの部分です。.so ファイル名には ダイナミックリンカに認識されるライブラリ名と厳密に一致した名前を与えなければいけません。 これは通常、name.so.major-version という形式で、ここでの例では libz.so.1

これは以下のコマンドで判定できます。 objdump -p /usr/lib/libz.so.1.1.3 | grep SONAME

です。 バージョン部は .so. の後に来ている部分で、ここの例では 1 です。

dependencies は、バイナリパッケージのコントロールファイル中の 依存関係フィールドと同じ書式です。 ここには、そのパッケージに含まれるライブラリでビルドしたバイナリが動作するためにどのパッケージが必要になるかに関する詳細を記述しておくべきです。 詳しくは を参照ください。

ここの例では、zlib1g パッケージで、少なくとも 1.3 以降のマイナーバージョン番号を持つ最初のバージョンは 1:1.1.3-1 ですので、このライブラリの shlibs にはこう書きます。 libz 1 zlib1g (>= 1:1.1.3) バージョン指定の依存関係は、古い共有ライブラリを新しいバイナリと共に使った場合、ダイナミックリンカが出す警告メッセージを避けるためのものです。

shlibs ファイルを提供する

パッケージが共有ライブラリを提供する場合、上記のフォーマットで shlibs ファイルを作成すべきです。 普通は debian/shlibs という名前にします (もし複数のバイナリパッケージを作成する場合には、 debian/shlibs.package としたほうがいい場合もあります)。次に、debian/rules でそれを制御領域にインストールしてください。 install -m644 debian/shlibs debian/tmp/DEBIAN または、複数のバイナリパッケージの場合には、次のコマンドとします。 install -m644 debian/shlibs.package debian/package/DEBIAN/shlibs もう一つの方法として、debian/rules から制御領域に直接 debian/shlibs をまったく使わずに shlibs を作成するやり方

これは debhelper ツール群の dh_makeshlibs で行われている方法です。

もあります。 これは、dpkg-shlibdeps からは debian/shlibs ファイル自体は無視されるためです。

dpkg-shlibdeps はソースパッケージから作成するすべてのバイナリパッケージに対して DEBIAN/shlibs ファイルを読むため、すべての DEBIAN/shlibs はどれかのバイナリパッケージに対して dpkg-shlibdeps を実行するより前にインストールしておくべきです。

debian/shlibs.local ファイルの書き方

このファイルは正しい shlibs ファイルを提供していないパッケージの提供するライブラリに依存したバイナリやライブラリのための 一時的な 解決として意図されたものです。

ここで、いま foo バイナリパッケージを作ろうとしているとします。dpkg-shlibdeps を実行したとき、以下のエラーメッセージが出力されました。 ここで -O は依存関係情報を debian/substvars ではなく 標準出力 に出力するためのものです。 また、読みやすくするため適宜改行しています。 $ dpkg-shlibdeps -O debian/tmp/usr/bin/foo dpkg-shlibdeps: warning: unable to find dependency information for shared library libbar (soname 1, path /usr/lib/libbar.so.1, dependency field Depends) shlibs:Depends=libc6 (>= 2.2.2-2) そこで ldd をバイナリに実行して、関連するライブラリの位置をすべて捕捉しましょう。 $ ldd foo libbar.so.1 => /usr/lib/libbar.so.1 (0x4001e000) libc.so.6 => /lib/libc.so.6 (0x40032000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) これによると、foo バイナリは、libbar 共有ライブラリに依存していますが、/var/lib/dpkg/info/libbar.so.1 を扱う *.shlibs ファイルを提供しているパッケージはないようです。 というわけで、責任をとるパッケージを決定しましょう。 $ dpkg -S /usr/lib/libbar.so.1 bar1: /usr/lib/libbar.so.1 $ dpkg -s bar1 | grep Version Version: 1.0-1 どうやら、bar1 パッケージのバージョン 1.0-1 が現在我々の使用しているものということのようです。 ここで、まず bar1 にバグを報告しておき、ローカルでは debian/shlibs.local を作成して問題を修正します。 次の行を、debian/shlibs.local 中に含めてください。 libbar 1 bar1 (>= 1.0-1) これであなたのパッケージビルド作業はうまくいくはずです。

bar1 のパッケージメンテナにより、そのパッケージ用の shlibs ファイルが提供されしだい、あなたの debian/shlibs.local ファイルの当該行を削除することができます (恐らく、あなたのビルド時の問題に他の人が出くわさないようにするため bar1 パッケージに対してバージョン付きの Build-Depends をも指定しておくべきでしょう)。

オペレーティングシステム ファイルシステムの階層構造 ファイルシステム構造

インストールされるファイルやディレクトリの配置は、それが他で記載されている Debian ポリシーの項目に違反しない限り、すべて File system Hierarchy Standard (FHS) バージョン 2.1 に従わなければなりません。 この文書で言及されている版は debian-policy パッケージと一緒に配布されていますし、このマニュアル付属の形では に、また debian-policy パッケージをインストールしているなら、 を見てください。 最新版はこの文書で言及されている版より新しいかもしれませんが、 にあります。この標準に従うことに対する質問は debian-devel メーリングリストに送るか、 もしくは FHS メーリングリスト ( 参照) に詳細を問い合わせて下さい。

サイト毎のプログラム

FHS に従うため、パッケージは /usr/local/ 以下にファイルをおいてはいけません。それが dpkg によって展開されるアーカイブファイルの中身であっても、メンテナスクリプトによって作成されるようなファイルであっても置いてはいけません。

しかし、サイト特有のファイルを置く場所がシステム管理者にわかるように、空のディレクトリを /usr/local 以下のディレクトリ中に作ることはかまいません。 これらのディレクトリは、パッケージの削除の際に (それが空であれば) 同時に削除される様になっていなければいけません。

このようなパッケージ固有のディレクトリを作成していいのは /usr/local より一段以上深い ディレクトリだけで、/usr/local 直下に作成してはいけないことに注意して下さい。パッケージから /usr/local ディレクトリ直下には FHS のセクション 4.5 に列挙されているサブディレクトリ以外のものを作成してはいけません。 しかし、それら列挙されたディレクトリの下には自由にサブディレクトリを作ってもかまいません。 もし自分で作ったディレクトリであったとしても、セクション 4.5 に列挙されているディレクトリは消してはいけません。

/usr/local がリモートのサーバからリードオンリーでマウントされていている場合に対処するため、 それらのディレクトリは .deb アーカイブに含まれるメンテナスクリプトである postinstprerm から作成や削除を行わなければいけません。 これらのスクリプトはそういった作業に失敗しても、それ自身が落ちるようなことがあってはいけません。

例えば、emacsen-commonパッケージは、postinst if [ ! -e /usr/local/share/emacs ] then if mkdir /usr/local/share/emacs 2>/dev/null then chown root:staff /usr/local/share/emacs chmod 2775 /usr/local/share/emacs fi fi を含め、prerm rmdir /usr/local/share/emacs/site-lisp 2>/dev/null || true rmdir /usr/local/share/emacs 2>/dev/null || true を入れることになるでしょう (ここでこのスクリプトが割り込まれた際にもディレクトリ /usr/local/share/emacs が削除されるように書かれていることに注意してください)。

あるパッケージ用にローカルな追加をするために /usr/local 配下にディレクトリを作成した場合、 /usr/local 配下の設定が /usr 配下のものより優先されるよう保証しておくべきです。

しかし /usr/local とその中身は、ローカルの管理者が占有して利用する為にあるのであって、通常の利用においてパッケージが /usr/local 以下のファイルやディレクトリの有無に依存することがあってはなりません。

/usr/local ディレクトリ自身と、パッケージによって作成されたそのサブディレクトリは、標準設定のパーミッションとして 2775 (group 書き込み許可、group id セット) を、そしてオーナーとしては root.staff を設定しておくべきです。

システムで使うメールディレクトリ

システムで使うメールディレクトリは /var/mail です。 このディレクトリは基本システムの一部で、特定のメールエージェントに属しているべきではありません。 以前の場所の /var/spool/mail は、スプールの実体が依然として物理的にその場所に置かれている場合でも、使うべきではありません。 物理メールスプールが /var/spool/mail であるようなシステムからの部分アップグレード時の互換性を維持するため、/var/mail を用いるパッケージは libc6 (>= 2.1.3-13) か base-files (>= 2.2.0) への、またはこのどちらかのパッケージのこれ以降のバージョンへの依存関係を宣言しなければいけません。

ユーザとグループ はじめに

Debian システムは普通のパスワードとシャドウパスワードのいずれの設定とすることも可能です。

一部のユーザ ID(UID) とグループ ID(GID) は特定のパッケージで使用するため、ディストリビューションとして予約されています。 いくつかのパッケージではこれらのユーザやグループに所有されたファイルを同梱することが必要だったり、プログラムにこれらの ID をコンパイル時に組み込んだりする必要があるため、Debian システムではこれらの ID は割り当てられた目的のためだけに使用が許されています。 これは重大な制限で、個々のサイトローカルな管理方針を取り入れてはいけません。 特に多くのサイトではローカルなユーザやシステムグループの ID を 100 から順に割り振っていますので、この制約に注意してください。

これとは別に動的に割り当てられる ID があります。このような ID は所定の妥当な順で配置されていくようになっていますが、この配置の挙動は設定可能です。

base-passwd 以外のパッケージは /etc/passwd/etc/shadow/etc/group および /etc/gshadow を変更してはいけません。

UID と GID の割り当て

UID と GID の割り当てを下記に示します。 0-99:

Debian プロジェクトで共通に割り当てられ、すべての Debian システムで同じ目的のために使われるものです。これらの ID はすべての Debian システムの passwdgroup に現れ、base-passwd 更新の際にこの範囲にある ID は自動的に追加されます。

静的に割り当てられた uid や gid が必要なパッケージはこの範囲の ID を使わなければなりません。当該パッケージのメンテナは ID を base-passwd のメンテナに割り当ててもらう必要があります。

100-999:

動的に割り当てられるシステム用のユーザアカウントです。 パッケージでユーザやグループの割り当てが必要ではあるけれども、それらが 動的に割り当てられた、システム毎に異なるものでも構わない場合には、 adduser --system を使ってこの範囲のユーザやグループを作成してください。 adduser は個々のユーザやグループの有無をチェックします。また必要なら adduser.conf の範囲指定で使わない ID を選択してください。

1000-29999:

動的に割り当てられるユーザアカウントです。標準設定の adduser はこの範囲の UID と GID を割り当てますが、この動作は adduser.conf で変更することができます。

30000-59999:

予約されています。

60000-64999:

Debian プロジェクトとして共通に割り当てているものですが、 要求に応じて作成されます。ID 自体は集中管理で、静的に割り当てられているものですが、実際のアカウント作成は必要になった時点で行われます。

これらの ID はあまり使われないパッケージや、多くの静的に割り当てられた ID を必要とするパッケージのためのものです。 このようなパッケージでは /etc/passwd/etc/group を調べて、(adduser があるなら使って) 必要に応じてアカウントを作成しなければいけません。引き続いて ID を要求していく可能性のあるようなパッケージでは、割り当てた ID の後に将来の追加のために保留部を残しておかなければいけません。

65000-65533:

予約されています。

65534:

ユーザ nobody に割り当てられています。 対応するグループ id はグループ nogroup に割り当ててください。

65535:

(uid_t)(-1) == (gid_t)(-1) です。 この値はエラー検出判定に用いるため、使わないでください。

システムランレベルと init.d スクリプト はじめに

/etc/init.d ディレクトリにはブート時と init の状態 (ランレベル) が変わったときに ( 参照)、init に実行されるスクリプトが納められてい ます。

これらのスクリプトを用いるにあたり、少なくとも二つ (機能上は等しいものですが) の方法があります。簡単のため、 このドキュメントではシンボリックリンクによる方法のみを記します。 しかし、メンテナスクリプト中でこの方法だけが用いられていると思い込んではなりません。 また、それぞれのランレベルの挙動に対する操作は、 手でシンボリックリンクを作成または削除することで実行せず、後述するように update-rc.d によって行われなくてはなりません。 file-rc パッケージで実装されている、もう一つの方法による実装の詳細については、当該パッケージのドキュメントを参照して下さい。

これらのスクリプトは /etc/rcn.d ディレクトリの中からシンボリックリンクが張られています。 ランレベルを変更すると、init/etc/rcn.d ディレクトリ内を見て、 実行すべきスクリプトを探します。ここで n は、これから変更されるランレベルを示します。 また S はブート時のスクリプトを指します。

リンクの名前は全て SmmscriptKmmscript の形をとっています。 ここで mm は二桁の数字で、script はスクリプトの名前を示しています (この名前は /etc/init.d 内の実際のスクリプトと同一の名前にしておくべきです)。

init がランレベルを変更したとき、まず名前が K で始まるシンボリックリンクの先のスクリプトが、それぞれ stop オプション付きで実行されます。次に S で始まるスクリプトが start オプション付きで起動されていきます (リンクは新しいランレベルに対応した /etc/rcn.d ディレクトリに置かれたものです)。K で始まる名前でリンクを張られたものは、サービスを停止することに対応し、S の方は、そのランレベルになる時にサービスを開始することを示します。

例えば、ランレベル 2 から 3 へと移行したとします。 init は、まず /etc/rc3.d/ にある全ての K で始まるスクリプトを、その後そのディレクトリの S で始まるスクリプトを実行していきます。K で始まるものはそれぞれに対応したファイルを stop オプション付きで、そして S で始まるリンク先を start オプション付きで実行します。

mm で示した二桁の数字は、スクリプトの実行順序を決定するのに用いられます。 ここでは小さい数字から順番に実行されます。 例えば K20 というふうに始まるスクリプトは K30 で始まるものよりも先に実行されます。 あるサービスが他のサービスよりも先に開始していなければならないときに使うわけです。 例えば、ネームサーバ bind はニュースサーバ inn がアクセスリストをセットアップできるよう、先に起動しておく必要があるでしょう。 このケースでは bind を起動するスクリプトは inn を起動するものよりも小さい番号にします。 /etc/rc2.d/S17bind /etc/rc2.d/S70inn

ランレベル 0 (halt) と 6 (reboot) の二つは多少異なります。 この二つのランレベルでは S で始まるスクリプトが K で始まるスクリプトの後に実行されるという点では他と変わりませんが、どちらも引数 stop 付きで実行されます。

また、もしスクリプト名が .sh で終わっていた場合、そのようなスクリプトはランレベル S ではフォークされた子プロセスではなく、そのまま実行されます。 その他のランレベルでは、スクリプトは明示的に sh で実行されます。

スクリプトの書き方

システムサービスを行うデーモンを含むパッケージは、 ブート時やランレベル変更時にサービスを開始及び停止させるため、 /etc/init.d にスクリプトを置くべきです。 このスクリプトは、/etc/init.d/package という名前にすべきで、何を行うかを指定する一つの引数を取るようにすべきです。 start

サービスを開始します。

stop

サービスを停止します。

restart

サービスを停止し、再起動します。

reload

サービスを停止したり再起動することなく、サービスの設定を再読み込みします。

force-reload

サービスが設定の再読み込みに対応しているならば再読み込みを行います。 対応していないなら再起動します。

startstoprestartforce-reload の各オプションは /etc/init.d 内の全てのスクリプトがサポートしていなければなりませんが、 reload オプションのサポートは任意です。

init.d スクリプトは、該当するサービスが既に起動しているのに start オプション付きで実行された場合の動作に慎重さが要求されます。 逆に起動していないのに stop オプション付きで実行された際には、他のユーザープロセスを落さないようにしなくてはなりません。 ベストの方法は常に、 start-stop-daemon を用いるようにすることです。

もしサービスが設定を自動的に再読み込みするような場合 (例えば cron などで)、init.d スクリプトに付けられた reload オプションは、 再読み込みに成功したかのように振舞う必要があります。

/etc/init.d は、conffile としてマークされている場合 (パッケージ中に、つまり .deb ファイルに含まれている場合) と、メンテナスクリプト中から適切に扱う (パッケージ中に含まれていない場合。 参照。) 場合のいずれも、設定ファイルとして扱わなければいけません。 これはローカルのシステム管理者がローカルに向けてスクリプトを修正できるようにしたいため、重要です。 つまり、パッケージを削除することなくサービスを止めたい、またはサービスを開始する際に何か特別のコマンドラインオプションを与えたい、 という場合にその人の修正を次のパッケージアップグレードの際に失われることがないようにしたいのです。

パッケージ自体が削除されていても設定ファイルはシステムに残っているため、 その状態でこれらのスクリプトは不可解な落ち方をしないようにすべきです。 dpkg--purge オプション付きで実行されて初めて設定ファイルを削除します。 特に /etc/init.d/package スクリプト自体も通常 conffile ですので、 パッケージが削除されても、上記オプションが指定されて完全削除されていない場合ではスクリプトはシステムに残ったままになっています。 このため、次のように test 文をスクリプトの先頭におくべきです。 test -f program-executed-later-in-script || exit 0

init.d スクリプト中にはスクリプトの動作を制御するために使われ、管理者がしばしば変更したいような 値をいくつか含む場合が良くあります。 スクリプトは多くの場合 conffile ですので、スクリプトを変更した場合管理者がパッケージアップグレードの際に毎回変更された conffile に対してローカルの変更をマージする必要があります。 このシステム管理者の負担を軽減するため、そのような設定可能な値はスクリプト中に直接書くべきではありません。 その代わりに、そのような値は /etc/default 中のファイルによって与えます。 このファイルは通常 init.d スクリプトと同じ名前にしてください。 この追加ファイルはスクリプトを実行する際に参照されます。 このファイルに POSIX sh フォーマット形式の変数設定と、コメント以外を書かないでください。 また、これは conffile とするか、またはパッケージのメンテナスクリプトで処理される設定ファイルとすべきです。 詳細は、 の節を参照ください。

必要な設定値がいつも存在していることを保証するため、 init.d スクリプト中で /etc/default/ ファイルを取り込む前に各シェル変数に標準値を設定するか、 取り込んだ後に ${VAR:=default} の書式を使って設定するかのいずれかとして置いてください。 また、init.d スクリプトは /etc/default/ が消されていた場合にも失敗することなく妥当に振る舞わなければいけません。

initscript システムとのインターフェース

メンテナは、自分のパッケージの、例えば postinstprermpostrm のような initscript 群を扱う際に update-rc.dinvoke-rc.d で提供される抽象化の機構を使うべきです。

直接 /etc/rc?.d リンクを操作し、直接 /etc/init.d/ initscript を起動して良いのは、initscript サブシステムを提供するパッケージ (例えば sysvinit および file-rc) に限られるべきです。

リンクの取り扱い

/etc/rcn.d のシンボリックリンクの作成と削除 (前に触れたもう一つの方法を用いている場合には機能的に等価な処理になります) の作業をパッケージメンテナが適切に行うため、 update-rc.d というプログラムが配布されています。 このプログラムは、メンテナがパッケージ内の postinstpostrm スクリプトの中で使います。

/etc/rcn.d 内のシンボリックリンクを直接アーカイブに含めたり、メンテナスクリプトによってシンボリックリンクの作成及び削除を行ってはいけません。 その代わりに update-rc.d プログラムを使わなければいけません。 (前者の方法は、ランレベル情報の取り扱いをもう一つの方法で行っている場合には正しく動作しません)。 /etc/rcn.d ディレクトリ自体をアーカイブに含めるのもいけません (これが許されているのは、sysvinit パッケージだけです)。

デフォルトでは、update-rc.d はマルチユーザー状態の各ランレベル (2,3,4,5) にて各種サービスを開始させ、 halt(0)、シングルユーザー(1)、リブート(6) の各ランレベルでは停止するようにします。 システムの管理者は、シンボリックリンクによる管理がなされている場合には /etc/rcn.d のシンボリックリンクを追加、移動、削除することによって、また、 file-rc による方法で管理されていれば /etc/runlevel.conf を変更することによって、ランレベルをカスタマイズすることができます。

自分のパッケージをデフォルトの挙動を持つものとして設定するには、 postinst スクリプトに次のように書きます。 update-rc.d package defaults postrm では次のようになります。 if [ "$1" = purge ]; then update-rc.d package remove fi あなたのパッケージのランレベルや優先順位を変更した場合、古いリンクが残ってしまうため リンクを削除したり再作成したりする必要があるかもしれないことに注意してください。 update-rc.d の解説文書を参考にしてください。

この方法ではデフォルトのシーケンス番号として 20 が使われます。 init.d スクリプトを動かす際、順序が問題にならないならば、 このデフォルトを使うようにして下さい。そうでなければ sysvinit パッケージのメンテナと連絡をとるか、 debian-devel にポストしましょう。 番号の選択について手助けしてもらえるはずです。

update-rc.dの使い方に関する情報は、man を見て下さい。

initscript を実行する

invoke-rc.d プログラムは、パッケージメンテナが initscript を適切に (ランレベルに従い、またそのほかのパッケージが開始できる状況を制限するローカルでの制約を満たして) 起動する作業を容易にするために提供されています。 このプログラムは、パッケージのスクリプト中で、メンテナが使うことができます。

/etc/init.d/* initscript を起動する際に 直接起動せずに invoke-rc.d を利用することを強く推奨します

将来は、initscript 起動の際に invoke-rc.d を使用することが義務化される予定です。 メンテナはできるだけ早期に invoke-rc.d へ移行することが勧告されています。

標準では、invoke-rc.d は動作の要求 (start、stop、 reload、restart など) を、意図したランレベル外での start および restart をフィルタするだけで、そのまま /etc/init.d に渡します。

ほとんどのパッケージでは、postinstprerm スクリプトで、 /etc/init.d/<package> <action> を単に以下のように変更すればいいはずです。 if [ -x /usr/sbin/invoke-rc.d ] ; then invoke-rc.d package <action> else /etc/init.d/package <action> fi

パッケージは invoke-rc.d を用いて起動する前に update-rc.d を使って initscript サービスを登録しておく必要があります。 未登録のサービスの起動は失敗するかもしれません。

invoke-rc.d の使い方に関する情報は、 を見てください。

ブート時における初期化

ホストをブートした時に一度だけ実行されるスクリプトをまとめた /etc/rc.boot なるディレクトリが昔は存在しましたが、 でも記載した通り、/etc/rcS.d から /etc/init.d 内のファイルへのリンクに置き換えることが強く推奨されています。 パッケージが /etc/rc.boot にファイルを置くことは許されていません。

実例

bind という DNS (ネームサーバ) パッケージはマルチユーザーのランレベルで稼働されていることが保証されていること、さらにシステムと共にきちんとシャットダウンすることも要求します。 そのためにパッケージは bind というスクリプトを /etc/init.d に置きます。 下記スクリプトを見ていただければ分かると思いますが、 このスクリプトは reload オプションを、ネームサーバに HUP シグナルを送る (これで設定を再読み込みさせられます) ことと解釈します。このようにしてシステム管理者は /etc/init.d/bind reload とすればネームサーバの設定の再読み込みを行うことができます。 このスクリプトは立ち上げ時に named プログラムへパラメータを渡すために使うことができる設定可能な値を含むファイルを一つ持っています。この値は /etc/default/bind から読み込まれます (下記参照)。

#!/bin/sh # # Original version by Robert Leslie # <rob@mars.org>, edited by iwj and cs test -x /usr/sbin/named || exit 0 # Source defaults file. PARAMS='' if [ -f /etc/default/bind ]; then . /etc/default/bind fi case "$1" in start) echo -n "Starting domain name service: named" start-stop-daemon --start --quiet --exec /usr/sbin/named \ -- $PARAMS echo "." ;; stop) echo -n "Stopping domain name service: named" start-stop-daemon --stop --quiet \ --pidfile /var/run/named.pid --exec /usr/sbin/named echo "." ;; restart) echo -n "Restarting domain name service: named" start-stop-daemon --stop --quiet \ --pidfile /var/run/named.pid --exec /usr/sbin/named start-stop-daemon --start --verbose --exec /usr/sbin/named \ -- $PARAMS echo "." ;; force-reload|reload) echo -n "Reloading configuration of domain name service: named" start-stop-daemon --stop --signal 1 --quiet \ --pidfile /var/run/named.pid --exec /usr/sbin/named echo "." ;; *) echo "Usage: /etc/init.d/bind \ {start|stop|restart|reload|force-reload}" >&2 exit 1 ;; esac exit 0

上記の init スクリプトを補うファイルが /etc/default/bind で、これはこのスクリプト中で使う設定可能なパラメータの値を含んでいます。 このファイルはあらかじめ存在していない場合には postinst で作成され、完全削除の際には postrm で削除されます。

# Specified parameters to pass to named. See named(8). # You may uncomment the following line, and edit to taste. #PARAMS="-u nobody"

あなたの/etc/init.dスクリプトのベースとなる、別の サンプルは/etc/init.d/skeletonにもあります。

もしこのパッケージが update-rc.d のデフォルト設定のまま、特に起動順序番号が 20 で、かつ named を全てのランレベルで走らせる、という設定で満足するなら、 postinst には次のように書けば良いことになります。 update-rc.d bind defaults >/dev/null そして postrm には、完全削除の際にリンクを削除するために次のように書きます。 if [ purge = "$1" ]; then update-rc.d bind remove >/dev/null fi

init.d スクリプトからのコンソールメッセージ

この章では /etc/init.d 内のスクリプトが標準出力に書き出す各種のメッセージの書式について述べます。 この規定の狙いは Debian の起動とシャットダウン時の見栄えをより一貫したものとすることです。 このため、細部にわたって、注意深く読んでください。 空白や句読点、大文字小文字の使い分けなどが同じフォーマットに従うようにしようと考えています。

below. まず、出力メッセージを作成する際に使うべき基本的なルールを示します。 この章の以降で特に記されていない、標準的ではないメッセージを出力させたいときには参考にしてください。

全てのメッセージは一行に書かれ、大文字で始まり、ピリオド (.) と改行 ("\n") で終えなければなりません。

コンピュータが何かを実行していることを表現したい場合 (プログラムの開始や終了ではなく、特定の作業が進行中である場合などです) "省略符号" (ellipsis。すなわち、三つのドット ...です) を使います。 ドットの前後にスペースを入れないことに注意してください。 作業が終了したら done. と表示して改行してください。

コンピュータが何をしているのか教えようとするかのように メッセージを作成してください。礼儀正しく :-) 但し、コンピュータ自体を主語としては使わないでください。 例えば、 I'm starting network daemons: nfsd mountd. と表現したいならば、単に次のようにしてください。 Starting network daemons: nfsd mountd.

以下は特定の場合での標準の書式です。この書式を init.d スクリプトで使うべきです。

デーモンを開始するとき

スクリプトが一つ以上のデーモンを起動するときには、次の書式を使います。 出力は次のようにしてください (1行にし、 最初に空白は入れません)。 Starting <description>: <daemon-1><daemon-2> <...> <daemon-n>. description は対象となる一つまたは複数のデーモンの属するサブシステムについて記述してください。 daemon-1 から始まって daemon-n までは各デーモンの名前 (通常はそのプログラムのファイル名) を記載してください。

例えば /etc/init.d/lpd の出力は次のようになります: Starting printer spooler: lpd.

このように出力するためにスクリプト中では次のようにしています。 echo -n "Starting printer spooler: lpd" start-stop-daemon --start --quiet --exec /usr/sbin/lpd echo "." 一つ以上のデーモンを起動するときは次のようにします: echo -n "Starting remote file system services:" echo -n " nfsd"; start-stop-daemon --start --quiet nfsd echo -n " mountd"; start-stop-daemon --start --quiet mountd echo -n " ugidd"; start-stop-daemon --start --quiet ugidd echo "." これによりユーザは何に時間がかかっているのか、またいつ最後のデーモンが起動したのかを知ることができます。 スペースをどこに置くかに気をつけるべきです。 上記の例では、既に述べたように、システム管理者が特定のデーモンを起動したくないときには簡単にコメントアウトできますし、 その場合でもメッセージはきちんと表示されます。

システムパラメータをセットするとき

起動時にシステムの設定を変更するときには、次のような書式を使うべきです。 Setting parameter to `value'.

引用符が正しくなるようにするには、次のような行が使えます。 echo "Setting DNS domainname to \`$domainname'."

左引用符 (`) と右引用符 (') が違うことに気を付けてください。

デーモンを停止または再起動するとき

デーモンを止める、または再起動するときのメッセージの書式は起動時のメッセージに準じ、 StartingStopping ないし Restarting に変えたものです。

プリンタデーモンを止める時の出力を例にすると、次のようになります。 Stopping printer spooler: lpd.

何かを実行しているとき

システムの開始時やシャットダウン時に特定の処理を行うために プログラムを実行しなければならないようなことはよくあります。 例えば netdate でシステムの時計を合わせたり、 システム終了時に全てのプロセスを止めたりする場合などです。 このような場合のコンソールメッセージは次のようになります。 Doing something very useful...done. 作業が終了した後は直ぐに done. を表示し、ユーザに何故待たされていたのかを知らせなければいけません。 これは次のようにスクリプトに書きます。 echo -n "Doing something very useful..." do_something echo "done."

設定を再読み込みするとき

デーモンが設定ファイルを再読み込みするときは、次の書式を使ってください。 Reloading description configuration...done. ここで、description の部分はデーモンを開始するときと同じです。

Cron ジョブ

パッケージは /etc/crontab 設定ファイルを変更してはいけません。 また、/var/spool/cron/crontabs 内のファイルを変更してもいけません。

パッケージが cron で実行されるようなジョブをインストールしたいときは、 下記のディレクトリにパッケージの名前を持つファイルを置いてください。 /etc/cron.daily /etc/cron.weekly /etc/cron.monthly これらのディレクトリの名前が示す通り、これらの中のファイルはそれぞれ、 毎日(daily)、毎週(weekly)、毎月(monthly) 実行されます。 正確な時刻は /etc/crontab に記載されています。

これらのディレクトリにインストールされた全てのファイルは、 ローカルシステムの管理者が簡単に変更できるようにスクリプト (シェルスクリプト、perl スクリプトなど) でなければいけません。 また、設定ファイル (参照) として扱われるようにすべきです。

一日一回より高い頻度で実行する必要のあるジョブがある場合には、 パッケージは /etc/cron.d/package-name ファイルをインストールしてください。このファイルは /etc/crontab と同じ書式で、cron により自動的に実行されます。 このファイルも設定ファイルとして扱わなければいけません (注記:この /etc/cron.d の中のエントリは anacron では処理されないので、ここにおくジョブはシステムが停止しているときには行う必要がないものに限られます)。

これらのディレクトリにあるスクリプトは、実行する前に必要なプログラムがインストールされているかをチェックするようになっていなければいけません。 そうしないと、パッケージをパージ (完全削除) ではなく単に削除したときには設定ファイルがシステムに残ったままになっているので、問題が起きてしまいます。

メニュー

Menu エントリは現在の Menu ポリシーに従う必要があります。Menu ポリシーは debian-policy パッケージに menu-policy ファイルとして同梱されています。また、Debian FTP サイト ftp.debian.org/debian/doc/package-developer/menu-policy.txt.gz または手近のミラーサイトの相当箇所にも置かれています。

Debian の menu パッケージはアプリケーションや文書を提供するパッケージと メニュープログラム (X window マネージャや pdmenu のようなテキストベースのメニュープログラム) の間の独自のインターフェースを提供します。

通常の操作において特別な引数を必要としないアプリケーションを提供する全てのパッケージは、 そのアプリケーションに対してメニューエントリ (menu entry) を登録します。こうすれば menu パッケージを使うユーザはウィンドウマネージャ内や、pdmenu のようなシェルからメニューを自動的に取得できます。

アプリケーションや web 文書を登録する方法の詳細については、 menu パッケージに付属する Debian メニューシステム ドキュメントを参照してください。

マルチメディアハンドラ

ある種の MIME タイプを表示/閲覧/再生/合成/編集や印刷する機能を もつプログラムは debian-policy パッケージに mime-policy ファイルとして同梱された現在の MIME サポートポリシーに従って登録を行う必要があります。 この MIME サポートポリシーは ftp.debian.org/debian/doc/package-developer/mime_policy.txt.gz または手近のミラーサイトの相当箇所にも置かれています。

MIME (Multipurpose Internet Mail Extensions, RFCs 2045-2049) とはファイルやデータストリームを符号化し、それに関するメタ情報、 特に種別 (音声や画像) とフォーマット (PNG、HTML、MP3 など) などの付随情報を付加するための機構です。

MIME タイプを登録することで、メール受信ユーザプログラムやウェブブラウザがそれ自身で直接扱えない MIME タイプの表示や編集などをハンドラを呼び出すことで行うことができるようになります。

キーボード設定

システムで一貫したキーボードの設定、具体的には すべてのアプリケーションがキーボード打鍵イベントを同じように解釈するようにするために Debian ディストリビューションのプログラムは下記のガイドラインに従わなければなりません。

以降の特定のキーは記載の解釈としなければいけません。 <--

カーソルの左の文字を削除する

Delete

カーソルの右の文字を削除する

Control+H

emacs では一連のヘルプを呼び出す

terminal emulator, an rlogin/telnet session, etc.--> キーボード打鍵イベントの解釈はそのとき使っている端末 (仮想コンソールや X 端末エミュレータ、rlogin/telnet セッションなど) に依存しないものでなければいけません。

下記のリストは異なったプログラムでこれを実現するための説明です。

<-- X 環境ではバックスペースキーイベント (KB_BackSpace) を起こします

Delete X 環境では Delete キーイベント(KB_Delete)を起こします

X 環境ではバックスペースキーイベント (KB_Backspace) は ASCII の DEL を生成し、Delete キーイベント (KB_Delete) では ESC [ 3 ~ (これは vt220 のデリートキーのエスケープシーケンスです) を生成するように設定します。これは全 X 表示画面に対して xrdb でリソースをロードすることで設定します。 アプリケーションの標準設定値の変更はしません。 これは xmodmap 設定とここでの解釈のリソースを一致させるためです。

Linux コンソールは <-- は DEL を、 Delete キーは ESC [ 3 ~ を生成するように設定されています。

X アプリケーションは <-- キーはカーソルの左を、 Delete キーは右を消すように設定します。Motif アプリケーションは既にこうなっています。

ターミナルでは stty erase は ^? と設定します。

xterm の terminfo エントリは kdch1ESC [ 3 ~ を設定します。TERM=linux と TERM=vt220 も同様です。

Emacs は バックスペースキーイベント (KB_Backspace) と、stty erase で設定されたキーイベントは delete-backward-char にマップされ、Delete キーイベント (KB_Delete) と kdch1delete-forward-char にマップされ、^H は常にヘルプの呼び出しになるようプログラムされています。

他のアプリケーションでは stty erasekdch1 は二つの delete キーとして、ASCII DEL 文字は前の文字を消すように、kdch1 はカーソルの下の文字を消すようにします。

これで大部分の問題は解決しますが、以降に例外に属する処理について記しておきます。

一部のターミナルでは <-- キーで ^H 以外のコードを生成することができません。 このようなターミナルでは、Emacs のヘルプを ^H で呼ぶことができません (Emacs では stty erase の設定の方が優先され、かつ正しく設定されているという前提の下です)。 M-x help または F1 (あれば) を代わりに使うことができます。

一部の OS は ^Hstty erase の文字に使います。ただ、最近の telnet やすべての rlogin プログラムは stty 設定を引き継ぎますし、 ほとんどすべての UNIX 類は stty erase の設定を尊重します。 stty 設定が正しく引き継がれない場合には、 stty を手動設定して正しく動くようにしてください。

一部のシステム (以前の Debian の版もそうでした) では <-- キーと Delete キーが Delete キーイベント (KB_Delete) を起こすよう xmodmap で設定しています。 このようなシステムの X クライアントのふるまいを、 私たちの環境と同じ X リソースを使って変えることもできますし、 逆の場合にはこのようなシステムのリソースで私たちのクライアントを設定することもできます。 このようにして設定したシステムでは Delete はたぶん動きませんが、 <-- の方は正しく動作します。

一部の OS では xterm などの端末設定の terminfo データベース中の kdch1 に別の設定がされています。このようなシステムに、 このポリシーに従ったシステムからログインした場合には Delete キーは正しく動作しませんが、 <-- は正しく動作します。

環境変数

プログラムは妥当な結果を得るために特定の環境変数の設定に依存するものであってはいけません。 これはこのような環境変数はシステム全体に影響を及ぼす /etc/profile のような設定ファイルで設定しなければなりませんが、このような設定ファイルがすべてのシェルでサポートされているわけではないためです。

プログラムが通常環境変数の設定に依存する場合、環境変数が設定されていなかった場合に妥当な標準設定値を使うように修正するようにすべきです。 これがもし容易に行えないようなら (例えば non-free プログラムでソースコードがない場合など) プログラムは環境変数を設定して元のプログラムを呼び出すようなラッパスクリプトに置き換えておかなければいけません。

この目的のためのラッパスクリプトを次に示します。 #!/bin/sh BAR=${BAR:-/var/lib/fubar} export BAR exec /usr/lib/foo/foo "$@"

更に /etc/profilebase-files パッケージの設定ファイルですので、他のプログラムはこのファイルに環境変数やそのほかのコマンドの設定を追加してはいけません。

ファイル バイナリファイル

二つのパッケージが、異なった機能を持つ同じ名前のプログラムを インストールする事は許されていません。(二つのパッケージが同 じ機能を提供するが、その実装が異なっている場合には代替 (alternatives) 機能または競合 (Conflicts) 機能を使って処理してください)。これらについては順に を参照ください。 この状況が発生した場合には一方のプログラムが名前を変更しなければなりません。 メンテナは名前が衝突していることを debian-devel メーリングリストに報告して、 どちらのパッケージの名前を変更する方がいいのかの合意を得るようにしてください。 合意が得られない場合には、両方の プログラムが名前を変更しなければなりません。

標準では、パッケージが作成される際には、任意のバイナリはデバッグ情報付きで作成されるべきで、また最適化も行われるべきです。 また、コンパイル時の警告メッセージもできるだけ有効にすべきです。 これは、問題の可能性の有無をビルド時のログを見て判断する移植者の作業を容易にします。 C 言語の場合、上記のことから通常は次のコンパイル時の引数を使うべきです。 CC = gcc CFLAGS = -O2 -g -Wall # warning オプションは変更可です。 LDFLAGS = # なし install -s # (または、debian/tmp で strip をかけてください)

バイナリファイルは標準的には strip をかけておくべきであることに留意してください。 これは install-s フラグか、パッケージツリーを作成する前にいったんプログラムを debian/tmp に移して strip を呼び出すかのどちらかで行ってください。

ビルドツリーでのバイナリはデバッグ情報付きでコンパイルされるべきですが、それでもコンパイラの最適化のためにデバッグはしばしば困難になります。 このため、標準環境変数 DEB_BUILD_OPTIONS のサポートを推奨します。 この変数は、パッケージコンパイルとビルドのやり方を変更する幾つかのフラグを含んでいます。

noopt

この文字列を含む場合、パッケージでは最適化を最小に留めるべきだと言うことを意味します。 C 言語では、CFLAGS-O0 を付けるのが最良 (通常はこれが標準ですが) です。 ある種のプログラムは、このレベルの最適化ではビルドに失敗します。 この場合、例えば -O1 とする必要があるかもしれません。

nostrip

この文字列を含む場合、パッケージにデバッグ情報を含むようにするためインストール時に strip を行うべきではないと言うことを意味します。

次に示す makefile の断片はビルドオプション実装の例の部分だけを示したものです。 あなたのパッケージでこの例が動作するようにするためにはあちこち手直しする必要があるでしょう。 CFLAGS = -Wall -g INSTALL = install INSTALL_FILE = $(INSTALL) -p -o root -g root -m 644 INSTALL_PROGRAM = $(INSTALL) -p -o root -g root -m 755 INSTALL_SCRIPT = $(INSTALL) -p -o root -g root -m 755 INSTALL_DIR = $(INSTALL) -p -d -o root -g root -m 755 ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif

コンパイルオプションに最も適したものを選ぶのはメンテナの判断に任せています。 ある種のバイナリ (たとえば計算量の多いプログラム) にはそれなりのフラグ (-O3 など) の方が実行時の効率が上がるでしょうし、そういうときには自由にそのようなフラグを使ってもかまいません。 的確な判断を行ってください。 漠然とした考えでフラグを設定しないでください。 そうする理由があるときのみに限ってください。 どのコンパイルオプションが適切かについての上流の作者の考えを変更するのは自由です。 なぜならしばしば私たちの環境では適さないものが使われていますので。

ライブラリ

一般的には、ライブラリパッケージには共有ライブラリ版のライブラリを収録し、開発版にスタティックリンク版のライブラリを収録しなければなりません。 共有ライブラリは -fPIC 付きでコンパイルし、スタティックリンク版では -fPIC をつけてはいけません。言い換えれば、各ソース部分 (C 言語では *.c に当たる) は二回コンパイルする必要があります。

ある種の場合では、スタティックリンク版のみのライブラリを提供することも許されます。 そのような場合には以下のものがあります。

その言語の共有ライブラリサポートがこなれておらず、不安定な場合。

ライブラリに対するインターフェースがまだ柔らかく、開発中の場合 (通常ライブラリのメジャーバージョン番号が 0 であるか、ABI がパッチレベル間で変更される場合)。

上流の作者の意図により、スタティックリンク版のみを提供するようになっている場合。

ライブラリがスタティックリンク版のみ提供される場合、開発版パッケージの基準に従わなければいけません。

全てのライブラリは共有ライブラリ版の lib* パッケージとスタティックライブラリ版の lib*-dev パッケージを用意しなければいけません。 共有ライブラリバージョンは -fPIC オプション付きでコンパイルし、 スタティックライブラリバージョンではそうしてはいけません。 言い替えれば、*.c は二度コンパイルされる必要があることになります。

LinuxThreads と互換性を持ったライブラリ (スタティック、共有 の両方で) を作成するために、gcc のオプションに -D_REENTRANT を指定しなければいけません。

インストールされる共有ライブラリは次のようにして strip されているべきです。 strip --strip-unneeded your-lib (このオプション `--strip-unneeded' は strip にリロケーション処理に必要のないシンボルのみを削除するように指示します) ダイナミックリンクの際に使用するシンボルは別の ELF オブジェクトにあるので、共有ライブラリは strip されても完全に機能

多分、これに加えて --remove-section=.comment--remove-section=.note を共有ライブラリと実行ファイルに、--strip-debug をスタティックライブラリに指定することも検討に値するでしょう。

します。

ある種の場合、たとえばデバッグ機能を持った別パッケージをビルドする場合など、 strip しない共有ライブラリを作成したほうがいい場合もあることに気をつけてください。

共有のオブジェクトファイル (多くの場合は、 .so ファイルです) で、汎用のライブラリではない (すなわち、一連のものとは独立の実行ファイル (バイナリや他のパッケージからリンクされることを想定していない) ものは、/usr/lib ディレクトリのサブディレクトリにインストールすべきです。 このようなファイルは通常の共有ライブラリに適用される規則に沿わなくとも構いませんが、 実行可能ビットを立ててインストールしてはいけないこと、及び strip すべきこと、の二つの規則は守る必要があります

典型的な例は、いわゆる『プラグイン』 (内部で使う共有オブジェクトで、プログラム内から を使って動的に読み込まれるもの) です。

他のパッケージのバイナリとリンクしても良い共有ライブラリを含むが、 やむを得ない 理由でそれを /usr/lib にインストールできない場合は、共有ライブラリを /usr/lib 以下のサブディレクトリにインストールしても構いません。 この場合、/etc/ld.so.conf に当該ディレクトリをパッケージの postinst で追加し、 postrm で削除するようにする必要があります。

リンク処理に libtool を使うパッケージが増えてきています。 最新の GNU libtools (>= 1.3a) ではインストールされた libtool アーカイブのファイル (*.la) を活用できます。libtool.la ファイルの主な利点は作成するライブラリについてのメタデータを格納し引き続いて参照できることです。 libtool はこれらのライブラリに関する豊富な情報 (たとえばスタティックリンク時に依存関係にあるライブラリについて) を含むファイルを検索することができます。 また、libltdl を使うプログラムでは、libtool の使用は 必須

libtool.la ファイルを持たない共有ライブラリをリンクする機能を一通り提供してはいますが、 libtool 自体はシェルスクリプトにすぎませんので、 リンクしようとする各ライブラリから初見で上記の情報を引き出そうとすると libtool を使うパッケージのビルド時間が目に見えて伸びることになります。 libtool バージョン 1.4 からは改良に伴い (libtool バージョン 1.3 もある程度は同様の拡張がなされていますが) .la ファイルの削除後に導き出せる保証のないようなライブラリ間の依存関係に関する情報を .la ファイル中に保存するようになっています。

です。

というわけで、共有ライブラリを libtool を使って作成するパッケージでは、-dev パッケージに .la ファイルを含めるべきです。ただし、libtoollibltdl ライブラリに依存するパッケージは例外で、この場合には .la ファイルはランタイムパッケージに含めなければいけません。

自分のパッケージを作成する際には、リリースされている版の共有ライブラリのみを使うように気をつけなければいけません。 ここで間違えるとほかのユーザはあなたのプログラムを正しく実行することができません。 リリースされていないコンパイラに依存するパッケージを作成することも通常好ましくありません。

共有ライブラリ

共有ライブラリを含むパッケージは、いくつかのバイナリパッケージに分割しなければいけません。

開発環境とランタイムキットとして共有ライブラリのみを含む単純な構成のパッケージでは、二つのパッケージを作成すべきです。 即ち、librarynamesoversion パッケージ (ここで soversion は 共有ライブラリの .so ファイル名中のバージョン番号です)

.so ファイル名 (soname) は共有ライブラリの共有オブジェクト名です。 これはプログラムの作成時とダイナミックリンカがプログラムを実行する際に一致させなければならないものです。 例えば、ライブラリの .so ファイル名が libfoo.so.6 ならば、パッケージ名は libfoo6 になります。

librarynamesoversion-dev です。 または、librarynamesoversion を直接加えると混乱を招く場合 (例えば、libraryname 自体が数字で終わる場合) には、 libraryname-soversion または libraryname-soversion-dev を代わりに使うことができます。

開発版は一種類のみサポートすると決めたならば、開発用パッケージの 名前は libraryname-dev としてしまってかまいません。そうでない場合には dpkg の conflict メカニズム ( 参照) を使って一種類の開発用パッケージのみ同時に存在するように保証するのも良いでしょう (異なった開発用のパッケージといえども同じヘッダファイルを持つことが多いですから、結局二種以上をインストールしようとするとファイル名衝突は起こりがちです)。 通常開発用のバージョンでは、正しくコンパイル・リンクを行うためにランタイムライブラリに対して正確なバージョン依存関係を与えるべきです。 ${Source-Version} 変数置換をこの目的に使用できます。

共有ライブラリを使うパッケージは共有ライブラリパッケージ名に、 すなわち librarynamesoversion に対して依存関係を指定します。.so ファイル名 (soname) が変わったときに、旧ライブラリから新ライブラリへの移行期間中に両方のバージョンをインストールしておくこともできます。

パッケージが、共有ライブラリを使用する場合の実行時のサポートプログラムをもつ場合、 共有ライブラリパッケージにそれらを含めてはいけません。 そのようにしてしまうと、ファイル名の衝突を避けることなく、複数のバージョンの共有ライブラリをインストールすることができません。 この場合には代わりに、実行時のサポートのための三番目のパッケージ (そのパッケージ名は通常、 libraryname-runtime とします。.so ファイル名 (soname) がパッケージ名にないことに注意) を作成するか、開発用パッケージが小さければそれに含めてください。

同じソースツリーから複数の共有ライブラリをビルドする場合、 それらをまとめて一つの共有ライブラリパッケージにすることができます。 そのときには、このような集合ライブラリの複数のバージョンをインストールした場合にファイル名の衝突が起きないように、 .so ファイル名 (soname) の変更は、このライブラリ集合の各ライブラリに対して一括して実施するようにしてください。

共有ライブラリに実行属性を付けてインストールしてはいけません。 ダイナミックリンカはこのような属性を必要としていませんし、 共有ライブラリを実行しても普通はコアダンプを吐くだけです。

スクリプト

パッケージ中に含まれ dpkg が使用するメンテナスクリプトも含めて、すべてのコマンドスクリプトはスクリプトを解釈するインタープリタを #! 行を追加して指定しなければいけません。

それが perl スクリプトの場合は、その行は #!/usr/bin/perl でなければいけません。

シェルスクリプト (shbash を使う) では、特殊な場合をのぞいて最初に set -e を書いてエラーを検出するようにすべきです。 スクリプトはすべて set -e を使うか、 コマンドの終了ステータスを明示的に調べてエラーを検出すべきです。

標準のシェルインタープリタは /bin/sh です。これは echo -nで改行を挿入することがないような

Debian ポリシーでは /bin/sh は POSIX 準拠の動作とすることを規定していますが、 一方 echo -n は Linux コミュニティで広く使用されています (このポリシー中にも、linux カーネルソースや、多くの debian スクリプト中にも見られます)。POSIX 規格では echo -n の動作は規定されてはいますが、 この規定への準拠は必須とはされていないため、ここでは明示的に追加します。 また、噂では LSB ではどちらにせよ必須となるとのことですので。

POSIX 互換なシェルのどれかへのシンボリックリンクになっている場合があります。 従って、/bin/sh をインタープリタに指定したシェルでは POSIX で規定されている機能だけを使うべきです。スクリプトで POSIX に規定されていない機能をインタープリタに期待する場合には、 適切なシェルを最初に指定 (例えば `#!/bin/bash' のように) して、パッケージからそのシェルに対して依存関係を与えてください (そのシェルパッケージが `Essential' 扱いになっている、例えば bash のような場合は依存関係の指定は不要です)。

スクリプトをできる限り POSIX 規定の機能だけを用いて書くようにし、 /bin/sh をインタープリタとして使えるようにしたいと思う場合、あなたのスクリプトが dash (旧名称 ash) で動くならおそらく POSIX 互換になっていると思います。但し、疑問があるなら明示的に /bin/bash を使ってください。

Perl スクリプトでは、システムコールを使ったときにはエラーをチェックしてください。 システムコールには openprintcloserenamesystem などが含まれます。

cshtcsh をスクリプト言語に使うのは避けるべきです。 この理由は comp.unix.* の FAQ の一つ Csh Programming Considered Harmful

これは や、ftp.cpan.org ftp サイトの /pub/perl/CPAN/doc/FMTEYEWTK/versus/csh.whynot にあります。日本語訳は ftp.sra.or.jp ftp サイトの /pub/news/fj.archives.documents/csh-whynot-jp にあります。

を参考にしてください。 上流のパッケージに csh スクリプトが含まれているときには、 そのスクリプトが #!/bin/csh で始まり、そのパッケージを c-shell 仮想パッケージに依存するよう設定したことをよく確認してください。

誰からでも書けるディレクトリに (例えば /tmp に) ファイルを作成するスクリプトは、作成しようとするファイルと同じ名前のファイルが存在したら失敗するような機構を組み込んでください。

Debian の base システムに含まれる tempfilemktemp ユーティリティはこの目的でスクリプト中で使うためのものです。

シンボリックリンク

通常、トップレベルディレクトリ (ルートディレクトリ / のサブディレクトリがトップレベルディレクトリです) 内のシンボリックリンクは相対参照とすべきです。 また、トップレベルディレクトリ間のシンボリックリンクは絶対参照とすべきです。

それに加えて、シンボリックリンクは可能な限り短くすべきです。 例えば foo/../bar のような参照は好ましくありません。

ln を使って相対リンクを作成するときに、ln を実行する作業用ディレクトリからの相対位置にリンク先が存在している必要はありません。 また、リンクを作成しようしているディレクトリに作成の際にディレクトリを移動する必要もありません。 やるべき事は単にリンク先 (リンクが存在するディレクトリからの相対参照になるようなパス名です) が ln の最初の引数に現れるよう文字列を与えるだけです。

例えば、Makefiledebian/rules で次のような処理を行ってください。 ln -fs gcc $(prefix)/bin/cc ln -fs gcc debian/tmp/usr/bin/cc ln -fs ../sbin/sendmail $(prefix)/bin/runq ln -fs ../sbin/sendmail debian/tmp/usr/bin/runq

圧縮されたファイルを参照するシンボリックリンクは、対象ファイルと同じ拡張子を持つようにしてください。 例えば、foo.gz をシンボリックリンクで参照する場合、リンクのファイル名も同様に `.gz' で終わる、bar.gz のような名前にしてください。

デバイスファイル

パッケージファイルツリーにデバイスファイルを含めることは許されていません。

パッケージが base システムに含まれていない特殊なデバイスファイルを必要とする場合には、 postinst スクリプト中でユーザに許可を問い合わせた後 MAKEDEV を呼び出してください

この問い合わせは (低プライオリティの) debconf メッセージまたは echo (printf) 文で行うことができます。

postrm や、その他のスクリプト中でデバイスファイルを削除してはいけません。 そのような処置は管理者に任せてください。

Debian ではシリアルデバイスファイル名に /dev/ttyS* を使います。昔流の /dev/cu* を使っているプログラムは /dev/ttyS* に変更すべきです。

設定ファイル 定義

設定ファイル

これは、プログラムの実行に影響を与えるファイル、 またはサイトやホスト固有の情報を提供するファイル、 またはプログラムの挙動を制御するためのファイルです。 通常、設定ファイルはシステム管理者の手で、 ローカルの方針やサイト個別要件にあわせた挙動をさせるために、 必要に応じて変更されることを想定しています。

conffile

パッケージの conffiles ファイル中に列挙されたファイルで、dpkg から特別の扱いを受けます ( 参照)。

この二つの違いは重要で、置き換え可能な概念ではありません。 ほとんどすべての conffiles は設定ファイルですが、 多くの設定ファイルは conffiles ではありません。

設定情報を内部に含むスクリプト (例えば /etc/default のほとんどのファイルや、 /etc/cron.{daily,weekly,monthly} など) は事実上の設定ファイルですし、そのように扱われます。

配置

パッケージによって作られ使われる設定ファイルは /etc 以下に配置しなければいけません。 関連した設定ファイルが複数ある場合には、そのパッケージの名前がついたサブディレクトリを /etc 以下に作成することを検討してください。

あなたのパッケージが /etc 以外の場所に設定ファイルを作成し、かつそのパッケージが /etc を使うように修正するのが望ましくない場合でも、 設定ファイル自体は /etc に置き、 パッケージの期待する場所からシンボリックリンクで参照するようにするべきです。

設定ファイルの扱い

設定ファイルの扱いは下記の挙動に従ったものとしなければいけません。

ローカルで行った変更は、パッケージをアップグレードした際に保持されていなければいけません。

設定ファイルはパッケージ削除の際にはそのまま保持し、パッケージの完全削除 (purge) の際にのみ削除するようにしなければいけません。

この挙動を行わせるやさしい方法は設定ファイルを conffile にしてしまうことです。 これはほとんどのインストールの場合にそのままで使え、 一部のシステム管理者が変更するかもしれない、そういう設定ファイルを添付できる場合だけに適した方法です。 更に、この方法を使うためには標準設定のファイルがパッケージの配布物に含まれていること、またインストール中 (やその他の際に) にメンテナスクリプトから書き換えを行わない、という二条件を満たしている必要があります。

パッケージの conffile にハードリンクを張ることは、ローカルで加えた変更を正しく残せなくなるため、許されていません

原則の解説: ハードリンクには二つの問題があります。 まず第一にそのうちの一つのファイルを編集する際にリンクを切ってしまうエディタがあり、 知らない間に二つのファイルのリンクが切られ、別なものになってしまうことがあります。 第二に、dpkgconffile のアップグレード時にリンクを切ってしまうかもしれません。

もう一つのやり方は、上記の挙動をメンテナスクリプトから実現する方法です。 この場合には設定ファイルは conffile として列挙してはならず、またパッケージ配布物に含まれていてもいけません。 パッケージにまずまずの設定を行うために、なんらかの設定ファイルが存在していることが必要な場合でも、 設定ファイルを作成し、更新し、維持し、完全削除の際に削除するようなメンテナスクリプトを提供することはパッケージメンテナの責任です (詳細は を参照ください)。 このスクリプトは結果の再現性を持たなければいけません (すなわち、dpkg がインストール中のエラーや、パッケージの削除のためスクリプトを再実行した場合に正しく動作しなければならないということです)。 また、このスクリプトは dpkg がメンテナスクリプトを呼び出す様々なやり方に対応できねばならず、ユーザの設定ファイルを前もって問い合わせることなしに上書きしたり壊したりしてはいけません。 またこのスクリプトは、特にアップグレードの時には、不必要な質問を行ったりせず、善良な市民として振る舞わなければいけません。

スクリプトはパッケージに設定しうるすべてのオプションを設定しなければならないわけではなく、 与えられたシステムでパッケージが動作するために必要な設定だけを行えば構いません。 理想的なことを言えば、システム管理者が postinst で (半) 自動的に行われた設定以外のことを行う必要がないのが、あるべき姿です。

通常取られる手法は package-configure という名のスクリプトを作成し、パッケージの postinst から設定ファイルが存在していないときのみ、そのスクリプトを呼ぶようにするやり方です。 時にはメンテナスクリプトが使う例や雛形ファイルを用意すると便利なこともあります。 そのようなファイルがある場合、アーキテクチャへのの依存関係の有無に沿って、 /usr/share/package または /usr/lib/package に置きます。 それが例なら /usr/share/doc/package/examples からそこへシンボリックリンクを作成してください。また、通常の dpkg で処理するファイルにして (すなわち、 設定ファイルでは無いようにする) ください。

これまで説明してきた設定ファイルの扱いの手法は混在させてはいけません。 それは、はちゃめちゃへの一本道です。 dpkg がパッケージをアップグレードする際に毎回ファイルを上書きするかどうか問い合わせてくるようになり、頭を掻きむしることになります。

設定ファイルの共用

同じファイルを conffile として指定しているパッケージ間は 競合 (conflict) していると指定しなければいけません。 これはファイルを共有してはいけないという一般則から来ています。 この場合は代替 (alternative) や待避 (diversion) の指定は適しません。 特に、dpkg は待避時の conffile をうまく扱えません。

メンテナスクリプトは、それ自身が収録されたパッケージを含む いかなるパッケージの conffile を変更してもいけません。

もし二つ以上のパッケージが同じ設定ファイルを使用し、 それらのパッケージを同時にインストールしても問題がない場合には、 これらのパッケージのうちの一つを設定ファイルの 所有者 (owner) と定義してください。 これはその設定ファイルを管理し、扱うパッケージです。 ほかのその設定ファイルを使用するパッケージは、 動作時にその設定ファイルが必要ならば、所有者となったパッケージに依存 (depend) する必要があります。 もしほかのパッケージが、その設定ファイルがあれば使うけれども、そのファイルが無くても動作はするということならば、依存関係の宣言は不要です。

もし二つ以上のパッケージが同じ設定ファイルを使用し、 かつ これらのパッケージが設定ファイルを変更する場合がある、という状況下では、以降の各項を満たすようにしてください。

関連したパッケージの一つ (『所有者』パッケージ) が前節で説明した方法で、メンテナスクリプトから設定ファイルを管理するようにします。

『所有者』パッケージは他のパッケージが設定ファイルを変更する際に用いるプログラムを提供しなければいけません。

関連するパッケージは設定ファイルを変更する際には上で記した 『所有者』パッケージの提供するプログラムを使わなければいけません。 また、関連するパッケージは変更のためのプログラムが存在することを保証するために『所有者』 パッケージに依存することを宣言するか、変更のためのプログラムがなかったときにはエラー等を出さず変更をあきらめるようにするかの、どちらかとしておかなければいけません (後者のシナリオでは、設定ファイルが存在していない場合に加えこの考慮も必要になります)。

場合によっては、他のパッケージの基本的な土台を作成し、共有の設定ファイルを管理する新パッケージを作成した方がいいこともあります (例として sgml-base パッケージを参考にしてください)。

ユーザ設定ファイル (ドットファイル)

/etc/skel にあるファイルは adduser に よって自動的に新ユーザのアカウント下にコピーされます。この /etc/skel 以下は他のどのプログラムからも参照しては いけません。

この関係で、プログラムが動作するのに $HOME ディレクトリにドットファイルをあらかじめ用意しておく必要があるならば、 ドットファイルはあらかじめ /etc/skel にインストールしておき、設定ファイルとして扱うべきです。

とは言っても、自分で自動的に作成するもの以外のドットファイルが正しく動作するのに必要なプログラムというものは望ましいものではありません。 加えて、プログラムは Debian の標準インストール状態で上流のデフォルトにできるだけ近い動作をするように設定されているべきです。

したがって、Debian パッケージのプログラムを真っ当に動くようにする設定が必要なら、 /etc 内にサイト共通で利用する設定ファイルを用意してください。 プログラムがサイト共通の標準設定ファイルをサポートしておらず、 パッケージメンテナがその機能を追加する余裕がないときは、 /etc/skel にユーザ個別のファイルをおいてもかまいません。

/etc/skel はできる限り空になるようにしましょう。 パッケージをインストールしたときに、ドットファイルを現存のユーザにコピーする簡単な (そして、適切な) 仕組みがないことからも、そうすべきなのは明らかだと思います。

ログファイル

ログファイルは通常 /var/log/package.log という名にします。たくさんの log ファイルを持つ場合や、 読み書き権限の設定のために独立のディレクトリを必要とする場合には (/var/logroot ユーザからのみ書き込めます)、 通常は /var/log/package という名のディレクトリを作成してそこにログを置くべきです。

ログファイルは時々循環させるようにして、どこまでも大きくなることがないようにしなければいけません。 これを実現する最良の方法は、ディレクトリ /etc/logrotate.d にスクリプトを置き、logrotate の提供する機能を使うやり方

従来のログファイルの扱いは、単純なスクリプトと cron を使って場当たり的にログを循環させるようにするものでした。 このやり方は望みに応じてどのような修正もできるという利点はありますが、システム管理者の作業が大量に必要になります。 初期の Debian システムではテンプレートとして使うスクリプトを自動でインストールするようにして多少作業が楽になるようにはしていましたが、十分とはいえませんでした。

Red Hat 社が開発した logrotate を使うほうがずっと良く、log を集中管理できます。 このプログラムは設定ファイル (/etc/logrotate.conf ) と、 パッケージがログを循環させるための設定を書き込むためのディレクトリ (/etc/logrotate.d) の両方を備えています。

です。 次に logrotate の設定ファイルのいい例を挙げましょう (詳しくは を見てください)。 /var/log/foo/* { rotate 12 weekly compress postrotate /etc/init.d/foo force-reload endscript } 上記の例は /var/log/foo 以下の全ファイルを巡回させ、 12 世代分保存し、循環終了時にデーモンに設定ファイルを再読込させるものです。

パッケージが完全削除 (purge) された時には、ログファイルがすべて消去されるよう (パッケージが削除されたときには消しません) にすべきです。 これは postrm スクリプトが引数 purge で呼ばれた際に行ってください ( 参照)。

ファイル属性と所有者

この節のここ以降で記載されているのは一般的なガイドラインですので、 必要に応じて細部でここから離れてもかまいません。 しかしながらやっていることがセキュリティ上問題がないこと、 またシステムのほかの部分との整合性を可能な限り維持していることを必ず確認してください。 おそらくまず debian-devel で相談するのがいいでしょう。

ファイルは root.root の所有権で、所有者書き込み可能で誰でも読める (および適宜実行可能である) ようにしてください。 すなわち、ファイルモードは 644 か 755 になります。

ディレクトリのパーミッションは 755、あるいは、グループが書き込み可であれば 2775 にすべきです。ディレクトリの所有者は パーミッションに合わせてください。 つまりディレクトリのパーミッションが 2775 であれば、そこに書き込む必要のあるグループのユーザを所有者に設定してください。

setuid や setgid された実行ファイルのパーミッションはそれぞれ 4755、2755 で、適切な所有者とグループに設定されねばなりません。 それらを読み込み不可 (4711 や 2711、4111 など) にしてはいけません。 誰でも自由に利用可能な Debian パッケージのバイナリを探してくることができるので、読み込み不可にすることはセキュリティ対策にはならず、単に不便にするだけです。 同じ理由で set-id していない実行ファイルに対して読み込み・実行許可を制限すべきではありません。

setuid を使う一部のプログラムではファイルのパーミッションを使って、 実行をある特定のユーザのみに制限する必要があります。 この場合 set-id したいユーザの uid を所有者として、実行を許可されたグループに実行許可を与えます。 この時のパーミッションは 4754 です。 繰り返しますが、実行を許さないユーザに対して読み込み不可にすることは、前述の理由で意味がありません。

システム管理者がローカルなセキュリティの方針に合わせるため、 各バイナリのパーミッションを変えてパッケージを再設定する枠組にしても構いません。 その場合は、以下で記載の通り dpkg-statoverride

dpkg でインストールされる通常のファイルは (conffile やその他の同様なファイルとは異なり) 再インストールしたときに配布時のパーミッションに戻ってしまいます。 但し、dpkg-statoverride を使えばこの動作を変更できます。 このやり方を使う場合には、パッケージの説明書に dpkg-statoverride についての記述を忘れずに入れるようにしてください。この機能が Debian に加わってまだそれほど経っていないので、多分まだあまり知られていません。

を使うことができます。 もう一つの方法として、例えばプログラムを利用することができるグループを作り、 setuid した実行ファイルはそのグループだけが実行できるような設定とすることもできます。

パッケージのために新しいユーザまたはグループを作成する必要がある場合、二つの方法があります。 第一の方法は、このユーザまたはグループを所有者としてバイナリパッケージの所定のファイルを作成します。 または、バイナリに単なる名前ではなくユーザあるいはグループ ID をコンパイル時に埋め込むようにもできます (この方法は静的に割り当てられた ID が必要となるため、可能な限り避けるべきです)。

静的に割り当てられた id が必要な場合、base システムの管理者にユーザあるいはグループ ID の割り当てを求めます。 割り当てられるまでパッケージをリリースすることはできません。 このようなユーザやグループが割り当てられたらならば、パッケージは当該 ID を /etc/passwd ないしは /etc/group に含むような base-passwd パッケージの特定以降のバージョンに依存するようにするか、 パッケージ中の preinst または postinst スクリプト等で、割り当てられた ID を (adduser などを使って) 自分で作成するようにしてください。 postinst で行うほうが、可能ならばより良いやり方です。 preinst を使う場合、adduser パッケージに対する先行依存関係の宣言が必要になります。

第二の方法は、プログラムが実行時にグループ名から uid、gid を決定するもので、ID は動的に 訳注:ここでの動的、はインストール時ホスト毎に、の意。 割り当てられます。この場合、debian-devel で討議を行い、また base システムの管理者にその名前が一意であること、静的に ID を割り当てたほうが望ましいということがないか、の二点を問い合わせて、その後適切なユーザ名あるいはグループ名を選ぶべきです。 これらの確認がすんだ後パッケージの preinstpostinst スクリプトで (繰り返しますが後者が好ましいです) 必要に応じて adduser を使ってユーザあるいはグループを作成するようにしてください。

名前に関連した ID の値を変えることはとても難しく、全ての関連したファイルをファイルシステムから検索する必要があることに注意してください。 後になってからの変更は問題を起こしますので、ID は静的か動的か良く考えて決めてください。

dpkg-statoverride の使い方

この節はポリシーの一部ではなく、dpkg-statoverride の使い方について解説することを意図しています。

dpkg-statoverride は廃止になった suidmanager パッケージを置き換えるものです。 以前 suidmanager を使っていたパッケージは Conflicts: suidmanager (<< 0.50) (または (<< 0.52) の) 競合関係指定エントリを追加すべきです。 また、メンテナスクリプト中の suidregistersuidunregister の呼び出しは単に削除してください。

システム管理者が配布状態の Debian パッケージと異なる所有者またはパーミッションでファイル (またはディレクトリなど) をインストールしたい場合、 ファイルがインストールされる際に毎回異なった設定を使うよう dpkg に指示を出すため dpkg-statoverride を使うことができます。 これによって、パッケージメンテナは標準のパーミッションでファイルを配布しておき、システム管理者が望む変更を加えられるようにすることができます。 例えばあるデーモンは通常 setuid root が必要になりますが、 ある特定の状況では setuid なしに使えるという場合、 .deb パッケージでは setuid 付きでインストールすべきです。 この場合、ローカルのシステム管理者が望みに応じてこれを変更することができます。 また、もしインストールの際に標準的な設定が二つある場合であれば、メンテナは debconf を使って好ましい選択を聞き、メンテナスクリプト中から dpkg-statoverride を呼んでシステム管理者の選択を適用することができます。

上記の通り、dpkg-statoverride は主にシステム管理者のためのツールで、メンテナスクリプトで必要になることは普通ありません。 但し、このような dpkg-statoverride の呼び出しがメンテナスクリプトで必要になる場合があります。 その一例が、動的に割り当てられたユーザやグループ ID を使う場合です。この場合、パッケージの postinst で以下の定石が参考になるでしょう。 ここで、sysuser が動的に割り当てられた ID 名です。 for i in /usr/bin/foo /usr/sbin/bar do if ! dpkg-statoverride --list $i >/dev/null then dpkg-statoverride --update --add sysuser root 4755 $i fi done パッケージパージの際、対応して dpkg-statoverride --remove を呼べば条件を削除できます。

プログラムの個々の設定 アーキテクチャ指定のための文字列

もしプログラムに アーキテクチャを指定するための文字列 が必要な場合には arch-os

現在、dpkg-archictecture では以下のアーキテクチャと OS が認識可能です。アーキテクチャとしては、 alphaarmhppai386ia64m68kmipsmipselpowerpcs390shshebsparcsparc64 です。 オペレーティングシステムとしては、 linuxgnufreebsdopenbsd です。ここでの gnu は GNU/Hurd オペレーティングシステムのために予約されています。

という書式に従わなければなりません。

私たちは、他の Linux ディストリビューションとの互換性をなくすので、 architecture-vendor-os の場所に arch-debian-linux を使わないようにしています。また、unknown は見苦しいので、 arch-unknown-linux も使いません。

デーモン類

設定ファイルのうち、/etc/services/etc/protocols/etc/rpcnetbase パッケージで管理されます。 ほかのパッケージはこれらに修正を加えてはいけません。

パッケージの都合でこれらのファイルに新エントリが必要な場合には、 メンテナは netbase パッケージのメンテナに連絡を取って、エントリを加えた新しい netbase パッケージをリリースしてもらうべきです。

設定ファイル /etc/inetd.confupdate-inetd スクリプトか、DebianNet.pm Perl モジュールを介さずにパッケージスクリプトから変更してはいけません。 エントリの追加に関してはそれらの説明文書を参照ください。

パッケージから /etc/inetd.conf に設定例としてエントリを挿入したい場合には、対象となるエントリは最初に一つだけのコメントキャラクタ (#) を置いてください。 そのように書かれた行は update-inetd からは『ユーザによってコメントアウトされた行』 と扱われ、変更されたりパッケージ更新時に有効化されたりすることはありません。

仮想 tty の使用、wtmp、utmp、lastlog 等の更新

一部のプログラムでは仮想 tty の作成が必要になります。これは C ライブラリのサポートがあれば Unix98 pty を使うことで実現できます。 このようなプログラムは、ほかの機能実現のために必要でなければ、 (仮想 tty の作成のためだけに) root に setuid してはいけません。

/var/run/utmp/var/log/wtmp/var/log/lastlog はグループ utmp に対して書き込み可能なようにインストールしなければなりません。 また、これらのファイルに書く必要があるプログラムは utmp に setgid してインストールしてください。

エディタとページャ

エディタやページャを、テキスト文書の編集や表示に使うプログラムがあります。 Debian ディストリビューションで利用できるエディタやページャにはたくさんの種類があるので、システム管理者とユーザが好みのエディタとページャを選択できるようにすべきです。

さらに、各々のプログラムは、ユーザまたはシステム管理者が特定の選択を行っていない場合には、ふさわしいデフォルトのエディタとページャを選択すべきです。

上記の理由で、エディタやページャを利用する各プログラムは、 EDITOR および PAGER 環境変数を利用してエディタとページャを決めなければいけません。 これらの値が設定されていなければ、プログラムは /usr/bin/editor/usr/bin/pager を利用するようにすべきです。

これら 2 つのプログラムは dpkg の代替パッケージ機能 (alternatives) を通して管理されています。 このため、エディタとページャ機能を提供する各プログラムは update-alternatives スクリプトを呼んで自分を登録しておかなければいけません。

EDITOR、PAGER 環境変数を参照して動作するようプログラムを修正するのが困難な場合は、 /usr/bin/sensible-editor/usr/bin/sensible-pager をエディタ及びページャのプログラムとして使うように設定してもかまいません。 これらは Debian 基本システムで提供されるスクリプトで、自動的に EDITOR と PAGER の各環境変数を調べて適当なプログラムを起動し、環境変数が未設定なら /usr/bin/editor/usr/bin/pager を起動します。

プログラムはユーザの好みのエディタを判断するのに VISUAL 環境変数を用いてもかまいません。この環境変数が定義されているならば、 EDITOR による設定より優先させてください。 /usr/bin/sensible-editor でもこの処理が行われています。

パッケージは editorpager に依存する必要はなく

Debian 基本システムが editor と pager プログラムを提供しています。

、パッケージからこの二つの仮想パッケージを提供する必要もありません。

Web サーバとアプリケーション

この節では Debian システムでの全ての web サーバと web アプリケーションから利用すべき場所 (ディレクトリ) といくつかの URL を説明します。

cgi-bin 実行ファイルは次のディレクトリにインストールしてください。 /usr/lib/cgi-bin/cgi-bin-name そして次のようにして参照できるように設定するべきです。 http://localhost/cgi-bin/cgi-bin-name

HTML 文書へのアクセス

各パッケージの HTML 形式の文書は /usr/share/doc/package に置きます。 また、次のようにして参照することができるようにしてください。 http://localhost/doc/package/filename

web サーバは文書ツリーに対するアクセスを、そのホストのクライアントのみがおこなえるように制限をかけるべきです。 もし web サーバがそのようなアクセス制御機能を持たないなら、 全くアクセスを許さないようにするか、 インストール時にアクセスを許すかどうかを問い合わせてください。

Web 文書ルートディレクトリ

web アプリケーションは Web 文書ルートディレクトリにファイルを置かないように努めてください。 代わりに、文書類には /usr/share/doc/package ディレクトリを用い、menu パッケージ経由で web アプリケーションとして登録するべきです。 どうしても Web 文書ルートディレクトリを使わざるをえない場合には、 /var/www を Web 文書ルートディレクトリとして使ってください。 これは、システム管理者が実際の Document Root として設定した場所へのシンボリックリンクかもしれません。

メール配送、配信、ユーザエージェント

電子メールを扱う Debian パッケージは、それがメールユーザエージェント (mail-user-agents、MUA) またはメール配送エージェント (mail-transport-agents、MTA) のいずれであれ、下記の設定基準に準拠していることを確認してください。 これが満たされない場合はメールを失ったり、From: 行がおかしかったり、他の流血の惨事を引き起こすかもしれません。

FHS に記載の通り、メールスプールは /var/mail であり、メールを送るインターフェースプログラムは /usr/sbin/sendmail です。 以前のシステムではメールスプールは物理的に /var/spool/mail に置かれているが、すべてのメールスプールのアクセスは /var/mail シンボリックリンクを介して行っていた場合もありました。 メールスプールは基本システム (Base System) の 一部で、MTA パッケージの一部ではありません。

Debian システムの MUA、MTA、MDA およびその他のメールボックスを参照するプログラム (IMAP デーモンなど) はすべて NFS 環境下で安全な方法を使ってファイルロックを行わなければいけません。 すなわち、fcntl() によるロックはドットファイルによるロックと併用しなければなりません。 デッドロックを避けるため、プログラムではまず fcntl() を使って、その次にドットファイルロックを使うか、二つのロックをブロックしないやり方

二つのロックが取得できない場合には、システムは二つ目のロックが取得できるまで待つのではなく、 最初のロックを解放して、乱数で決定した時間だけ待ち、再度ロックの取得をおこなうようにしてください。

で使うべきです。 liblockfile*パッケージ

これらの関数を使うには、liblockfile1 (>>1.01) への依存を指定する必要があります。 に含まれる maillockmailunlock を使うのが上記を実現するお勧めのやり方です。

メールボックスはシステム管理者が他を選ばない限り、通常はモード 660 user.mail のパーミッションです。 MUA は必要に応じてメールボックスを削除してもかまいません (特殊なパーミッションになっていない場合)。 その場合には MTA や ほかの MUA は必要に応じてメールボックスを再作成できなければなりません。 メールボックスは mail グループから書き込み可能でなければなりません。

メールスプールディレクトリは 2775 root.mail で、MUA は上記のロックを取得するため mail に setgid されているべきです。 当然、この特権を使って他の人のメールボックスにアクセスすることは避けなければなりません。

/etc/aliases がシステムのメールエイリアス (例えば、postmaster、usenetなど) が記載されたソースファイルで、システム管理者と postinst スクリプトからの編集が許されています。/etc/aliases をプログラムから、あるいは人手で編集した後には newaliases コマンドを呼び出さなければなりません。 全ての MTA パッケージは (実際には何もしないものであったとしても) newaliases プログラムを同梱していなければなりませんが 古い MTA パッケージにはこれがないものもありますので、たとえ newaliases が見つからなくてもプログラムが落ちな いようにしなければするべきです。また、このため全 MTA パッケージは mail-transport-agent 仮想パッケージに対して ProvidesConflictsReplaces の三つの関連性の定義をコントロールフィールド中で行う必要があります。

メールボックスに転送先のアドレスを書く仕組みはサポートされていません。 代わりに .forward ファイルを使ってください。

UUCPで使われる rmail プログラムは /usr/sbin/rmail にしてください。同様に batch-SMTP-over-UUCP を受け取る rsmtp は、サポートされている場合は、/usr/sbin/rsmtp に置くべきです。

パッケージで、ローカルで作成された外部へのニュースやメールのメッセージに対して使う名前 (など) が必要な場合は、/etc/mailname ファイルを使うべきです。 そのファイル中にはそのマシンのユーザのメールアドレスとして、ユーザ名と @ の後に続く部分が書かれています (最後に改行が入ります)。

このようなパッケージはこのファイルの存在をチェックしなければなりません。 そのファイルが存在すれば、それ以上の質問なしにそのファイルを使ってください (MTAの設定スクリプト中では、このファイルが存在している場合にこれを使うかどうかの質問をしてもかまいません)。 このファイルが存在しなければ、パッケージの設定中にユーザに /etc/mailname に書くべき内容を問い合わせ (debconf を使うのが好ましいです)、その内容を書いてください。 ここでの問い合わせでは、今問い合わせている名前は、 ここで問い合わせを行っているパッケージだけで使うものではないことがはっきり分かるように質問を行うよう留意してください。 例えば、inn パッケージでは次のように質問しています。 Please enter the `mail name' of your system. This is the hostname portion of the address to be shown on outgoing news and mail messages. The default is syshostname, your system's host name. Mail name [`syshostname']: ここで syshostnamehostname --fqdn の出力結果です。

ニュースシステムの設定

NNTP (ニュース) サーバやクライアントに関係した設定ファイルはすべて /etc/news 以下に置かなければなりません。

一台のマシン上での複数のニュースクライアントやサーバパッケージで用いる設定上の留意点があります。 それらを次に説明します。 /etc/news/organization

当該マシンの NNTP クライアントから投稿された記事の Organization ヘッダに現れる (べき) 文字列を格納します。

/etc/news/server

上流の NNTP サーバの FQDN が書かれています。 自分自身がニュースサーバでもある場合には localhost と書かれています。

そのほかのパッケージ間で使用するニュース関連の設定は必要に応じて適宜追加してください。

X ウィンドウシステム用のプログラム X サポートの提供とパッケージプライオリティ

X ウィンドウシステムに対応するよう構成可能なプログラムは X ウィンドウシステムへのサポートを含むように構成しなければいけません。 そして X ウィンドウシステム下で使用する際、実行時に必要な依存関係を満たすようにパッケージ依存関係を宣言しなければいけません。 また、このパッケージがそれが依存する X パッケージより高いプライオリティでインストールされる場合 (対象となるパッケージが standard またはより高いプライオリティでインストールされるものである場合) には、X 関連の部分を別パッケージに分離するか、X をサポートした別版のパッケージを作成するか、 パッケージのプライオリティを下げるかの何れかの対処を行う必要があります。

X サーバを提供するパッケージ

X サーバを提供するパッケージ、言い換えると直接または間接に実際の入力機器と表示ハードウェアを操作するパッケージはコントロールファイル中に仮想パッケージ xserverを提供することを

これは仮想パッケージリストにある xserver 仮想パッケージの使用法に関する現在の試行を実装し、ポリシーとしての実際の条項を提供したものです。 端的に言って、ディスプレイと入力ハードウェアに直接、または別のサブシステム経由 (GGI 等) でインターフェースする X サーバは xserver 仮想パッケージを提供すべきです。XvfbXnestXprt のようなものは仮想パッケージを提供すべきではありません。

宣言すべきです。

ターミナルエミュレータを提供するパッケージ

以下で記載する条件を満たすターミナルエミュレータを提供するパッケージは、コントロールファイル中に仮想パッケージ x-terminal-emulator を提供することを宣言すべきです。 また、このようなパッケージはまた自分自身をプライオリティ 20 で /usr/bin/x-terminal-emulator の代替とするよう宣言するべきです。

x-terminal-emulator であるためには、プログラムは次の条件を満たさなければいけません

DEC VT100 ターミナル、またはそれに互換なターミナルをエミュレートできること。

コマンド行オプション -e command によって、新しいターミナルウィンドウを作成でき

新しいターミナルウィンドウは、ウィンドウマネージャを親とする新しいトップレベルの X 上のウィンドウである必要はありません。 プログラムがそういう風にコーディングされているなら、複数文書インターフェース (MDI) での新しい "ビュー" であってもかまいません。

、その上で指定のコマンドが実行できること。

コマンド行オプション -T title で、ウィンドウタイトルに title を使った新しいターミナルウィンドウを作成できること。

ウィンドウマネージャを提供するパッケージ

ウィンドウマネージャを提供するパッケージは、コントロールファイル中に仮想パッケージ x-window-manager を提供することを宣言すべきです。 このようなパッケージはまた自分自身を次に説明するプライオリティで /usr/bin/x-window-manager の代替とするよう宣言するべきです。 まずプライオリティ 20 から始めます

ウィンドウマネージャが Debian メニューシステムをサポートしている場合、パッケージの標準設定でこのサポートが使えるようになっている (システムやユーザの持つ設定ファイルで、この機能を有効化する必要がない) 場合、20を足してください。 設定ファイルを変更しなければならない場合、10 だけを足してください。

もしウィンドウマネージャが の基準を満たしている場合、20 を足してください。

もしウィンドウマネージャが標準設定下で 別の ウィンドウマネージャを使って X セッションを再起動可能 (X サーバを再起動せずに) なら 10 を足してください。 それができないなら何も足しません。

フォントを提供するパッケージ

X ウィンドウシステムのフォント

Debian Policy の目的上、ここで X ウィンドウシステムのフォントといっているものは、X プロトコルリクエスト経由でアクセスされるものです。 Linux コンソールのフォント、PostScript 展開用のものやその他の目的で使うものはここの分類には含めません。 但し、そのようなフォントを X ウィンドウシステムで使えるようにするツールはこのフォントポリシーに従う必要があります。

を提供するパッケージでは X およびフォントサーバの変更なしにそれが有効になるように、また自分自身の情報を登録する際に他のフォントパッケージの情報を壊さないようにするため、いくつかの作業を行う必要があります。

X ウィンドウシステムでサポートされるフォントはどの種類のものでもプログラムやライブラリや説明文書 (ライセンス情報など、そのフォントに対するものはのぞいて) とは別のバイナリパッケージにしなければいけません。 もし、あるパッケージが (別パッケージで) パッケージングされた一つないし複数のフォントを適切な動作のために必要とするなら Recommended を、単に拡張機能を提供するだけなら Suggests を問題のフォントパッケージに指定してください。 パッケージからフォントパッケージに対して Depend を指定してはいけません

これは X サーバはローカルのファイルシステムとネットワーク越しの X フォントサーバの両方からフォントを得ることができるからです。 Debian パッケージシステムはローカルのファイルシステムを管理する能力しかありません。

BDF フォントは xutils パッケージ収録の bdftopcf ユーティリティを使って PCF フォントに変換し、gzip で圧縮し、解像度に応じたディレクトリに置かなければいけません。

100 dpi のフォントは /usr/X11R6/lib/X11/fonts/100dpi/ に置かなければいけません。

75 dpi のフォントは /usr/X11R6/lib/X11/fonts/75dpi/ に置かなければいけません。

絵文字フォント、カーソルフォントとそのほかの低解像度のフォントは /usr/X11R6/lib/X11/fonts/misc/ に置かなければいけません。

Speedo フォントは /usr/X11R6/lib/X11/fonts/Speedo/ に置かなければいけません。

Type 1 フォントは /usr/X11R6/lib/X11/fonts/Type1/ に置かなければいけません。 もしメトリックファイルが提供されているなら、それも同じディレクトリに置かなければいけません。

上記で並べられた以外の /usr/X11R6/lib/X11/fonts/ 以下のサブディレクトリを作成したり使ったりしてはいけません。 PEXCIDcyrillic ディレクトリは歴史的経緯で例外扱いされていますが、これらディレクトリ中にファイルをインストールすることはやはり避けたほうがいいでしょう。

フォントパッケージは上記の X フォントディレクトリに直接ファイルをおかず、 ファイルシステム中の実際の場所を指すシンボリックリンクをフォントディレクトリに置くようにしてもかまいません。 この場合、実際にフォントを置く場所は FHS 準拠の場所にしてください。

フォントパッケージに 75dpi と 100dpi の両バージョンのフォントを収録すべきではありません。 もし両方の解像度のものがあるなら、そのフォントを収録したパッケージ名に -75dpi-100dpi とを付けた独立のバイナリパッケージを提供してください。

misc サブディレクトリに収録されるフォントは、同じパッケージ中に 75dpi や 100dpi のフォントを収録していてはいけません。 その代わりに、そのフォントを収録したパッケージ名に -misc を付けた独立のバイナリパッケージを提供してください。

フォントパッケージはフォントディレクトリ中に fonts.dirfonts.alias 及び fonts.scale の各ファイルを収録してはいけません。

fonts.dir ファイルはどのような形でも収録してはいけません。

fonts.aliasfonts.scale ファイルは必要なら /etc/X11/fonts/fontdir/package.extension ディレクトリに収録すべきです。ここで fontdir は関連フォントが収録される /usr/X11R6/lib/X11/fonts/ 以下のサブディレクトリ名 (つまり、75dpimisc など) で、package はそのフォントを収録したパッケージの名前です。 また、extension はファイルの内容に従い scalealias のどちらかになります。

フォントパッケージは xutils (>> 4.0.3) への依存関係を宣言しなければいけません。

一つまたは複数の fonts.scale ファイルを収録するフォントパッケージでは、フォントをインストールした各ディレクトリで update-fonts-scale を当該ディレクトリに対して update-fonts-dir実行する前 に実行しなければいけません。 この実行の起動は postinst (全引数で) と postrm (upgrade 以外の引数で) の両方で行わなければいけません。

一つまたは複数の fonts.alias ファイルを収録するフォントパッケージでは、フォントをインストールした各ディレクトリで update-fonts-alias を実行しなければいけません。 この実行の起動は postinst (全引数で) と postrm (upgrade 以外の引数で) の両方で行わなければいけません。

フォントパッケージでは、フォントをインストールした各ディレクトリで update-fonts-dir を実行しなければいけません。 この実行の起動は postinst (全引数で) と postrm (upgrade 以外の引数で) の両方で行わなければいけません。

フォントパッケージは、既にパッケージ化されている他のフォントで使用しているエイリアス名と衝突するエイリアス名でフォントを収録してはいけません。

フォントパッケージは、既にパッケージ化されている他のフォントと同じ XLFD レジストリ名でフォントを収録してはいけません。

アプリケーションのデフォールト設定ファイル

アプリケーションデフォルト設定ファイルは /etc/X11/app-defaults/ にインストールしなければいけません (X Toolkit Intrinsics - C Language Interface マニュアル記載のように /etc/X11/ 下のサブディレクトリをローカルに使用することは許されます)。 これらは conffile であるとの属性を設定するか、設定ファイルとして扱わなければいけません。 パッケージに /usr/X11R6/lib/X11/app-defaults/ ディレクトリを収録してはいけません。

X リソースを使ったプログラムの設定も /etc/X11/Xresources/ に置くパッケージと同じ名前のファイルを用意することで

この機構は app-defaults とは同じではないことに注意してください。 app-defaults はローカルファイルシステムのクライアントバイナリと結びついていますが、 X リソースは X サーバに格納され、すべての接続されるクライアントに適用されます。

サポートされています。このファイルは、conffile であるとの属性を設定するか、設定ファイルとして扱わなければいけません。 重要 /etc/X11/Xresources/ ディレクトリにファイルをインストールするパッケージは xbase (<<3.3.2.3a-2) へのコンフリクトを宣言しなければいけません。 この宣言がなされていないと、パッケージのインストールの際に既存のシステム管理者の設定した /etc/X11/Xresources の中のファイルを壊す可能性があります。

インストール対象ディレクトリに関する事項

X ウィンドウシステムを使うパッケージは、imake を使った場合を除いて、/usr/X11R6/ 以下にファイルをインストールするよう設定すべきではありません。 /usr/X11R6/ ディレクトリ階層は X ウィンドウシステム自体のパッケージと、それが提供する imake を使ったプログラム以外では廃止になったと見なしてください。 imake を使ったプログラムの場合、 /usr/X11R6/ 外に移行するかどうかの判断はメンテナの裁量に任されています

imake を使ったプログラムが例外なのは、正しく書かれている場合リソースを探すパス名と自分自身をインストールする場所として X ウィンドウシステム自体が設定されている場所を使うからです。 このため、X ウィンドウシステムが /usr/X11R7//usr/X12/、または単に /usr/ に移った場合、そのようなプログラムはそれに対応した X ウィンドウシステム開発用パッケージのライブラリを用いてすべて再コンパイルする必要があります。

GNU の autoconfautomake を使うプログラムを /usr/X11R6/ ではなく /usr/ を使うようコンパイル時に変更するのは通常容易ですので、可能な限りそうすべきです。 ディスプレイマネージャやウィンドウマネージャの設定ファイルは /etc/X11/ ディレクトリ以下のパッケージ名称のサブディレクトリにインストールしてください。 これは、これらのプログラムが X ウィンドウシステムの動作と密に関連するためです。 アプリケーションレベルのプログラムは、ポリシー中で別途指示されていない限り /etc/ 以下を用いてください。 サブディレクトリ /usr/X11R6/include/X11//usr/X11R6/lib/X11/ 以下にファイルをインストールすることは許されていますが、できるだけ避けてください。 この場合、/usr/lib//usr/share/ が代わりに使えないか検討するべきです (プログラムがファイルを他の場所で探すように簡単に変更するのが難しい場合には X11R6 ディレクトリから FHS 準拠の場所へシンボリックリンクを張る方法もありますし、これは推奨できます)。 ディレクトリ /usr/bin/X11//usr/share/doc/X11//usr/include/X11//usr/lib/X11/ にファイルをインストールしたり、これらのディレクトリを収録したりしてはいけません。 但し、パッケージ内のファイルは、もしリソースが FHS 準拠の場所に移されていないならば、これらのディレクトリ (対応する X11R6 名称の /usr/X11R6/bin//usr/X11R6/include/X11//usr/X11R6/lib/X11/ ではなく) を参照すべきです。

The OSF/Motif と OpenMotif ライブラリ

DFSG 非互換の OSF/Motif または OpenMotif ライブラリ

このポリシー文書では OSF/Motif と OpenMotif をあわせて Motif と呼んでいます。

を必要とするプログラムでは、Motif の別実装でフリーな LessTif で問題なく動作するかを調べるべきです。 もし、Motif では動作するプログラムが LessTif では配布、サポートに耐えるだけ満足に動作しないとメンテナが判断したならば、二つの版のパッケージ、一方は Motif ライブラリに静的にリンクし -smotif をパッケージ名につけたもの 、もう一方は Motif ライブラリに動的にリンクし -dmotif をパッケージ名につけたものを作成すべきです。 どちらの Motif にリンクしたパッケージも DFSG に準拠しないソフトウェアに依存しているので、main ディストリビューションにはアップロードできません。 そのソフトウェア自体は DFSG に準拠したものであるときは、 contrib ディストリビューションにアップロードできます。 一方、知られている Motif の各版はすべて静的または動的に同ライブラリにリンクされたバイナリの再配布を許していますが、使っている Motif のライセンスで再配布が可能かどうかを確認するのはメンテナの責任です。

Perl プログラムとモジュール群

Perl プログラムとモジュールは、現在の Perl ポリシーに従うべきです。 この Perl ポリシーは ftp.debian.org/debian/doc/package-developer/perl-policy.txt.gz ファイル、またはお近くのミラーから取得できます。また、これは debian-policy パッケージにも収録されています。

Emacs lisp プログラム

emacs lisp プログラムをパッケージングする際には『Debian Emacs Policy』(emacsen-common パッケージの文書中に debian-emacs-policy.gz という名で収録されています) に当たってください。

ゲーム

/var/games のパーミッションはモード 755、所有者 root、グループ root です。

各ゲームは個々にセキュリティ方針を決めてかまいません。

ハイスコアファイル、保存ファイルなどの保護され、アクセスに特権 が必要なファイルを持つゲームは、オーナ・グループを root.games にして 2755 で set-gid しておき、ファイルとディレクトリには適当なパーミッション (例えば、770 root.games) を与えてもかまいません。 set-uid はセキュリティ上の問題が起きるのでしてはいけません (アタックする人は set-uid されたゲームを破ることができたら、そのファイルを他の実行ファイルで上書きし、ほかのプレイヤーがトロイの木馬を実行してしまうことになります。 set-gid されたゲームでは、アタッカーはあまり重要ではないゲームのデータだけにアクセスできるようになるだけで、 ほかのプレイヤーのアカウントを手にいれることができるとしても、それには更にかなりの労力を費すことになるでしょう)。

一部のパッケージ、例えば fortune cookie プログラムでは、データファイルやその他の静的な情報を読み込み不可でインストールし、提供される set-id されたプログラムによってのみアクセスできるように、上流の開発者が設定しています。 このようなことを Debian パッケージでやるべきではありません。 なんとなれば誰でも .deb ファイルをダウンロードしてきて中身を読むことができますから、読み込み不可のファイルを使っても無意味なためです。 また、読み込み不可のファイルを作らないことは set-id されたプログラムをたくさん作る必要がなくなることを意味しますし、引いてはセキュリティホールのリスクを減らすことにもなります。

FHS で規定されているように、ゲームのバイナリは /usr/games にインストールしてください。 X ウィンドウシステムを使うゲームもここに入れてください。 ゲームのマニュアル (X 用、X 不使用の両方とも) は /usr/share/man/man6 にインストールしてください。

文書 マニュアル(man ページ)

マニュアルは nroff 形式で /usr/share/man の適切な場所にインストールするべきです。また、セクションは 1 から 9 までのみをつかうべきです (詳しくは FHS 参照)。 フォーマット済みの cat 形式のマニュアルをインストールしてはいけません。

各プログラム、ユーティリティ、機能はそれに関連するマニュアルページを同じパッケージに含めるべきです。 すべての設定ファイルもそれに関連するマニュアルページを含めることを推奨します。

少なくとも各プログラムに付き一つの man ページがあるべきで、さらに各コンフィグレーションファイル、プロトコル、ユーティリティと関数に付き、一つの man ページがあるべきです。man ページが存在していない場合はバグと見なし、Debian バグトラッキングシステムにバグとして報告すべきです (自分で報告しておく、という処理でもかまいません)。 適切なマニュアルが収録されるまではバグ報告を閉じないでください。

マニュアルページを書くことはそんなに難しくありません。 や、 を見たり、debmakedh_make で作成されるサンプルを見てみてください。ヘルパープログラムの help2man や、/usr/share/doc/man-db/examples ディレクトリも参考になります。

上流の作者にマニュアルがないとの苦情を転送し、Debian バグトラッキングシステムでは 『転送済み』という処理にしてもかまいません。 GNU プロジェクトではマニュアルがないことは通常バグではないとしていますが、私たちはバグと見なします。 彼らがバグではないと連絡してきた場合では、何も処理せずに Debian バグトラッキングシステム上では『未解決』のままにしておいてください。

マニュアルは gzip -9 で圧縮してインストールしなければいけません。

一つのマニュアルページを複数の名前で参照する必要がある場合は、 .so 機能を使うよりもシンボリックリンクを使う方が望ましいやり方です。 ただ、上流のソースが .so

訳注:共有ライブラリとは関係がなく、nroff の .so コマンドのこと。

を使っている場合、それをあえてシンボリックリンクへ変更する必要はありません。 それが余程簡単でないかぎり行わないでください。 man のディレクトリではハードリンクを作成すべきではありません。 また、.so 命令の中に絶対パスのファイル名を書くべきではありません。マニュアルの .so 命令では、ファイルはマニュアルツリーの起点 (通常は /usr/share/man です) からの相対参照とすべきです。 もし、man ページの別名を指すためにリンク類 (シンボリックリンク、ハードリンクと .so コマンド) をファイルシステム中で使っていない場合、man があなたの man ページの別名を manpage のヘッダだけの情報から見つけることを

これを man でサポートすることは man ページを検索して、存在していないという答えを返すのに不当なまでの時間を要する結果にしばしばつながりますし、 ファイルシステムに残した方がいい情報を man のデータベースに持ち上げることでもあります。 このため、このサポートは非推奨にして、将来削除します。

期待するべきではありません。

Info 形式の文書

info 形式の文書は /usr/share/info へインストールしてください。 また gzip -9 で圧縮しておくべきです。

パッケージは Info システムの dir ファイルを更新するために postinst スクリプト中で configure 引数付きで呼び出されたときに install-info を呼び出すべきです。 install-info --quiet --section Development Development \ /usr/share/info/foobar.info

あなたのプログラムの場所を示すためにセクションを指定するのは良いことです。 それには --section オプションを使用してください。 どのセクションにするかは、自分のシステムの /usr/share/info/dir を見て最もふさわしいものを選んでください。 適当なものが見付からない場合は新しいセクションを作成してください。 --section オプションは二つの引数を取ることに注意してください。 最初の引数は存在しているセクションと一致させる正規表現 (大文字小文字は区別しません) で、もう一つは最初の引数に一致するセクションがないときに作成する、新しいセクション名として使います。

prerm では、remove 引数付きで呼び出された場合、次のようにしてエントリを削除するべきです。 install-info --quiet --remove /usr/share/info/foobar.info

install-info が info ファイル中に説明部のエントリ ポイントを見つけられない場合、エントリポイントを付け足さなければなりません。 この件の詳細は を参考にしてください。

追加文書

パッケージに付属しているそれ以外の文書はパッケージメンテナの裁量でインストールするかどうかを決めて下さい。 テキスト形式の文書は /usr/share/doc/package (package はパッケージの名称です) にインストールし、小さなものでない限り gzip -9 で圧縮しておくべきです。

対象とするパッケージを使うほとんどのユーザが必要としないような多量の文書を含むようなパッケージは、 そのような文書を収録した独立のパッケージを作成して、そのような文書を必要としないか、 インストールしたくないユーザがマシンのディスクスペースを消費しなくてもいいようにしておくべきです。

バイナリパッケージ中の /usr/share/doc/package にソースパッケージに付いている各種のテキスト文書 (README や changelog など) を入れるのは通常よい考えです。 ただ、まぁ当り前のことですが、パッケージの作成やインストール方法について書かれたものを含める必要はありません。

パッケージは、動作のために /usr/share/doc/ 以下のファイルが存在することを要求していてはいけません。

システム管理者が、プログラムが動かなくなることなく、 /usr/share/doc 中のファイルを消せるべきです。

プログラムから参照されるが、同時に単独のドキュメントとしても役に立つようなファイルは /usr/share/package/ 以下にインストールして、 /usr/share/doc/package/ からシンボリックリンクを張ってください。

/usr/share/doc/package が、 /usr/share/doc 以下の他のディレクトリへのシンボリックリンクとすることはできますが、 これが許されるのはこの両方のパッケージが同じソースから作成されたもので、かつ前者から後者へ Depends が指定されているときのみです。

以前の Debian リリースでは添付文書類は /usr/doc/package ディレクトリに収録されていました。これは、現在は、 /usr/share/doc/package に変更になっており、パッケージはディレクトリ /usr/doc/package に文書を置いてはいけません

以降の現在の時点では、/usr/doc/ へのシンボリックリンクはもはや必要としていません。 将来は、シンボリックリンクの作成はバグとなるようポリシーが変更されるでしょう。 。

好ましい文書形式

Debian プロジェクトでは 文書の形式の統一化は HTML を通して行なわれています。

パッケージに各種書式に変換可能なマークアップ形式の詳細文書が付属している場合は、バイナリパッケージには可能なかぎり HTML 形式のものを

原則の解説:ここで重要なことは、HTML 形式の文書が一連のパッケージの いずれかに パッケージに収録されているようにすべきだということです。 主バイナリパッケージ自体に収録されている必要はありません。

/usr/share/doc/package、 およびそのサブディレクトリにインストールしてください。

PostScript のような他の形式はパッケージメンテナの裁量で提供してください。

著作権関連情報

各パッケージには、著作権と配布条件のライセンス文書が元のままの形式で /usr/share/doc/package/copyright に収録されていなければいけません。 このファイルは圧縮されていたり、シンボリックリンクであったりしてはいけません 訳注:本節後半の GPL ほかの項参照

また、著作権情報ファイル中には元となった上流のソースをどこから手に入れたかを記載しなければなりません。 またパッケージの原作者の名前とパッケージ作成に関与した Debian メンテナの名前を載せるべきです。

/usr/share/doc/package/copyright にインストールされるファイルのコピーは debian/copyright に収録しておくべきです。

/usr/share/doc/package は、/usr/share/doc 以下の他のディレクトリ中のシンボリックリンクの相手先と同じソースファイルから作成されたものであること、および相手先に対して "Depends" で依存していることが宣言されていること、の二つの条件を満たすときのみ、シンボリックリンクとすることができます。 この規則は、著作権関連ファイルが機械的に抽出できるようにするために大切になるものです。

パッケージがカリフォルニア大学バークレイ校の BSD ライセンス、 Artistic License、GNU の GPL、GNU の LGPL に基づいて配布されている場合には、おのおの /usr/share/common-licenses/BSD/usr/share/common-licenses/Artistic/usr/share/common-licenses/GPL/usr/share/common-licenses/LGPL の各ファイルを参照するようにしてください。

copyright ファイルを一般的な README として使うべきではありません。 パッケージがそのような README ファイルとして書くべき内容を持っている場合は /usr/share/doc/package/README、 あるいは README.Debian やその他の適切な場所にインストールされるべきです。

設定例など

設定ファイルやソースファイルなどの例は /usr/share/doc/package/examples ディレクトリにインストールしてください。 これらのファイルをプログラムから参照してはいけません。 これらはシステム管理者やユーザの便宜のため、説明用として置かれている文書です。 アーキテクチャ固有の設定ファイル類は /usr/lib/package/examples にインストールし、 /usr/share/doc/package/examples から各ファイルにシンボリックリンクを張ってください。または、 /usr/share/doc/package/examples/usr/lib/package/examples ディレクトリへのシンボリックリンクであってもかまいません。

Changelog ファイル

Debian changelog ファイル (debian/changelog) には、あなたが上流のパッケージから Debian 向けのパッケージにした際に加えた変更を簡潔に記載すべきです。 他の変更や更新も、このファイルに記録として残されているべきです。

changelog 中の間違いは、元々の changelog エントリを編集して履歴を再作成して修正することもできますが、たいていの場合は新しい changelog エントリを作成することにするほうがよりよい方法です。

debian/changelog ファイルの書式は、 で説明されています。experimental ではないパッケージにおいては、 debian/changelog の書式としては、最新リリースの dpkg がサポートしているもの

別なフォーマットを用いたい場合、そのパッケージのソースパッケージ中にパーザを含めておけば用いても構いません。 このパーザは dpkg-genchanges および dpkg-gencontrol が期待しているものと API 互換である必要があります。 新しい書式が広く関心を引く (であろう) ものであるときには、 dpkg のメンテナに連絡をとり、その書式に対応するパーサを dpkg パッケージに含めてもらうようにして下さい。 (そのパーサとマニュアルページは、dpkg の一部として dpkg の他の部分同様 GNU GPL で配付することを認める必要があります)。

を使わなければなりません。

Debian 由来のものでないパッケージには、Debian ソースツリー内の debian/changelog の圧縮されたコピーが /usr/share/doc/package 中に changelog.Debian.gz として含まれていなければいけません。

上流の changelog がある場合は、それはプレーンテキスト形式で、 /usr/share/doc/package/changelog.gz としてアクセスできるようにすべきです。 changelog ファイルが HTML 形式で配布されているならば /usr/share/doc/package/changelog.html.gz という名称で参照できるようにすべきで

原則の解説: 元が別の名前だからとか HTML 形式だからといって、上流の changelog を参照するのに二カ所を見なければならないようにすべきではありません。

changelog.gz はプレーンテキスト形式として、例えば lynx -dump -nolist で HTML ファイルから作成すべきです。 上流の changelog ファイルがここで書いている命名規則に沿っていない場合での、ファイル名を変更する、 あるいはシンボリックリンクを使うなどの処置はパッケージ開発者の裁量に任せます。

これらすべてのファイルは、はじめは小さくとも時間と共に大きくなるため、 gzip -9 を使って圧縮してインストールすべきです。

上流の開発者と Debian メンテナが同一人物であるため Debian changelog と元々の changelog が一つの changelog となっている場合は、 changelog は /usr/share/doc/package/changelog.gz; にインストールしてください。上流に別の原作者がいるけれども元々の changelog がない場合にも、Debian の changelog は changelog.Debian.gz のままにしてください。

付録の紹介と、適用範囲

この付録は役割を終えたパッケージングマニュアル バージョン 3.2.1.0 からそのままの形で持ってきたものです。 これらは、パッケージメンテナの役には立ちそうなものも、まだポリシー文書には収録されていない章の部分です。 これらの節の多くはポリシーの内容として適切でないかもしれません。 そのような部分はパッケージングシステムの説明文書と考えた方がいいものです。 ここで言っておきたいのは、これらの文書はみなさんの便宜を図るため、そして歴史的経緯のため収録されたものだ、ということです。 これらはかってはポリシーパッケージの一部でしたし、dpkg の説明文書にまだ統合されていません。 ただこれらの文書にはまだ価値がありますし、それ故にここに収録されているのです。

これらは、ポリシー文書と整合が取れているかのチェックはなされていませんし、不整合な部分がある場合はポリシー文書が優先されます。 古いパッケージングマニュアルの残りの章はまた、既にポリシーマニュアルに収録されていない部分かどうかの検証もなされていません。 これらの両方のチェックはこれから行われる予定です。

【訳注:本文ではパッケージングマニュアルの旧訳の修正は必要に応じて実施しましたが、以下については殆ど手を入れていません。 実は相当に変なところや、明らかな間違いがあるのは分かっていますが、原文の方も本文とあっていないので強いて訳文だけ直すのはやめています。 また、本文と同じ文となっているところで、付録と本文が同じ訳文になっているかどうかの突き合わせもやっていません (大変な割に意味のある修正ではないため)。 上記の通り参考にとどめてください。】

dpkg はバイナリファイルを作成し、Unix システムにそれをインストールしたり削除したりするための一群のプログラム

dpkg は第一に Debian GNU/Linux を対象として作られているものではありますが、他のシステムでの動作や移植は可能です。

です。

このバイナリパッケージは、インストール済の実行可能なプログラム (通常はコンパイル済のバイナリ) と関連データの管理用に設計されています。 ソースコードの例やドキュメントを含むものもあります。

このマニュアルには、Debian のバイナリパッケージ (.deb ファイル) を作成する上での技術的側面が記述されています。 dpkgdselect 等のパッケージ管理プログラムの動作と、それらがどのようにパッケージを取り扱うかについて記述されています。

このマニュアルは、dselect のコア部分とアクセスメソッドスクリプトの間のやり取り、新しいアクセスメソッドの作成方法についても言及します。 アクセスメソッドスクリプトは、選択したパッケージの実際のインストールを担当します。

このマニュアルでは、パッケージ作成ツールやインストールツールのオプションや使い方についての詳しい説明は行いません。 それらのプログラムの manpage と一緒に読んで下さい。

dpkg と一緒に提供される update-rc.dinstall-info といった様々なシステム設定を行なうユーティリティープログラムについての詳細もここでは触れません。 これらについても、それぞれの manpage を見て下さい。

Debian パッケージに要求される、ファイルやディレクトリの許可属性、必要なドキュメント、アップロード手続き等の方針についてもこの文書には書いて ありません。 これらの詳細については Debian Policy Manual を見てください。 それらの多くは自分のパッケージをアップロードしたりディストリビューションの一部として利用できるようにするつもりがなくてもきっと役立つでしょう。

このマニュアルは dpkg System Administrators' manual をよく理解している人を対象に書かれています。 しかし、残念ながらそのマニュアルはまだありません。

Debian パッケージを作ってみたい人のために、FSF の GNU hello プログラムの Debian 版が例として提供されています。 Debian パッケージの作成と維持に非常に便利なツールとして debmake パッケージをお勧めします。 ツールや例は有用ではありますが、読んで従うべき文書としての Policy Manual や Programer's Manual の代わりにはなりませんので。

バイナリパッケージ (旧 Packaging Manual より)

バイナリパッケージは大きく分けて2つの部分からなります。 最初の部分には dpkg がインストールや削除に使う様々な制御情報ファイルやスクリプトが入っています。 を見てください。

二つめの部分はインストールされるファイルやディレクトリを含んだアーカイブです。

将来、他にもチェックサムや電子署名などがバイナリパッケージに含まれるようになるでしょう。 アーカイブのフォーマットについてはマニュアル deb(5) に完全な記述があります。

パッケージファイルの作成 - dpkg-deb

バイナリパッケージファイルの操作はすべて dpkg-deb で行います。この dpkg-deb はパッケージフォーマットを理解する唯一のプログラムです。 (dpkg-deb は必要に応じて dpkg から呼び出されます。dpkg は依頼されたオプションが dpkg-deb に適切なものかどうかを見分け、同じ引数で代わりに dpkg-deb を呼び出します)。

バイナリパッケージを作るためには、 パッケージのファイルシステムデータ部分に入れたいファイルやディレクトリを全て含むディレクトリツリーを作らなければなりません。 Debian フォーマットのソースパッケージでは、このディレクトリは通常はパッケージのソースツリーのトップからの相対パスで debian/tmp です。

これらのファイルやディレクトリは、インストールされた時にあなたが期待するシステム上での (あなたが作るディレクトリツリーのルートとの相対での) 位置と所有者と許可属性を持っていなければなりません。

現在のバージョンの dpkg では、 ユーザーとグループに用いる uid/username、gid/groupname の 対応はパッケージが作られたシステムとインストールされるシステムとで同じにすべきです

あなたが作るミニチュアファイルシステムのルートに DEBIAN という特別なディレクトリを 追加しなければなりません。 そこには制御情報ファイル、特にバイナリパッケージコントロールファイルが含まれます ( を見て下さい)。

DEBIAN ディレクトリはパッケージのファイルシステムアーカイブには入れられません。 従って、dpkg によってパッケージがインストールされる時にはインストールされません。

パッケージの準備ができたら次のようにします。 dpkg --build directory

これにより directory.deb にパッケージが構築されます (dpkg--builddpkg-deb のオプションであることを知っているため、 パッケージを構築するために dpkg-deb を同じオプションで起動します)。

新しく作られたファイルの中身を調べる方法についての詳細は manpage の を見てください。 次のコマンドの出力から役に立つ情報が得られることがわかるでしょう。 dpkg-deb --info filename.deb dpkg-deb --contents filename.deb dpkg --contents filename.deb To view the copyright file for a package you could use this command: dpkg --fsys-tarfile filename.deb | tar xof usr/share/doc/\*copyright | less

パッケージ制御情報ファイル

バイナリパッケージの制御情報部は dpkg が知っている名前を持ったファイルの集合です。 dpkg はこれらのファイルの内容を特別に扱います。 この中の一部の内容はパッケージのインストールや削除の時に dpkg に使われるものであったり、 パッケージ管理者が dpkg に実行させたいスクリプトであったりします。

パッケージ制御エリアにそれ以外のファイルを入れることはできますが、あまりいい考えではありません (もっとも、それらは通常無視されますが)。

ここで、dpkg がサポートする制御情報ファイルの簡単なリストとそれらが何に使われるかについての概要を挙げておきます。

control

このファイルには dpkg が使う鍵となる情報が書かれています。 このファイルによりパッケージ名とバージョンの指定や、パッケージに関する説明のユーザーへの提供、他のパッケージとの関連の指定などを行ないます。 を見て下さい。

このファイルは通常 dpkg-shlibdeps を補助として使い dpkg-gencontrol がソースパッケージ内の情報から自動的に作ります。 を見て下さい。

postinst, preinst, postrm, prerm

これらは dpkg が、パッケージのインストール、アップグレード、削除の時に起動する実行可能なファイル (通常はスクリプト) です。 これらのファイルにより、パッケージがパッケージに特有の事柄を扱ったり、dpkg が提供するよりもより複雑な処理をさせることが可能になります。 これらのファイルが、いつ、どの様に呼び出されるかについての詳細は を見て下さい。

これらのスクリプトに「常に同じ効き目」を持たせておく

つまり、そのスクリプトの実行が成功しても、失敗しても、そのスクリプトが再び呼び出された時に暴走せず、全てが正しく動作するいうことです。

ことは非常に重要です。 そのようにしておけば、もしエラーが起きたり、ユーザーが dpkg を中断したり、またその他の予期できない問題が起きても、後にひどく壊れたパッケージを残しません。

管理スクリプトは制御端末で実行されることが保証されており、ユーザーと対話することができます。 もしパスワードのプロンプトを出す場合は、dpkg がインストールの過程のログをとるためにスクリプトの標準入出力を同じところにリダイレクトするので /dev/tty を通じてフルスクリーンによる対話もしくは同様のことを行なわなければなりません。 同様に、これらのスクリプトは、ログをとる目的でパイプに標準出力をリダイレクトして実行される場合もあります。 そのため、Perl スクリプトは出力がバッファリングされずにすぐに表示されるようにするよう $|=1 とセットして出力をバッファリングしないように設定しなければなりません。

いずれのスクリプトも成功した場合には 0 、 失敗した場合には 0 以外を終了時の値として返さなくてはなりません。

conffiles

このファイルには dpkg により自動的に扱われなければならない設定ファイルのリストが含まれます ( を参照)。 すべての設定ファイルをここに書く必要はないことに注意して下さい。

shlibs

このファイルにはパッケージが提供する共有ライブラリのリストが、それぞれの依存関係の詳細と共に含まれます。 このファイルは dpkg-shlibdeps がパッケージコントロールファイルで、どの依存関係が必要かを決める時に使用します。 shlibs ファイルの書式については に記述があります。

メイン制御情報ファイル: control

dpkg がパッケージをインストールする時に使うもっとも重要な制御情報ファイルが この control です。 このファイルはパッケージの`人口動態統計'をすべて 含んでいます。

Debian ソースから作られたパッケージのバイナリパッケージ control ファイルは dpkg-gencontrol という特別なツールで作られます。このツールは debian/controldebian/changelog から必要な情報を捜し出します。詳細は を見て下さい。

バイナリパッケージコントロールファイルのフィールドは:

Package (必須)

Version (必須)

Architecture (必須)

この Architecture フィールドは、全てのパッケージに存在しなければなりません。 ただし、今のところ dpkg は、 古いパッケージもインストールできるように、 Architecture フィールドを要求しません。

Depends, Provides など

Essential

Maintainer

Section, Priority

Source

Description

Installed-Size

コントロールファイルの文法とこれらのフィールドの目的についての記述は で得られます。

タイムスタンプ

可能な限り上流のソースファイルの更新時間をパッケージ中に保持しておくこと

タイムスタンプを保持する根拠は、ファイルの作成時間を知ることによって伝わる情報があるからです。 例えば、ある文書の修正時間を見ることによって、それが非常に古いものであるのかどうかを判断することができます。 ですから、アップストリームのソースの修正時間を保持しておくのはとても良いことです。

をメンテナに推奨します。

ソースパッケージ (旧 Packaging Manual より)

Debian バイナリパッケージは Debian ソースから生成されます。 Debian ソースはバイナリパッケージを簡単に、かつ自動的に構築しやすいように特殊な形式になっています。

以前のバージョンの Debian ソースの形式は廃止されました。 古い形式のパッケージの変換についての説明は Debian policy manual にあります。

ソースパッケージを処理するためのツール

ソースパッケージを扱うために様々なツールが提供されています。 これらはソースをパックやアンパックしたり、バイナリパッケージの構築や新しいバージョンのディストリビューションを扱うのを手助けしたりします。

ここではこれらのツールの紹介と典型的な用途を説明します。 引数や動作についての完全な文書は を見て下さい。

Debian ソースパッケージをどうやって作るかの例と、 Debian ソースパッケージからどの様にこれらのユーティリティを使うかについては、例題パッケージである hello を見て下さい。

dpkg-source - Debian ソースパッケージの パックとアンパック

このプログラムは手動でよく使われます。また、 dpkg-buildpackage の様なパッケージに依存しない自動構築スクリプトからも呼び出されます。

パッケージをアンパックするには次のようにコマンドを実行します。 dpkg-source -x .../path/to/filename.dsc

この時、filename.tar.gz と、もし存在するなら filename.diff.gz は同じディレクトリに置いておきます。これにより package-version ディレクトリにソースをアンパックし、必要に応じて package-version.orig をカレントディレクトリにアンパックします。

パックされたソースアーカイブを作るには、次のコマンドを実行します。 dpkg-source -b package-version

これにより、.dsc.tar.gz と、もし必要なら .diff.gz がカレントディレクトリに作られます。 dpkg-source は最初にソースツリーに clean を行いません。必要な場合は別にやっておく必要があります。

も見て下さい。

dpkg-buildpackage - 全体的なパッケージ構築の制御スクリプト

dpkg-buildpackage は、dpkg-sourcedebian/rulescleanbuildbinary の各ターゲット、dpkg-genchanges を呼びだし、最後に pgp を呼んで署名済のソースパッケージおよびバイナリパッケージを作成、アップロードします。

このコマンドは、通常、すでに構築されている、あるいは未構築のソースディレクトリのトップレベルで手動で実行します。 引数なしで呼び出しても構いません。よく使う引数は次の通りです。 -uc, -us

それぞれ、.changes ファイル、ソースパッケージの .dsc ファイルに PGP サインをしないという指示です。

-ppgp-command

pgp-commandPATH で見つかる pgp の代わりに呼び出します。pgp-commandpgp と全く同じ動作をしなくてはなりません。

-rroot-command

root 特権が必要な時、root-command というコマンドを呼び出します。root-command は第 1 引数をコマンドとして、必要ならば PATH から呼び出し、第 2 引数以降を呼び出したコマンドに渡さなければいけません。 root-command が与えられなかった場合は、 dpkg-buildpackage は root 特権を得るための特別な動作をしません。 そのため、ほどんどのパッケージでは dpkg-buildpackage を root として実行しなければなりません。

-b, -B

2 種類の、バイナリのみの構築とアップロード - を見て下さい。

dpkg-gencontrol - バイナリパッケージコントロールファイルの生成

このプログラムは通常ソースツリーのトップレベルで debian/rules (を見て下さい) から呼び出されます。

これは通常、パッケージが構築されている一時的なディレクトリツリー中のファイルやディレクトリの許可属性や所有権を設定したあと、パッケージが dpkg-deb を用いて構築される直前に

これは、作成されるコントロールファイルが、正しい許可属性を持つようにするためです。

行なわれます

dpkg-gencontrol は、パッケージに入るファイルが一時的な構築ディレクトリの中に全て置かれた後で呼ばれなければなりません。 パッケージがインストールされた時のサイズの計算を正確にするためです。

また、dpkg-gencontroldpkg-shlibdeps の後で実行する必要があります。debian/substvars 中で dpkg-shlibdeps が行った 変数置換 (variable substitutions) を反映できるようにするためです。

ソースパッケージのトップから相対パスで debian/tmp にあるファイルからバイナリパッケージを一つだけ作成する場合は、通常 dpkg-gencontrol を呼び出せば十分です。

複数のバイナリを構築するソースでは、一般に次のようにする必要があります。 dpkg-gencontrol -Pdebian/tmp-pkg -ppackage -Pdpkg-gencontrol にパッケージをデフォルト以外のどのディレクトリで構築するかを伝え、 -p はどのパッケージのコントロールファイルを生成するべきかを伝えます。

dpkg-gencontrol は (例えば) dpkg-genchanges を将来呼び出すときのために debian/files 中のファイルのリストに情報を加えることもします。

dpkg-shlibdeps - 共有ライブラリの依存関係の算定

通常、このプログラムは dpkg-gencontrol ( を参照) の直前に、ソースツリーのトップレベルで debian/rules から呼ばれます。

このプログラムの引数は、バイナリパッケージのコントロールファイルに共有ライブラリの依存関係を含める必要のある実行形式

近くリリースされる新しいバージョンの dpkg では、実行形式と同様に、共有ライブラリも引数にして dpkg-shlibdeps を呼び出すことが要求されるでしょう。

引数となる実行可能ファイルには、それらの作られるソースツリーのある場所や、バイナリパッケージが作られる前に仮インストールされる構築ツリーのある場所を指定することもできます。

です。

検索された共有ライブラリが RecommendsSuggests のみを保証すべき場合や、Pre-Depends を保証すべき場合は、 それらの実行形式の前に -ddependency-field オプションをつけてこれを指示しなければなりません (各 -d オプションは次の -d が現れるまで有効です)。

dpkg-shlibdeps は出力されるコントロールファイルを直接修正することはしません。 代わりに、デフォルトでは shlibs:Depends の様な変数の設定を debian/substvars というファイルに加えます。 ソースコントロールファイルにはバイナリパッケージ毎にセクションがありますが、 これらの変数の設定は適切なセクションの依存関係フィールドから参照しなければなりません。

例えば、procps パッケージは 2 種類のバイナリを生成します。 predependency の必要な ps の様な単純な C バイナリと、 recommendation のみが必要な top の様なフルスクリーンの ncurses バイナリです。 これは debian/rules 内で次のように書けます。 dpkg-shlibdeps -dPre-Depends ps -dRecommends top そしてメインコントロールファイル debian/control で次のように書けます。 ... Package: procps Pre-Depends: ${shlibs:Pre-Depends} Recommends: ${shlibs:Recommends} ...

あるソースが提供する (複数の) バイナリパッケージが共有ライブラリに対して異なった依存要求を持つ場合は、 -pvarnameprefix オプションを利用することが出来ます。 このオプションはデフォルトの shlibs: プレフィックスを上書きします (このオプションを設定する毎に dpkg-shlibdeps を一回実行します)。それによって、 varnameprefix:dependencyfield という形式で依存変数の集合を幾つか作ることが出来ます。 これはバイナリパッケージコントロールファイルで適宜参照されます。

dpkg-distaddfile - debian/files へのファイルの追加

幾つかのパッケージのアップロードではソースパッケージやバイナリパッケージ以外のファイルを含める必要があります。

dpkg-distaddfiledebian/files ファイルにファイル記述を加えます。 dpkg-genchanges が実行されたときに .changes にそのファイルが含まれるようにする為です。

これは通常、debian/rulesbinary ターゲットで呼び出されます: dpkg-distaddfile filename section priority filenamedpkg-genchanges がそのファイルを見つけると思われるようなディレクトリ - これは通常ソースツリーのトップレベルの上のディレクトリ - に対する相対ファイル名です。debian/rules のターゲットは dpkg-distaddfile が呼ばれる直前か直後にそのファイルをその場所に置かねばなりません。

sectionpriority は、生成される .changes ファイルに変更されずに渡されます。 を見て下さい。

dpkg-genchanges - アップロードコントロールファイル .changes の生成

通常、このプログラムはパッケージに依存しない dpkg-buildpackage の様な自動構築スクリプトから呼び出されますが、手動で呼びだすこともあります。

このプログラムは通常、構築されたソースツリーのトップレベルで呼び出されます。 引数をつけずに呼び出した場合は、ソースパッケージの変更履歴ファイル、コントロールファイルの情報と、構築されているバイナリパッケージ、ソースパッケージの情報に基づいて、簡単な .changes ファイルを書きだします。

dpkg-parsechangelog - changelog の解析結果の生成

このプログラムは dpkg-source などで内部的に用いられます。 debian/rules や他の場所で使われるかもしれません。 変更履歴 (デフォルトでは debian/changelog) を解析し、そこに含まれる情報をコントロールファイル形式の表現で標準出力に出力します。

dpkg-architecture - パッケージを構築するシステム、あるいはホストシステムについての情報

このプログラムは手動で使用することもできますが、 dpkg-buildpackagedebian/rules によっても起動されます。 そこでは、パッケージを構築するマシンのアーキテクチャ、あるいはホストのアーキテクチャを示す環境変数や make 変数を設定します。 これらの変数は、パッケージ構築過程において必要なものです。

Debian 化されたソースツリー

以降で述べるソースアーカイブの構成は、関連した制御情報をもつ Debian 化されたソースツリーが容易に再現され輸送されるようにすることを意図したものになっています。 Debian 化されたソースツリーは、オリジナルのプログラムに Debian 化の工程の為のファイルを付け、残りのソースコードとインストールスクリプトに必要な変更を加えたものです。

Debian のために作られた特別なファイルは、 Debian 化されたソースツリーのトップレベルの debian ディレクトリに置かれます。

debian/rules - メイン構築スクリプト

このファイルは実行可能な makefile で、ソースからパッケージをコンパイルしバイナリパッケージを構築するためのパッケージ特有のレシピを含んでいます。

このファイルの先頭は #!/usr/bin/make -f という行でなければなりません。 make を明示的に実行するのではなく、 debian/rules という名前で実行できるようにする為です。

対話型の debian/rules スクリプトは、そのパッケージの自動コンパイルを不可能にし、さらにメンテナー以外の人が同じバイナリパッケージを再構築するのを難しくします。 ですから、全ての 必要なターゲット は非対話的でなくてはなりません。 最小限の範囲で言えば、必要なターゲットとは、 dpkg-buildpackage によって呼び出されるターゲット、つまり cleanbinarybinary-archbuild のことです。 また、これらのターゲットによって呼び出されるターゲットも非対話的でなくてはなりません。

必要なターゲットは次の通りです。 build

パッケージの構築、すなわち全てのパッケージの非対話的な設定とコンパイルを行ないます。 もしパッケージに構築前の設定作業がある場合は、 Debian 化されたソースパッケージは設定作業を行なった後で構築しなければなりません。 これは、設定を再びせずに構築出来るようにするためです。

パッケージは build-archbuild-indep の両方のターゲットを指定することが出来ます。 build-arch ターゲットが指定された場合、これはアーキテクチャ依存のバイナリパッケージ (これらのパッケージには、debian/controlArchitecture フィールドに all 以外のものが指定されています) を作成するのに必要なすべての非対話型の処理を実行します。 同様に build-indep ターゲットが指定された場合、これはアーキテクチャ非依存のバイナリパッケージ (これらのパッケージには、debian/controlArchitecture フィールドの値は all です) を作成するのに必要なすべての非対話型の処理を実行します。 build ターゲットは、build-arch または build-indep が rules ファイルに指定されている場合、それらに依存関係を指定すべきです。

build-archbuild-indep の一方あるいはいずれも指定されていない場合、 debian/rules を存在しないターゲットを指定して起動した際にはステータスコード 2 を返すべきです。 通常、make はターゲットが存在しない場合自動的に上記の結果を返します。

いくつかのパッケージで、同一のソースツリーからそれぞれ違う二つのバイナリパッケージを生成する場合があります。 build ターゲットはそういう場合には対応できません。 これらの場合は、それぞれの構築方法にしたがって、2 つまたは それ以上のターゲット (build-abuild-b やその他) を使用するのがよいでしょう。 そしてこの場合、単独の build はなにも実行しません。 binary ターゲットで、これらの可能な方法でパッケージを作成して、それぞれに対応したバイナリパッケージを生成することになります。

ルート権限が必要なことを build ターゲットで実行してはいけません。

また、build ターゲットの前には、 clean を走らせなければならないでしょう。

パッケージの設定ルーチンに長い時間がかかる時や、 makefile があまりよく設計されていない時、 build の前に clean が必要な時、構築プロセスの終了時に touch build を実行するのがよいでしょう。 これによって、debian/rules build が再度実行されたときに、プログラム全体を再構築しなくてすみます。

binary, binary-arch, binary-indep

binary ターゲットは、ユーザがこれだけでソースパッケージから生成されるバイナリパッケージ (複数のこともあります) をビルドできるようなものでなければいけません。 これらのすべてのターゲットは、非対話的に動作するものでなければなりません。 binary ターゲットは、二つの部分に分けられます: binary-arch は、特定のアーキテクチャ用のファイル、 binary-indep は、それ以外のものを生成します。

binary は、通常コマンドなしで単純に binary-archbinary-indep に依存するようなパッケージにすべきです。

両方の binary-* ターゲットは、 build ターゲットに依存すべきです。 このようにしておけば、もしパッケージビルド処理が済んでいないときはビルド処理が実施されます。 そしてその後 dpkg-gencontrol を使ってコントロールファイルを作成し、dpkg-deb でビルドを行って関連したバイナリパッケージを生成し、それをトップレベルディレクトリの親ディレクトリ中に置くべきです。

binary-* のうちの一つがなにもしない場合 (アーキテクチャ依存、非依存に関わらずソースから一つのバイナリパッケージしか生成しない場合) においても、なにもしない側の binary-* が存在しなければなりませんし、処理が成功したというあつかいとしなければ なりません

に、どのようにしてバイナリパッケージを構築するかが書かれています。

binary ターゲットは、ルート権限で起動されなければいけません。

clean

buildbinary ターゲットによる実行結果を元に戻します。 ただし、binary ターゲットの実行により親ディレクトリに作成された出力ファイルはそのまま残します。 このターゲットは、非対話的でなければいけません。

build ファイルが、前の項で述べたように、build ターゲット処理の最後に touch されて作成されていた場合、そのファイルは、clean の最初の作業として削除するべきです。 中断された clean の後に build が実行された場合、すべてが終了したと認識されてしまいかねないからです。

build ターゲットがルート権限で実行されたあと、及び binary ターゲットが実行された後には、clean ターゲットはルート権限で起動する必要があるかもしれません (例えば、clean はディレクトリを作成することもあるからです)。

get-orig-source (オプション)

主要なアーカイブサイトから最新版のオリジナルソースパッケージを取得します (FTP や WWW経由)。 これをオリジナルのソースの tar ファイル形式 (下記参照) に再構成し、現在のディレクトリに置きます。

このターゲットは、どのディレクトリからも実行しても構いません。 また残した一時ファイルを削除するよう気を遣うべきです。

このターゲットはオプションです。 しかしできる限りつけた方がよいでしょう。

The buildbinary 及び clean ターゲットはパッケージのトップディレクトリをカレントディレクトリとして実行されなければいけません。

公開されている、またはいないインターフェースのためや、パッケージ内部で使用するために debian/rules に他のターゲットを置くことは許されます。

パッケージを実際に構築するマシンや、インストールの対象となる マシンのアーキテクチャは、dpkg-architecture ( を見て下さい) を通して変数を設定することによって決定されます。 これにより、ホストマシンだけでなくパッケージの構築をするマシンの Debian アーキテクチャと GNU 型のアーキテクチャ指定文字列を得ることができます。 以下に、サポートされている make 変数を示します。

DEB_*_ARCH (Debian 形式のアーキテクチャ)

DEB_*_GNU_TYPE (GNU 形式アーキテクチャ指定文字列)

DEB_*_GNU_CPU (DEB_*_GNU_TYPE の CPU の部分)

DEB_*_GNU_SYSTEM (DEB_*_GNU_TYPE のシステムの部分)

*BUILDHOST のどちらかです。 BUILD の場合はパッケージをビルドするマシンの指定になり、 HOST の場合にはホストマシンの指定になります。

rules ファイル中で必要な変数に適切な標準設定値を設定することによって、後方互換性を保つことができます。 詳しくは dpkg-architecture のドキュメントを参照して下さい。

DEB_*_ARCH は、ビルドするまたはビルド対象となるマシンの Debian アーキテクチャのみを決定するのだということを理解しておくことは重要です。 CPU や システムの情報を得るのにこれを使ってはいけません。 その場合には GNU 書式の変数を使わなくてはいけません。

debian/control

ソースパッケージとそれから生成されるバイナリパッケージについてのバージョン非依存の詳細を含みます。

それは、制御フィールドのセットが連続したものです。 その書式はバイナリパッケージコントロールファイルに似ています。 フィールドのセットは、一つ以上のブランクで区切られます。 そして、最初のセットは、ソースパッケージについての全般的な情報です; それに続くセットには、ソースのツリーがバイナリパッケージを生成する方法について書かれています。

フィールドの書式とその意味するところについては、 をご覧ください。

一般的な、(バイナリパッケージ非依存) フィールド:

Source (必須)

Maintainer

SectionPriority(分類用、必須)

Build-Depends その他 (ソースパッケージの相互関連)

Standards-Version

バイナリパッケージごとのフィールド:

Package(必須)

Architecture (必須)

Description

SectionPriority (分類用)

Essential

Depends その他 (バイナリパッケージ間の関連性)

これらのフィールドは、dpkg-gencontrol がバイナリパッケージ用のコントロールファイルを 生成するとき (以下参照) や dpkg-genchanges がアップロードに付随する .changes ファイルを生成するとき、または dpkg-source がソースのアーカイブの一部として .dsc ソースコントロールファイルを生成するときに、使用されます。

また、これらのフィールドは、変数参照を含むこともあります。 それらの値は、出力コントロールファイルを生成するときに dpkg-gencontroldpkg-genchanges 及び dpkg-source によって使用されます。 詳細は、 をご覧ください。

ユーザ定義フィールド

ソースパッケージコントロールファイルにはユーザ定義フィールドを追加することができます。 これらは無視され、バイナリやソースパッケージコントロールファイル、アップロードコントロールファイルにはコピーされません。

出力ファイルにサポートされていないフィールドを付加したいときは、ここに述べる方法を使用してください。

メインのソースコントロールファイルにおいて、X から始まり、BCS とハイフン - が続くフィールドは、出力ファイルにコピーされます。 そして出力ファイルには、フィールド名のハイフンの後に続く文字部のみが使用されます。 ここで、B はバイナリパッケージコントロールファイルに使用されるとき、 S ソースパッケージコントロールファイルに使用されるとき、 C は、アップロードコントロールファイル (.changes) に使用されるときに使われます。

メインのソース情報コントロールファイルが以下のフィールドを含んでいるときは、 XBS-Comment: I stand between the candle and the star. バイナリとソースパッケージコントロールファイルは、次のフィールドを含みます。 Comment: I stand between the candle and the star.

debian/changelog

このファイルは、パッケージの Debian 特有の部分の変更を記録します

changelog の著者がパッケージの保守担当者でもある場合、パッケージの全ての変更に対して changelog を使わないようにすることもできますが、パッケージや元のソースの保守担当者が違う人になった時には、名前を変更しなければなりません。

このファイルは特別な書式を持っています。 これは、どのパッケージのバージョンが現在構築中なのか、またその他のリリース特有の情報を、パッケージ構築ツールが認識するためです。

その書式を以下に示します。 package (version) distribution(s); urgency=urgency * change details more change details * even more change details -- maintainer name and email address date

packageversion はソースパッケージの名前とバージョンです。

distribution(s) には、このバージョンがアップロードされるときにインストールされるディストリビューションがリストされます - これらは、.changes ファイルの Distribution フィールド にコピーされます。 をご覧ください。

urgency は、アップロード用の .changes ファイルの Urgency フィールドの値です。 をご覧ください。 コンマを含むフィールドを使用することはできません; dpkg の changelog 書式において、コンマは keyword=value 設定を分離するために使用されています (しかしながら、 現在のところ urgency として有効な keyword は一つだけです)。

詳細な変更点は、実際には最低二つのスペースではじまる一連の行に記されます。 しかしながら、慣習上それぞれの変更箇所はアスタリスクで始まり、文章との間を空けるためにスペースが続きます。 継続行は、インデントされます。 望むのであれば、変更箇所グループを分離するのに空行が使用できます。

管理者の名前と電子メールアドレスは必ずしも通常のパッケージ管理者である必要は ありません。 それらは この バージョンを作成した人について記されていなければいけません。 この情報は、.changes ファイルにコピーされ、その後アップロードの完了時に通知が送られることとなります。

date は RFC822 フォーマットでなければなりません

これは 822-date プログラムによって作成されます。

。それらは、数字によって表現されたタイムゾーンを必ず含んでおり、オプションとしてコメントの形でタイムゾーン名かその省略形を付加することができます。

パッケージ名ではじまる最初の `タイトル' の行は、左詰めにしなければいけません。 それに続く管理者、日付フィールドの詳細は正確に一つのスペースによってはじまらなければいけません。 管理者と日付フィールドの詳細は、正確に 2 つのスペースによって区切られていなければいけません。

この書式を編集するための debian-changelog-mode と呼ばれている Emacs モードがあります。 changelog の最後に変数節を付加することで、編集時に自動的にこのモードを選択するようにすることができます。

changelog の別書式の定義

使用したい書式のパーサを用意することで、標準的でない書式を使用することが可能です。

dpkg-parsechangelog にそのパーサを実行させるためには、そのファイルの最後の 40 行のある行を Perl の正規表現でマッチさせなければいけません: \schangelog-format:\s+([0-9a-z]+)\W 括弧内はフォーマット名でなければいけません。 例えば、以下のようなものです。 @@@ changelog-format: joebloggs @@@ changelog 書式名は空文字でない英数字の文字列となります。

もしそのような行があった場合、dpkg-parsechangelog は、/usr/lib/dpkg/parsechangelog/format-name か、/usr/local/lib/dpkg/parsechangelog/format-name にパーサを探しにいきます。 それが見つからない場合や実行形式のプログラムでなかった場合はエラーになります。 デフォルトのchangelog 書式は dpkg で、そのパーサは dpkg パッケージに収録されています。

パーサはファイルの最初に changelog が標準入力でオープンされた時に実行されます。 そして、必要な情報を決定するためにファイルを読みこみ (場合によってはファイルを探しもします)、 標準的な書式で一連の制御フィールドを標準出力にパース出力します。 デフォルトでは changelog 中に記載されている最新のバージョンのみの情報を出力しなければいけません。 -vversion オプションによって、正確にそのバージョン以降のすべての変更情報を出力しなければいけません。 この場合、changelog に version 存在していなかったら、エラーにしなければ いけません

利用可能なフィールドを以下に示します。

Source

Version (必須)

Distribution (必須)

Urgency (必須)

Maintainer (必須)

Date

Changes (必須)

(-v の使用によって) いくつかのバージョンに関する値が返されたとき、urgency の値は、すべてのバージョンの中で一番高い urgency の値になります。 maintainer と version、distribution、date は常に 最新のバージョンのものとなります。

Changes フィールドの書式については、 をご覧ください。

パースされた changelog フォーマットがすべて、またはほとんどすべてのそれぞれの change 項目間の空行が残されているときは、出力結果をコンパクトにするために、それらの空行は削除しておくべきです。

changelog フォーマットが日付やパッケージ名に関する情報を含んでいないときは、これらの情報は出力から削除されなければなりません。 パーサはそれらの情報を調合してはいけません。 または、他のソースからそれらの情報を見つけてきてはいけません。

changelog 中の書式が、予期したものではないときは、混乱したままパースを試みて多分に不正確な出力を生成するよりは、非ゼロの終了状態で終了すべきです。

changelog パーサはユーザとの対話的処理を一切行ってはなりません。

debian/substvars と変数の置換

dpkg-gencontroldpkg-genchangesdpkg-source がコントロールファイルを生成するとき、 出力に書きこむ前に変数置換を行います。 変数置換の形式は以下の通りです。 ${variable-name} オプションファイルの debian/substvars が、変数置換に用いられる変数を含んでいます; これらの変数は、ソースをパッケージするコマンドに -V オプションを 指定することで、直接 debian/rules から設定することもできます。 この場合、確実に先行定義されている変数が使用できるようになります。

これらは通常 debian/rules ターゲットによって生成され、動的に変更されます。 そのようにした場合は clean ターゲットによって削除されなければいけません。

debian/substvars の書式を含んだソースの変数置換の詳細については、 をご覧ください。

debian/files

このファイルは、ソースツリーの恒常的な部分ではありません。 パッケージを構築する途中、どのファイルが生成されたのかを記録するのに用いられます。 dpkg-genchanges が、.changes ファイルを生成するときにこれを用います。

これらはソースパッケージのアップロード版に含まれていてはいけません。 そして、それら (およびすべてのバックアップファイルと一時ファイル、 例えば、files.new

files.newdpkg-gencontroldpkg-distaddfile が一時的なファイルとして使います。 エラーが起こったときに作られる、問題のあるファイルをそのまま残しておかないようにするため、 この二つのプログラムは新しいバージョンの files をここに書き出し、そしてファイル名をかえます。

) は、clean ターゲットによって削除すべきです。 また、binary ターゲットのスタート時には、これらのファイルを削除するか空にして新しいスタートを確認することはよいやり方です。

dpkg-gencontrol は、.deb ファイル用のエントリを追加します。 この .deb ファイルは、これが作成するコントロールファイルを使って、 dpkg-deb によって生成されます。 たいていのパッケージが、このファイルに関してやらなければいけないことは、 clean ターゲットによって削除することだけです。

アップロードされたパッケージが、ソースパッケージとすべてのバイナリパッケージ、 dpkg-gencontrol によって生成されたそれらのコントロールファイル以外のファイルを含んでいるときは、 それらのファイルはパッケージのトップ階層ディレクトリの親ディレクトリに置かれなければいけません。 そして、debian/files のリストにファイルを追加するために dpkg-distaddfile を呼ばなければいけません。

debian/tmp

binary ターゲットによってバイナリパッケージを構築する際に標準的に使用される一時的ディレクトリです。 パッケージ構築の際は、tmp ディレクトリがファイルシステムツリーのルートになります (例えば、パッケージに付属する makefile の install ターゲットを使用するときや、出力をリダイレクトする場合です)。 また、DEBIAN サブディレクトリを含みます。 をご覧ください。

同じソースツリーから複数のバイナリパッケージが生成されるときは、通常複数の debian/tmpsomething ディレクトリを使用します。 例えば、tmp-atmp-doc といった具合です。

binary によって、どんな tmp ディレクトリが作成されたとしても、もちろん、clean ターゲットによって削除されなければいけません。

Source packages as archives

FTP サイトにおいてある様に、Debian ソースパッケージは 3 つの関連したファイルから成ります。 これら 3 つのファイルは、正しいバージョンのものを入手しないと利用することが出来ません。

Debian ソースコントロールファイル - .dsc

このファイルは一連のフィールドを含んでいて、各フィールドはバイナリパッケージのコントロールファイルと同様に識別され分離されています。 それぞれのフィールドの構文は で述べられています。

Source

Version

Maintainer

Binary

Architecture

Build-Depends (ソースパッケージ間の相互関係)

Standards-Version

Files

ソースパッケージコントロールファイルは、ソースアーカイブ構築時にソースパッケージの他のファイルから dpkg-source によって作られます。 ソースパッケージのアンパック時には、ソースアーカイブの他の 2 つの部分に含まれるファイルやディレクトリとのチェックが行なわれます。

もとのソースアーカイブ package_upstream-version.orig.tar.gz

このファイルは、プログラムの上流の作者からのソースコードを含む tar (gzip -9 されている) です。 この tar ファイルは package-upstream-version.orig というディレクトリ以下に展開されます。 それ以外の場所に展開されるようなファイルは入っていません。

Debian 化に伴う diff ファイル package_upstream_version-revision.diff.gz

このファイルは、オリジナルソースを Debian ソースに変換するのに必要な変更を行なうための unified context diff (diff -u) です。 プレインファイルの編集や作成といった変更のみを含むことが出来ます。 ファイルのパーミッション、シンボリックリンク先、特殊ファイルやパイプの特性の変更は出来ません。 またファイルの移動や名前変更も出来ません。

diff に含まれるディレクトリは、ソースツリーのトップにある debian ディレクトリ以外は前もって存在していないといけません。 debian ディレクトリは、アンパック時に必要な場合は dpkg-source によって作られます。

dpkg-sourcedebian/rules という実行ファイルを自動的に作ります (下を参照)。

オリジナルのソースコードがない場合 - 例えば、パッケージが Debian のために特別に用意されたものだったり、Debian maintainer が上流の maintainer でもある場合- は、 構成が少し違います。 diff ファイルは無く、tar ファイルは package_version.tar.gz という名前で package-version というディレクトリを含むものになります。

dpkg-source を使わない Debian ソースパッケージのアンパック

Debian ソースパッケージのアンパックには dpkg-source -x がお勧めです。 しかし、それが出来ない場合には次のような方法でアンパック出来ます。

tar ファイルを展開し、.orig ディレクトリを作ります。

.orig ディレクトリの名前を package-version に変えます。

debian ディレクトリをソースツリーのトップに作ります。

diff を patch -p0 として適用します。

Debian 化されたバージョンと一緒にオリジナルのソースコードも欲しい場合は、 tar ファイルをもう一度展開します。

dpkg-source を使わずに正当な Debian ソースアーカイブを作ることは出来ません。特に、 .diff.gz ファイルを作るのに diff 直接使おうとしてもうまくいかないでしょう。

ソースパッケージに含まれるものに対する制限

ソースパッケージには、ハードリンク

現在、ソースパッケージの構築中にハードリンクは検出されません。 ソースパッケージの展開時にのみ検出されます。

将来、ハードリンクが認められるかもしれませんが、それにはとても多くの作業が必要となります。

デバイスファイル、ソケットファイル、及び setuid や setgid されたファイル

setgid されたディレクトリは認められています。

が含まれていてはいけません。

ソースパッケージングツールは diffpatch を用いてオリジナルのソースと Debian 化されたソースの間の変更を処理します。.orig.tar.gz に含まれたオリジナルのソースツリーを Debian 化されたソースにするのに、これらのツールで処理出来ないような変更を伴ってはいけません。 ソースパッケージを構築する時に dpkg-source エラーで停止してしまうような問題のある変更は次の通りです。

シンボリックリンク、ソケット、パイプの追加や削除。

シンボリックリンク先の変更。

debian ディレクトリ以外のディレクトリの作成。

バイナリファイルの内容に対する変更。

ソースパッケージを構築する時に、dpkg-source 警告を表示し、処理は継続するような問題のある変更は次の通りです。

ファイル、ディレクトリ、シンボリックリンクの削除

ファイル名の変更については特別扱いしません。 つまり、古いファイルの削除(dpkg-source によって警告が発せられるか、無視されます) と新しいファイルの作成の組み合わせとして扱われます。

通常の最後の改行が (オリジナル及び修正版のどちらのソースツリーにも) ない変更されたテキストファイル。

変更が指摘されないが、dpkg-source によって検出もされない変更は次の通りです。

(debian/rules 以外の) ファイルやディレクトリのパーミッションの変更。

debian ディレクトリと debian/rulesdpkg-source によって別々に処理されます - 変更を行なう前に debian ディレクトリを作成し、 その後 debian/rules を誰もが実行できるようにします。

コントロールファイルとそのフィールド (旧 Packaging Manual より)

dpkg プログラム群のうちの多くは、コントロールファイルとして知られる共通のファイル形式を扱います。 バイナリとソースパッケージは、データを .changes ファイルに従って制御します。この、.changes ファイルは、アップロードされたファイルのインストールを制御し、 dpkg の内部データベースも類似したフォーマットになっています。

コントロールファイルの書式

このファイルは、一つまたはそれ以上のフィールドの段落から成ります。 段落は、空白行で区切られます。 いくつかのコントロールファイルは、一つの段落しか持てませんが、他のコントロールファイルは複数の段落を持つことができます。 その場合には、通常、別の段落は、それぞれ違うパッケージに対する記述になっています。

一つ一つの段落は、フィールドと値の連続したものです。 個々のフィールドは、名前とそれに続くコロンと値によって構成されます。 そして、行末が終りです。水平方向に連続する空白 (スペースとタブ) は値の前後に入れることもできますが、その場合は無視されます; 慣習として、コロンの後に一つの空白を入れます。

いくつかのフィールドは、複数行で構成されることもあります; この場合、継続行は、空白かタブで始まらなければ なりません。 フィールドの行の最後に続く空白やタブは全て無視されます。

明記されている場合を除いて、フィールドの本体は一行のデータのみが許されており、空白は意味を持ちません。 空白は、 名前 (パッケージやアーキテクチャ、ファイル、その他) やバージョン番号、複数のキャラクタのバージョン関係の中には、絶対にあってはいけません。

フィールドの名前には、大文字か小文字かは関係ありません。 しかし、以下に示すように、大文字小文字を混在させる場合には、最初の一文字だけを大文字にするのが普通です。

空白行や空白とタブでだけ構成されている行は、フィールドの値や、フィールドとフィールドの間にあってはいけません - それは、新しい段落を意味してしまいます。

dpkg とその関連ツールに関する範囲では、いくつかのフィールドがオプションとして扱われることに注意が必要です。 これらのフィールドは、すべての Debian パッケージに必要なものか、省略した場合に問題を引き起こすようなものである場合があります。 このため、 Debian パッケージのために、コントロールファイルを書くときは、 以下に記載された個々のファイルのフィールドに対する詳細説明に合わせ、 Debian Policy Manual を 必ず 読んでください。

フィールドのリスト Package

バイナリパッケージの名前です。パッケージの名前は、 英数字と + - . (プラスとマイナス、ピリオド) から成ります

@ : = % _ (アットマーク、コロン、等号、パーセント、アンダースコア) といった記号は、以前には認められていて、今でも、パッケージファイルの名前に現れた場合には許容されますが、新しいパッケージでは使ってはいけません。

名前には、少なくとも二つのキャラクタが必要です。 また、英数字で始まらなければいけません。現在のバージョンの dpkg は、ある程度、大文字と小文字を区別しています

これはバグです。

作ったパッケージがすでに大文字を使っているか、その他のフィールドから参照されている名前が大文字でない限り、パッケージの名前は小文字にしてください。

Version

これは、ソースやバイナリパッケージのバージョン番号を並べたものです。 を見てください。

Architecture

これは、アーキテクチャに関する文字列です; Debianアーキテクチャをある一単語で表わしたものです。

dpkg は、インストールする前に、コンパイル時のアーキテクチャと、バイナリパッケージ中で宣言されたアーキテクチャの値をチェックします。

all という特別の値の場合は、そのパッケージがアーキテクチャに依存しないということを示しています。

ソースパッケージの中の、メインの debian/control ファイル中や、ソースパッケージコントロールファイル .dsc の中には、スペースで区切られた複数のアーキテクチャのリストを書くことでもできます。 また、特別な値 any も許されます。 ソースファイルは、このリストにあるアーキテクチャに依存したパッケージとしてコンパイルされます。 そして、リストにあるアーキテクチャ以外では、おそらく正常に動作しないでしょう。 any は、ソースパッケージは特定のアーキテクチャに依存しないことを示しており、 あらゆるアーキテクチャにおいて正常にコンパイルできなければなりませんが、 生成されたバイナリパッケージは、アーキテクチャ独立ものではなく、 作成時に指定したアーキテクチャがなんであれ、そのアーキテクチャに特有の (依存した) ものとなります。

.changes ファイルの中の、Architecture フィールドは、そのパッケージが現在対応しているアーキテクチャを示します。 これはリストです。もし、特別なエントリ source があれば、そのパッケージのソースもアップロードされます。

パッケージ構築の過程でアーキテクチャをどのように得るかについての情報は、 を見てください。

Maintainer

パッケージメンテナの名前と email アドレスです。 最初に名前がこなくてはいけません。 その後に email アドレスを <> の中に (RFC822 フォーマットで) 入れます。

パッケージメンテナの名前にピリオドが含まれていると、RFC822 に規定されている文法のミスによって、全てのフィールドが email アドレスとして適用されなくなります; このフィールドをアドレスとして使用するプログラムは、これをチェックして、必要であれば修正しなければいけません (例えば、名前を括弧のなかに入れて最後尾に移動し、 email アドレスを前の方に持ってきます)。

.changes ファイルや解析された changelog データの中に、ある特定のバージョンのメンテナンスを担当している人の名前と email アドレスが含まれている場合 - これは、通常のパッケージのメンテナではないかもしれません。

このフィールドは通常、dpkg に関するかぎり、オプションです。 けれども、これがないとパッケージを構築するときに普通は警告がでます。

Source

このフィールドは、ソースパッケージの名前です。

メインのソース制御情報の中や、.changes ファイル、 .dsc ファイル、解析された changelog データ中のフィールドでは、ソースパッケージの名前だけが含まれます。

バイナリパッケージなかのコントロールファイルの中 (または、Packages ファイルの中) では、バージョン番号が括弧に入って続くことになっています

もしバージョンナンバーが指定されているなら、通常、パッケージの名前の後に一つの空白を残します。

このバージョン番号は、該当のバイナリパッケージの Version フィールドと同一の値を持っていた場合、dpkg-gencontrol によって削除されます。 また、ソースパッケージがバイナリパッケージと同じ名前とバージョンを持っていた場合は、このフィールド自体がバイナリパッケージコントロールファイルから削除されます。

パッケージ間の関連性を示すフィールド: Depends, Pre-Depends, Recommends Suggests, Conflicts, Provides, Replaces

これらのフィールドは、パッケージ間の関係を記述します。 を参照してください。

Description

バイナリパッケージの Packages ファイルかメインのソースコントロールファイルに、このフィールドが含まれている場合、この中にはバイナリパッケージに関するある特別な形式の説明文 (Description) を含みます。詳細は、 をご覧ください。

.changes ファイルは、アップロードされているパッケージに関する説明文の要約を含んでいます。 このフィールドが始まる直前の行は、空行です。 その後のそれぞれの行にバイナリパッケージ名とそのパッケージの説明文の要約が記されます。 それぞれの行は、一つの空白でインデントされます。

Essential

これは、バイナリパッケージのコントロールファイル中か、Packages ファイル、またはメインのソース制御データファイル中のパッケージごとの段落に記述される Yes/No の値です。

yes とセットしてあった場合、dpkgdselect は、このパッケージの削除を行いません (更新と置き換えとは出来ます)。 no の場合は、このフィールドを持っていない場合と同じです。

SectionPriority

この 2 つのフィールドは、パッケージを分類します。 Priority フィールドは、ユーザがこのパッケージをインストールする時のプライオリティを示します。 Section フィールドは、そのパッケージが分類されるアプリケーション分野を示します (訳注:net、mail など)。

これらが、debian/control ファイルにあった場合、 これらのフィールドは、.changes ファイル中の Files フィールドの section と priority サブフィールドの値となります。 これらはまた、バイナリパッケージの section と priority フィールドのデフォルト値となります。

この section と priority フィールドは、それぞれ独立したフィールドではなく、.changes ファイルの -File フィールドにそれぞれのファイルの情報として出てきます。 .changes ファイルの section の値は、パッケージを FTP アーカイブにアップロードするとき、そのインストール場所を決めるのに使用します。

dpkg には、これらのフィールドは通常関係ありません。 一方、dselect はパッケージをソートしてデフォルト値を選ぶときに、これらのフィールド値を使用します。 Debian パッケージの選択時の Priority フィールドの使用方法とその選択基準は Debian ポリシーマニュアルを見てください。 また、実際に使用されている Debian FTP アーカイブのリストを見てみるのもいいでしょう。

このフィールドはバイナリパッケージコントロールファイルに現れても構いません。 そのときは、Packages ファイルにこの情報が欠落していた場合のデフォルト値がここから採られます。 dpkgdselect は、他に参照できる情報がない場合だけ、.deb ファイルからこれらの情報を得ます。Packages ファイルの情報が常に優先されます。デフォルトでは、 dpkg-gencontrol は、バイナリパッケージのコントロールファイルに section と priority フィールドを入れません。 もし、入れたいのであれば、-isp-is-ip オプションを付けてください。

Binary

このフィールドはバイナリパッケージのリストです。

.dsc ファイルに記載されている場合は、それはそのソースパッケージが生成できるバイナリパッケージのリストです。 すべてのアーキテクチャで、ここに記載された全バイナリパッケージが生成できる必要はありません。 個々のバイナリパッケージがどのアーキテクチャに対応しているかの詳細は、ソースコントロールファイルには含まれません。

これらの項目が、.changes ファイルのなかにあったなら、それは実際にアップロードされているバイナリパッケージの名前のリストです。

その書式は、コンマで区切られた

慣行上、コンマの後には空白を入れます。

バイナリパッケージのリストです。 現在は、.changes ファイルの中は空白だけで区切られていなければいけません。

Installed-Size

このフィールドは、バイナリパッケージのコントロールファイルと Packagesファイルに現われます。 そのパッケージをインストールするのに必要なディスク容量を示します。

ディスク容量は、十進整数であらわされ単位はキロバイトです。

Files

このフィールドは、ファイルとそれについての情報を逐一記したリストから構成されます。 厳密な情報と書式は使われる状況によります。 どの場合においても、 フィールド名 (即ち Files:) のある行にはフィールドの内容は記述できません。 引き続く残りの部分には 1 つのファイルにつき一行の内容が記されます。 このとき各行は 1 つの空白文字でインデントされ、フィールドの各副フィールドが空白で区切られて続きます。

.dsc (Debian ソース制御) ファイルの場合には、このフィールドには tar ファイルと必要ならソースパッケージの残りの部分になる diff ファイルの各々について、MD5 チェックサム、サイズ、ファイル名が記されます。 この diff ファイルは、ソースパッケージの変更分

つまり、tar ファイルに無い部分のうちで、.dsc ファイル以外の部分のことです。

です。ファイル名などの項目についての正確な書式は、 をごらんください。

.changes ファイルの場合には、このフィールドには 1 つのアップロードされるファイルごとに 1 行ずつ、 MD5 チェックサムとサイズ、セクション、プライオリティ、ファイル名が記述されます。 セクションとプライオリティフィールドはメインのソースコントロールファイルの対応する値となります。 をごらんください。 もし、セクションとプライオリティが決定されていなかったら、 - を使うべきです。 しかしながら、セクションとプライオリティの値は新しいパッケージを適切にインストールするため、本来指定しておかなければならないものです。

.changes ファイルのセクションが byhand という特別の値であれば、該当するファイルは通常のパッケージファイルとして扱えないため、 ディストリビューション管理者が手動でインストールしなければなりません。 セクションが byhand 値であった場合には、プライオリティは - にすべきです。

新しい Debian パッケージをリリースする時に、新しい上流のソースアーカイブの配布を伴わない場合、 .dsc ファイルの Files フィールドには、オリジナルのソースアーカイブ package-upstream-version.orig.tar.gz に対するエントリを含んでいなければなりません。 一方、.changes ファイル中の Files フィールドにはこのエントリがあってはいけません。 この場合、配布サイトのオリジナルソースアーカイブは、アップロードしようとしている .dsc ファイルと、diff ファイルを生成するのに使用されたソースアーカイブとバイト単位で正確に一致していなければなりません。

Standards-Version

パッケージのコンパイルの基準となる文書 (dpkg プログラマーズマニュアル、ポリシーマニュアルおよびそれに関連するテキスト) のバージョンです。 新しい基準と整合性をとるためにソースパッケージを編集したときに、メンテナが手で更新します。 時々、そのパッケージに注意を喚起するために使われます。

このフィールドのフォーマットはバージョン番号のフィールドと同じですが、epoch や Debian revision は許されていません。 をごらんください。

Distribution

.changes ファイルか changelog の解析出力には、 このパッケージがインストールされていた、またはこれからインストールされるディストリビューションの名前が空白で区切られて含まれます。 ディストリビューションの名前は、パッケージの名前の規則に従います ( をごらんください)

現在、ディストリビューションの取り得る値は stable

これは、現在の Debian GNU/Linux としてリリースされているバージョンです。 新しいバージョンは、開発コードが凍結されたのち一ヶ月ほどのテスト期間をおいて、だいたい三ヶ月ごとにリリースされています。 ディストリビューションが、stable になり安定したら、主要なバグフィックスだけが許されます。 このディストリビューションに変更が加えられるときは、リリース番号が増えます (例えば、1.2r1 は 1.2r2 になり、1.2r3になります)。

unstable

このディストリビューションは、Debian の配布ツリーの中で、開発中のものであるということを示します。 新しいパッケージおよびパッケージの最新のバージョン、バグフィックスが含まれます。 個人の責任においてダウンロードしてください。

contrib

このディストリビューションのパッケージ群はポリシーマニュアルに規定されている Debian の main ディストリビューションの配布条件を満たしていませんが、 contrib の配布基準は満たせているようなものです。 現在のところ、contribnon-free ディストリビューションのパッケージに関しては stable か unstable かという区別はありません。 これらのディストリビューションからダウンロードするときは自分で判断を行ってください。

non-free

contrib セクションのパッケージと同様に、 non-free のパッケージはポリシーマニュアルに規定されている Debian の main ディストリビューションの配布条件を満たしていません。 これらのディストリビューションからダウンロードするときは自分で判断を行ってください。

experimental

このディストリビューションのパッケージは、メンテナから、ハイリスクであると宣言されています。 初期のβ版や開発中のパッケージで、多くのソースコードから構成されている開発中のパッケージや、試してほしいと思っているけれども Debian の他の ディストリビューションに含まれるほどの完成度ではないものが含まれています。 これらのディストリビューションからダウンロードするときは自分で判断を行ってください。

frozen

時々 (現在ではだいたい三ヶ月ごと)、unstable ディストリビューションが、「コード凍結」の状態に移行します。 stable バージョンとしてリリースされるためです。 このテスト期間 (ふつう四週間です) には、現存するバグか新しく発見したバグについての手直しだけが許されます。

パッケージをアップロードするときには、そのパッケージがアップロードされる、 すべての ディストリビューションにアップロードしなければいけません。 例外をのぞいて、stable ディストリビューションへのアップロードは、 (もしあれば) frozenunstable にも行ないます。 同様に、frozen にアップロードするときには unstable にもアップロードしてください。

Urgency

以前のバージョンからのアップグレードがどの程度重要なのかを示します。 たいてい LOWMEDIUMHIGH のうちの一つのキーワードから成ります。 空白で区切られたコメント (たいてい括弧にはいっています) がオプションとしてつくこともあります。例えば: Urgency: LOW (HIGH for diversions users)

このフィールドは、.changes ファイルの中と、パースされた changelog 中にあらわれます。そして、dpkg 形式の changelog においては、urgency 属性としてあらわれます (をごらんください)。

Urgency キーワードは、大文字でも小文字でも構いません。

Date

このフィールドは、.changes ファイル中と、パースされた changelog 中にあらわれます。 そして、パッケージの作成された日付か最後に変更された日付を示します。

Format

.changes ファイルにあらわれるこのフィールドは、ファイルのフォーマットのバージョンを指定します。 この手引きに書かれているフォーマットは、 バージョン 1.5 です。書式はバージョン番号と同じですが、debian-revision や、epoch は許されていません。 をごらんください。

Changes

このフィールドは、.changes ファイル中や、 パースされた changelog 中に現われます。 このフィールドは、人が読むための変更点のデータを示します。 一つ前のバージョンと現在のバージョンとの相違を説明します。

最初の改行までは何もデータを含んではいけません。 そして、それに続く各行は、最低限一つの空白によってインデントされなければなりません。 空行は、空白とピリオドだけからなります。

それぞれのバージョンの変更情報は、「title」行の後に続きます。 この「title」行には、すくなくとも、バージョン、ディストリビューション、緊急度のフィールドが人が読める形式で含まれています。

もし、いくつかのバージョンのバージョン情報が返されるような場合、 最新のバージョンに対するものを最初に返すようにすべきで、 同時に空行を入れてエントリ行を分割してください (「title」行の後もまた空行のあとで 続けてください)。

Filename and MSDOS-Filename

Packages ファイルにあるこれらのフィールドは、 ディストリビューションディレクトリのパッケージ、またはパッケージの一部のファイル名を、 Debian 階層構造のトップからの相対パスで示します。 そのパッケージがいくつかの部分に分かれているときは、順番に空白で区切られて並べられます。

Size and MD5sum

Packages ファイルにあるこれらのフィールドは、 サイズ (単位は十進法で表現されたバイトです) とディストリビューションのバイナリパッケージを構成するファイルの MD5 チェックサムです。 パッケージがいくつかの部分に分かれているときは、順番に空白で区切られて並べられます。

Status

このフィールドは dpkg のステータスファイルに含まれます。 そして、ユーザがパッケージをインストールしたか、また削除されたか、そのまま残しておいたのか、あるいはそのパッケージが壊れている (再インストールが必要) かどうか等、現在のシステムの状態を示します。 それぞれの情報は一単語で示されます。

Config-Version

パッケージがインストールまたは設定されていなかった場合、 dpkg のステータスファイル中のこのフィールドは、ユーザによってきちんと設定されてインストールされたときの最後のバージョンを記録しています。

Conffiles

dpkg のステータスファイル中のこのフィールドは、自動処理されるパッケージ中の設定ファイルについての情報を保持します。

廃止されたフィールド

これらは、dpkg によって認識されますが、使ってはいけません。 これらは互換性のためだけに残されています。 Revision Package-Revision Package_Revision

パッケージバージョンの Debian バージョンの部分は、以前はコントロールファイル中の分離された一つのフィールドでした。 このフィールドは、このようにいくつかの名前で実装されていました。

Recommended

Recommends の古い名前。

Optional

Suggests の古い名前

Class

Priority の古い名前

設定ファイルの取り扱い (旧 Packaging Manual より)

dpkg はパッケージ設定ファイルをある程度自動的に操作できます。

そのメカニズムが妥当かどうかは、多数の要因によります。 けれども、基本的にはある特定の設定ファイルに対して二つのアプローチがあります。

簡単な方法は、パッケージ中にできうる限り最良のパッケージ設定ファイルを含んだ形でリリースし、以降の更新には dpkg の conffile メカニズムを使用することです。 設定ファイルをユーザが編集することがなさそうでも、仮に編集していた場合にはその編集が失われないようにしたい、またはそのパッケージの新しいバージョンはそんなに頻繁にはリリースされない、そんな場合にはこれは適したアプローチです。

より複雑な方法として、設定ファイルを postinst スクリプト中でスクラッチから構築する方法があります。 そして、パッケージの初期のバージョンからのバグをその中で自動的にフィックスしていくようにします。 これは、構成ファイルがそれぞれのシステムによって違う場合に使用される方法です。

dpkg による設定ファイルの自動操作

パッケージに は、conffiles と呼ばれるコントロールファイルを含めることができます。 このファイルは、自動操作を必要とする設定ファイル名一覧です。 設定ファイル名は、一行につきひとつのファイルを絶対パスで書かれていなければいけません。 また、参照されるファイルはパッケージ中に含まれていなければいけません。

パッケージが更新されるとき、dpkg は、設定の段階において、設定ファイルを処理します。 設定の段階とは、パッケージの postinst スクリプトを実行する直前です。

dpkg は、それぞれの設定ファイルについて、パッケージに含まれているものが現在のバージョン (つまり、今アップグレードしようとしている) のパッケージに最初に含まれていたものと同一のものであるかをチェックします。 同時に、現在のバージョンのパッケージで最初に提供されていたものと、現在システムにインストールされているものとの比較も行います。

ユーザとパッケージ管理者のどちらがもが設定ファイルを変更していない場合は、設定ファイルはそのままインストールされます。 どちらかが以前のバージョンの設定ファイルを編集していた場合は、その編集されたバージョンが優先されます。 つまり、ユーザが設定ファイルを編集しており、パッケージ管理者が違ったバージョンを出していなかったなら、 何の報告も無しに、ユーザの変更がそのまま残されます。 けれども、パッケージ管理者が新しいバージョンを出していて、 ユーザが設定ファイルに手を加えていなかった場合は、新しいバージョンがインストールされます (このとき、そのことを知らせるメッセージも表示されます)。 ユーザもパッケージ管理者も両方が設定ファイルを変更していた場合は、 ユーザが自分自身でこの問題を解決するように、入力を促すプロンプトを出力します。

この比較は、ファイル中の MD5 メッセージダイジェストを計算することによって行なれます。 そして、そのインストールされた最新バージョンのファイル中の MD5 を同様に保存します。

そのパッケージのインストールが初めてだったときは、 dpkg は、そのファイルが、現存システムのファイルを上書きするものでないかぎり、そのままインストールします。

けれども、dpkg は、ユーザまたはスクリプトによって削除された設定ファイルを上書きすることは ありません。 いくつかのプログラムにおいては、ある設定ファイルが存在しないことによって、他の方法では代替できないような効果をねらっているものがあります。 したがって、もしユーザがそうしたのであれば、削除されたファイルはそのままにしておく必要があります。

パッケージは、パッケージ管理スクリプトの中では、dpkg によって操作されるconffile を変更することは できません。 もし、これを行った場合、パッケージのアップデートのとき、 dpkg は、ユーザを混乱させる、また潜在的に危険なオプションを与えることになります。

管理スクリプトによる設定の取扱い

ホスト名やネットワークの詳細など、サイト依存の情報を含むファイルは,パッケージの postinst スクリプトによって、作成するようにするのがよいでしょう。

たいてい、値や他の情報を決定するのに、システムの他の部分の状態が必要となります。 そして、その情報が得られないときは、プロンプトを出力して、ユーザに情報を入力してもらうことになります。

この方法を使用するとき、重要なことをいくつか考慮しなければいけません。

設定ファイルを生成するプログラムにバグを発見した場合や、そのファイルのフォーマットが以前のバージョンから変更されたときには、 postinst スクリプトを編集しなければならなくなるでしょう。 ふつう、この場合は、インストールされた設定ファイルから、問題をとりのぞくことになるか、そのファイルの文法を変更することになります。 これは、気をつけて行わなくてはなりません。 すでにユーザはその問題に対処するように設定ファイルを更新しているかもしれません。 スクリプトはすでに対処済みである場合を検出して、正しくそれを扱わなければなりません。

この方針を押し進めるならば、設定ファイルの生成を /usr/sbin に置かれる別のプログラムにまかせるというのは、よい考えです。 このプログラム名は慣習として、packageconfig を使うことになっており、そうすることが適切な場合、パッケージのインストール後に postinst スクリプトから実行されます。この packageconfig プログラムは、ユーザに問合せることなしに既存の設定を上書きしてはいけません。 もし、そのプログラムが (後に再設定行う場合ではなく) 初めてセットアップする場合には、そのプログラムは設定ファイルが存在するかどうかをチェックしなければいけません。 そして上書きするためには、dpkg に --force オプションが与えられていなければいけません。

代替バージョンへのインターフェース - update-alternatives (旧 Packaging Manual より)

複数のパッケージが、同じプログラム名やファイル名を持つ異なるバージョンを提供している場合、デフォルトで使用するプログラムをシステムで選択できると便利です。 ただ、もちろんシステム管理者による変更は出来なくてはいけませんし、その判断は尊重されなければいけません。

例えば、vi エディタにはいくつかの実装があります。 そして、これらをその固有の名前 (nvivim 等々) で同時にインストールしてはならない理由は何もありません。 けれども、少なくともデフォルトで、vi という名前が、その内のどれかを参照していることが望ましいでしょう。

すべての関連するパッケージが協調するならば、このような動作を update-alternatives を使って実現することができます。

各パッケージは、その実装ごとに違う固有の名前を提供します。 それら個々の実装を登録するには、インストール時に postinst スクリプトから update-alternatives を呼び出します (削除するときは、prerm スクリプトから update-alternatives をもう一度呼び出します)。

詳細は をごらん下さい。

update-alternatives ではうまくいかないような場合には、パッケージの退避バージョンの使用を考慮してみるとよいでしょう。

退避バージョン - あるパッケージに含まれるファイルを上書きするには (旧 Packaging Manual より)

パッケージを再インストールする時、その中のあるファイルを dpkg によって上書きさせないようにして、そのファイルをどこか他の場所に置くことができます。

この方法は、あるパッケージに含まれるファイルをローカルに入れ替える場合や、あるパッケージが別のパッケージに含まれるファイルを置き換える (または、そのプログラムのラッパーを 提供する) 場合に利用できます。

退避バージョン (diversion) の使用を決定する前に、 を読んでください。 本当に、あるプログラムに対して複数の代替バージョンを提供するよりも、退避バージョンを使用する方が適切であること確認してください。

退避操作専用のプログラムである dpkg-divert は、退避されたファイルの一覧を更新します。また、dpkg はこの一覧を使用します。この操作に関する詳細は、 をご覧ください。

あるパッケージが、別のパッケージに含まれるあるファイルを退避したい場合、 preinst スクリプト中から、dpkg-divert を呼ばなければいけません。 dpkg-divert は、退避ファイル一覧にエントリを追加し、既存のファイルの名前を変更します。 例えば、smailwrapper というパッケージが、 /usr/sbin/smail を包含するラッパーをインストールしようとしている場合を考えます。 if [ install = "$1" ]; then dpkg-divert --package smailwrapper --add --rename \ --divert /usr/sbin/smail.real /usr/sbin/smail fi 最初の引数 $1 をテストしているのは、smailwrapper を更新するときに、スクリプトが再度退避操作を行わないようにするためです。 オプション --package smailwrapper は、smailwrapper に含まれる /usr/sbin/smail が、退避バージョンではなく本来のバージョンとしてそのままインストールされることを保証します。

postrm の場合はちょうどこの逆を行います。 if [ remove = "$1" ]; then dpkg-divert --package smailwrapper --remove --rename \ --divert /usr/sbin/smail.real /usr/sbin/smail fi

システムの運用に必須となるファイルを退避しようとしないで下さい。 dpkg-divert の使用時には、ファイルの退避が行われた後に dpkg が新しいバージョンをインストールするまでの間、そのファイルが存在しないタイミングがあるのです。