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

これは元々の Policy Manual のコピーライト日付です。 それ以降、このマニュアルは様々な人の手で更新されています。 以降の作業についてのまとまったコピーライト注記はありません。

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

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

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

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

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

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

非公式には、ここに収録される内容の選択基準は、次のどちらかに属していることです。 標準インターフェース 記載された内容がパッケージングシステムのインターフェースとして使うべきものであり、 実際に多数のパッケージで使われており、従って綿密なレビューなしには変更するべきでないようなものである場合です。 そのような場合にはパッケージメンテナはインターフェースがころころ変わらないことを期待できますし、 パッケージ管理ソフトウェアの作者はそのインターフェース定義への互換性を確認するだけですみます (コントロールファイルや changelog ファイル形式がその一例です)。 選ばれた取り決め いくつか技術的に取り得る選択肢があり、相互互換性のためそのうちの一つを選ばなければならない場合です。 バージョン番号の形式などがその例です。 これらが相互に排他なものではないことに注意してください。 選ばれた取り決めが標準インターフェースになることはしばしばあります。

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

このマニュアルの付録部分は必ずしも規範に沿ってはいません。詳細は を参照ください。

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

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

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

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

この文書の新しい版

このマニュアルは、Debian パッケージ (packages.debian.org /debian-policy) として配布されています。

この文書の最新版は Debian の Web ミラーサーバ に置かれています。 他のフォーマットも何種類かは同じディレクトリに用意されています: policy.html.tar.gz (/doc/debian-policy/policy.html.tar.gz), policy.pdf.gz (/doc/debian-policy/policy.pdf.gz) および policy.ps.gz (/doc/debian-policy/policy.ps.gz) です。

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

作者とメンテナ

この文書は、最初は "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" の部分を作成しました。 Julian Gilbey さんが 2001 年に大幅な整理を行ないました。

1998 年 9 月以降は、この文書の内容の文責は に移りました。 提案はそこで討議され、合意が得られた後ポリシーに追加されます。 Debian 用のポリシーパッケージは、ポリシー自体を編纂する権限は無い数人のメンテナによって管理されています。 現時点でのメンテナは次の通りです: Russ Allbery Bill Allombert Andrew McMillan Manoj Srivastava Colin Watson

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

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

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

関連するドキュメント

このポリシーマニュアル以外にも、Debian ポリシーと手続きを理解するためには必要な、関連文書がいくつかあります。

このような「サブポリシー文書」を以下に列挙しておきます。

これらポリシーの一部を担う文書とは別に、Debian Developer's Reference があります。こちらの方の文書は Debian の開発者の手順とリソースについて記載されたものですが、規範となるものでは ありません。 むしろポリシーに含まれない内容、例えば好ましい開発者の作業例、などを記載したものです。

この Developer's Reference は developers-reference パッケージに収録されています。また、Debian web ミラーの にあります。

最後に、specification for machine-readable copyright files(機械可読な形式の著作権宣言ファイル仕様) が、他のポリシー文書と同様の手続きのもとに debian-policy パッケージの一部として維持管理されています。このフォーマットへの準拠は任意です。

Definitions

以下の用語がこのポリシーマニュアル中で使われています。 ASCII ANSI X3.4-1986 およびその先行する標準で規定された文字エンコーディングであり、MIME では US-ASCII として参照され、一文字を 8 ビット (列) で表現するエンコーディングである の最初の 128 文字 (8 ビット目は常に 0) に一致します。 UTF-8 の転送形式 (エンコーディングと呼ばれることもあります) で、 で定義されています。 UTF-8 は ASCII をサブセットとして含むという役に立つ性質を持っているため、ASCII エンコードされたテキストは自動的に有効な UTF-8 テキストにもなります。

Debian アーカイブ

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

Debian プロジェクトはフリーなオペレーティングシステムの構築を目指して努力を重ねていますが、私たちが利用可能にしたいと思う全てのパッケージが私たちの定義に沿った フリー (詳しくは下記記載の をご覧下さい) なものとなっているわけではなく、また制限なしに輸出入ができるものともなっていません。 そこで、Debian アーカイブは、そのソフトウェアのライセンスやその他の制限条件に基づいて、いくつかの配布エリア Debian アーカイブソフトウェアでは内部的に、およびリリースファイルフォーマットで、アーカイブの分類を示すのに component という用語を使っています。 Debian 社会契約では単に『エリア』と呼んでいます。 この文書では、社会契約と同じ用語法を用いています。 として分割されています。

この目的は 可能な限り多くのソフトウェアを利用可能にしたい。 すべての人に、フリーソフトウェアを書くことを奨励したい。 そして人々が私たちのシステムの CD-ROM を、いかなるライセンス、 輸出入制限、その他の法にも違反することなく簡単に制作できるようにしたい。

Debian ディストリビューション とは main アーカイブエリアのことです。

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

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

Debian フリーソフトウェアガイドライン (DFSG) は私たちが 「フリーソフトウェア」であると考えるソフトウェアの定義です。 1. 自由な再配布 Debian を構成する個々の部分要素 (パッケージなど) のライセンスでは、その部分要素を、いくつかの異なる出自を持つプログラムを複数含む集積されたソフトウェアの配布物の一部として販売ないし無料で配布することを、 いかなる個人または団体に対しても制限してはなりません。 このような販売に対してライセンスはロイヤリティーや、その他の料金を要求してはいけません。 2. ソースコード プログラムはソースコードを含んでいなければならず、コンパイル済み形式の配布だけでなくソースコードの配布も許可しなければなりません。 3. 派生物作成の許諾 ライセンスはソフトウェアの変更、およびその派生物の作成を許可しなければなりません。 また、それらがオリジナルのソフトウェアのライセンスと同じ配布条件の元で配布されることを許可しなければなりません。 4. 作者のソースコードへの変更の制限と配布条件 プログラムをビルドする際に、ソースコードを変更するための 「パッチファイル」を、そのライセンスがソースコードと共に配布することを許可している場合に 限り、ライセンスは変更されたソースコードの配布を制限することができます。 この場合、ライセンスは変更されたソースコードからビルドされたソフトウェアの配布を明示的に許可していなければなりません。 ライセンスが派生物に対して、オリジナルのソフトウェアとは異なった名前ないしバージョン番号を冠することを要求することは認められます (これは妥協です。Debian プロジェクトではすべての作者にソース、バイナリを問わずいかなるファイルへの変更をも制限しないことを推奨しています)。 5. 個人ないし団体に対する排斥の禁止 ライセンスは、いかなる個人ないし個人からなる団体に対しても差別をしてはなりません。 6. 使用分野に対する排斥の禁止 ライセンスは誰に対しても、プログラムをある特定の分野で使用することを制限してはなりません。 例えば、ライセンスでプログラムを商用で使用すること、または遺伝子研究に使うことなどを制限してはなりません。 7. ライセンスの配布時の均一性 プログラムに付属する諸権利は、そのプログラムが再配布されるすべての人びとに、その人びとによるライセンスの追加条項の履行を必要とせずに適用されなければなりません。 8. ライセンスは Debian においてのみ適用されるものであってはならない プログラムに付属する諸権利は、そのプログラムがある Debian システムの一部であるということに依存するものであってはなりません。 もしそのプログラムが Debian から取り出され、Debian システムなしで使用ないし配布されるとしても、そのプログラムのライセンスが定める条件の範囲内で扱われる限り、そのプログラムが再配布された全ての人びとは、Debian システムとの関連に基づいて認められていたのと同じ諸権利を有さなければなりません。 9. ライセンスは他のソフトウェアに影響を及ぼしてはならない ライセンスはそのライセンスが適用されたソフトウェアと一緒に配布される他のソフトウェアに制限を設けてはなりません。 例えば、ライセンスは同じメディアで配布される他のプログラム全てがフリーソフトウェアであることを主張してはなりません。 10. ライセンスの例 「GPL」、「BSD」、「Artistic」ライセンスなどが 私たちが フリー であると見なすライセンスの例です。

アーカイブエリア main アーカイブエリア

main アーカイブエリアが Debian システムを構成します。 言い換えると、このエリア内のパッケージのみがディストリビューションの一部であるとみなされます。 main アーカイブエリアのパッケージには、動作するためにこのエリア外のソフトウェアを必要とすることは許されていません。 誰でも、このアーカイブエリア内のパッケージを自由に利用、共有、変更、再配布することが許されています Debian でのフリーソフトウェアの定義については、 もご覧ください。

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

加えて、main に収録されるパッケージは コンパイルおよび実行に main の範囲外のパッケージに Depend または Recommend してはなりません (即ち、パッケージは main 以外に収録されたパッケージに「Depend」や「Recommend」や 「Build-Depends」や「Build-Depends-Indep」関係を宣言してはなりません)。 あまりにバグだらけで私たちがサポートすることを拒否するようなものであってはいけません。 このマニュアルで示されている全てのポリシー要求に適合していなければいけません。

contrib アーカイブエリア

contrib アーカイブエリアには、Debian ディストリビューションで利用するための追加ソフトウェアで、ビルドや動作にディストリビューション外のソフトウェアを必要とするものが収録されます。

contrib に収録される全てのパッケージは DFSG に準拠していなければなりません

訳注:他の節の contrib などは配布エリアである、という記載に不整合。

これに加えて、contribnon-US/contrib のパッケージは あまりにバグだらけで私たちがサポートすることを拒否するようなものであってはいけません。 このマニュアルで示されている全てのポリシー要求に適合していなければいけません。

contrib に含めることができるようなパッケージの例としては contrib または non-free に属するパッケージ、 またはそもそも私たちのアーカイブに存在しないパッケージを、コンパイル時または実行時に必要とするフリーなパッケージ。 非フリーなプログラム用のラッパーパッケージ、あるいは非フリーなプログラム向けのフリーな付属物など。

non-free アーカイブエリア

non-free アーカイブエリアには、Debian ディストリビューションで利用することを意図してはいますが、DFSG に準拠しない、または配布に問題があるような他の問題をもつパッケージが収録されています。 これらは修正の制限や、その他の制約のため、本マニュアルのポリシーでの要求をすべては満たしていないかもしれません。

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

これに加えて、non-free のパッケージは あまりにバグだらけで私たちがサポートすることを拒否するようなものであってはいけません。 このマニュアルで示されている全てのポリシー要求に、可能な限り適合していなければいけません

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

著作権に関する考慮

全てのパッケージは、その著作権情報や配布ライセンスの無修正のコピーを /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 フィールドは以下の形式をとります: section これはパッケージが main アーカイブエリアに属する場合です。 area/section これはパッケージが contrib または non-free アーカイブエリアに属する場合です。

Debian アーカイブメンテナがセクションの公式リストを提供します。 現時点では、それらは下記の通りです。 admin, cli-mono, comm, database, devel, debug, doc, editors, education, electronics, embedded, fonts, games, gnome, graphics, gnu-r, gnustep, hamradio, haskell, httpd, interpreters, introspection, java, kde, kernel, libs, libdevel, lisp, localization, mail, math, metapackages, misc, net, news, ocaml, oldlibs, otherosfs, perl, php, python, ruby, science, shells, sound, tex, text, utils, vcs, video, web, x11, xfce, zope さらに追加の debian-installer セクションがあり、そこにはインストーラで利用し通常の Debian パッケージでは使わないような、特殊なパッケージが収録されています。

セクションとその定義については、 を参照ください。

プライオリティ

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

Debian パッケージ管理システムが認識する priority の値 を下記に示します。 required システムが適切に機能するために必要なパッケージです (通常、dpkg の機能がこれらのパッケージに依存している場合に当たります)。 これらのパッケージを削除してはなりません。 万一削除してしまうとシステムは完全に動作不能となり dpkg で復旧することすら不可能になってしまいます。 required なパッケージのみのシステムはおそらく実用的ではないでしょうが、システム管理者がシステムを起動し、 より多くのソフトウェアをインストールするに足るだけの機能は備えています。 important どんな Unix ライクなシステムに於いても見つかることが期待されるような重要なプログラムは、このプライオリティに属します。 そのプログラムが欠けていることに気づいた時、Unix 経験豊富なユーザが「foo は一体全体どこだ?」と悪態をつくと思われるような場合には、それは important に含まれるべき

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

です。それ無しではシステムが良好に動作しなかったり、 あるいは使い物にならないといった種類のパッケージもここに含められるべきです。 このカテゴリには Emacs、X ウィンドウシステム、TeX といった大規模なアプリケーションは 含まれませんimportant なパッケージには一般に存在が期待される、または必要といえるような、かつその最小の集合と考えられるツール類のみが含まれています。 standard これらのパッケージはほどよく小規模ながらも、あまり制限のきつくないキャラクタベースのシステムを提供します。 ユーザが何も他に選択しなかった場合、このパッケージ群がデフォルトでインストールされます。多くの大規模なアプリケーションは含まれません。 optional (語の意味から言えば本来必要でないものはみんなオプション なのですが、ここでは違った意味内容を示します。) これは、そのパッケージが何か知らなくとも、また特殊な要求が無い場合にも、 とりあえずインストールしておく価値があると思われる全てのパッケージです。 これは X ウィンドウシステムや完全な TeX ディストリビューション、多くのアプリケーションを含み、ずっと大規模なシステムを構成します。 optional なパッケージは互いに conflict しないようにすべきです。 extra プライオリティとして required、important、standard、optional のいずれかが指定されている他のパッケージと衝突するパッケージは全てこれに含まれます。 また、それが何なのかすでに知っている場合や、特殊な要求に対応したもの (例として、分離したデバッグシンボルのみを含むパッケージなど) である場合にのみ有用であると考えられるパッケージ群もこのプライオリティに収録されます。

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

バイナリパッケージ

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

.deb パッケージは二つのファイルの集合が含まれます。 パッケージインストールの際にシステムにインストールされる一連のファイル群と、 パッケージに対する追加のメタデータの提供や、パッケージインストールや削除の際に実行するための一連のファイル群です。 二番目のファイル群を 制御情報ファイル と呼びます。 これらのファイルには、パッケージメンテナスクリプトや control ファイル、パッケージのコントロールフィールドを収録した バイナリパッケージコントロールファイル などがあります。その他の制御情報ファイルには、共有ライブラリの依存情報を格納するのに用いる shlibs ファイル や、パッケージ設定ファイルを列挙した conffiles ( で詳説) などがあります。

制御情報ファイル群と、Debian コントロールファイルフォーマット間に残念ながら用語の衝突があります。 この文書では、コントロールファイル (control file) は Debian コントロールファイルフォーマットにそったファイルを指します。 それらファイルについては で文書化されています。 制御情報ファイル として参照されるファイルとは、バイナリパッケージで利用される .deb ファイルフォーマットの制御情報ファイルのメンバとして含まれているもののみです。 殆どの制御情報ファイルは、Debian 制御情報ファイル形式ではありません。

パッケージ名

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

パッケージ名はコントロールフィールド Package に含まれます。 また、そのフォーマットは で記載されています。 パッケージ名は .deb ファイルのファイル名の一部としても含まれています。

パッケージのバージョン

各パッケージはコントロールフィールド Version にバージョン番号を持ちます。また、そのフォーマットは で記載されています。

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

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

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

一般的に、Debian パッケージは上流ソースと同じバージョン番号を使うべきです。 しかし、上流のバージョン番号が日付に基づくような場合 (例えば、開発中や "snapshot" リリースの場合) には、パッケージ管理システムはこのようなバージョン番号を正しく順序判断することができません。 例えば、dpkg は "96May01" を "96Dec24" よりも大きいと判断するでしょう。

そのような場合に、今後の新しい上流バージョンに対して epoch を使わなくて済むようにするためには、上流のバージョン番号を順序づけが正しく行われるような方法に変更すべきです。 具体的には、日付を元にしたバージョン番号部を 4 桁の年、 2 桁の月、2 桁の日で、各部の間に区切り文字を挿入可、と言うように直すべきです。

Debian 固有のパッケージ (つまり、Debian 向けに特別に書かれたパッケージ) の日付を含んだバージョン番号は、同じ規則に従うべきです。 日付の各部の間に区切り文字を含めたい場合、ハイフン (-) は固有パッケージのバージョンには使えないことに注意してください。 通常は、ピリオド (.) が適切です。

パッケージのメンテナ

全てのパッケージには、以下で記載する orphaned パッケージを除いて、一人または一グループの Debian メンテナを持たなければなりません。 メンテナは、個人であっても、メーリングリストなどの共通の一つのメールアドレスで連絡の取れるグループであってもかまいません。 メンテナは、Debian パッケージファイルの保守、すなわち報告されたバグに対して適切に判断・応答すること、新しいバージョンのアップロード (直接あるいはスポンサ経由で) を行うこと、 そのパッケージが適切なアーカイブエリアに置かれていること、パッケージの安定度や有用性にしたがって適切なディストリビューションに収録されていること、有用性が失われたか保守不能になった場合パッケージを Debian ディストリビューションから削除する要求を出すことについて、責任を持ちます。

Debian パッケージのメンテナは各パッケージの Maintainer コントロールフィールドに、正しい名前と有効な電子メールアドレスの両方により指定されていなければなりません。 Maintainer 制御フィールド内の電子メールアドレスは、Debian でパッケージに関して自動的にメールを送るのに使われる役割のアカウントからのメールを受け取らなければいけません。 これは、バグトラッキングシステムからの SPAM でないメール、Debian アーカイブ管理ソフトウェアからのすべてのメール、およびそれ以外にもプロジェクトで合意されている決まった役割のアカウントと自動送信プロセスからのメールは、受け取らなければならないということです Mailman メーリングリスト管理ソフトウェア向けのそのようなホワイトリストの参照実装が、 alioth.debian.org でホストされているメーリングリストで使用されています。 。 もしその人がいくつかのパッケージを管理している場合、個々のパッケージの Maintainer フィールドに同じ形式の名前と電子メールアドレスを記入すべきです。

Maintainer フィールドの書式は、 で記載されています。

パッケージのメンテナが、メールアドレスを共有するチームである場合、Uploaders 制御フィールドが必ず存在し、個人の電子メールアドレスを付けてひとりの人物が指定されていなければいけません。 このフィールドの書式は、 を参照ください。

orphaned パッケージとは、現在メンテナのいないパッケージのことです。 orphaned パッケージでは、Maintainer 制御フィールドに Debian QA Group <packages@qa.debian.org> を設定しなければいけません。 このようなパッケージは、保守の志願者が現れない限り Debian プロジェクト全体で保守されているとみなされます パッケージの orphan 化を丁寧に行うやり方の詳細は Debian Developer's Reference (開発者の手引き) に書かれています。 を参照ください。

パッケージの説明

全ての Debian パッケージは、パッケージの簡潔な説明文と、やや詳細な説明文を含む Description フィールドを持たなければなりません。 Description フィールドの書式の技術的詳細は に記載されています。

説明文は、そのパッケージのことを知らないユーザ (システム管理者) が、そのパッケージ (プログラム) をインストールするかどうかを判断するにあたって十分な情報を伝えるように書かれているべきです。 説明文はプログラムの説明文書をそのままコピーしただけのものとすべきではありません。

概要と、長い説明のどちらについても重要な情報を最初に書いてください。 概要や説明の最初の部分だけしか表示されない場合があるためです。 ただし、詳しい説明の全体を見る手段が用意されていることを仮定してもかまわないでしょう。

説明文にはパッケージ間の重要な依存関係 (dependency) や競合関係 (conflict) の情報も示されているべきです。 そうでないと、ユーザにはなぜ競合関係や依存関係の不具合が起きているのかが分かりません。

また、そのパッケージを設定したり使ったりするための解説を含めるべきではありません (それはインストールスクリプト、マニュアルページ、Info ファイルなどで扱われるべきです)。 著作権表示やその他管理に関係する種々のことも含まれるべきではありません。 それら向けには copyright ファイルが用意されています。

一行要約・概説

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

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

詳細の解説部分

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

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

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

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

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

依存関係

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

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

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

Essential は、アップグレードの際の解決できない依存関係のループを避けるために必要になります。 パッケージが不必要な依存関係をこの分類に属するパッケージに対して設定した場合、Essential として指定されたパッケージを先に設定しなければならないという、 解決不能の依存関係のループが起こる可能性が ずっと高くなる でしょう。 またフロントエンドが、アップグレード手順が存在する場合にも、 その手順を 解析により決定できない 可能性を増やします。

また、Essential の提供する機能が削除されると言うことは通常起こりませんが、 その機能が異なったパッケージに移されたことによって、 パッケージ が Essential から削除されることはあります。 このため、これらのパッケージに依存することは Essential からパッケージが外された場合一つとっても、役に立たずに害ばかりもたらすことになります。

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

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

パッケージ相互関係を指定するコントロールフィールドの書式は に記載されています。

仮想パッケージ

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

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

正式な仮想パッケージ名の一覧の最新版は debian-policy パッケージに同封されています。また、Debian ウェブミラーサーバの にあります。

このリストを更新するための手続きについてはこの一覧ファイルのはじめに記述されています。

Base システム

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

base システムはプライオリティ評価が requiredimportant のパッケージ全体で構成されています。 また、それらの大半には essential 指定 (下記 参照) が付加されているでしょう。

Essential パッケージ

Essential は、パッケージ群が展開されてはいるが未設定な状態でも、 システム上で提供され使用できなければならない最小の機能の集合として定義されています。 そのようなパッケージには Essential コントロールフィールドで Essential 指定が付加されています。Essential コントロールフィールドの書式は で記載されています。

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

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

メンテナは、プログラム、インターフェース、機能を essential パッケージに加える際には細心の注意を払う必要があります。パッケージは essential パッケージの提供する機能は明示的な依存関係の宣言なしに常に提供されていることを期待してよく、逆に Essential パッケージ群から機能を削除することは非常に難しく、ほとんどできないものになります。 また、essential パッケージに機能を加えることは、その機能を Essential 群で永久にサポートする義務を負わせることになります。

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

メンテナスクリプト

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

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

また、 の内容はパッケージのメンテナスクリプトにもほぼ適用されます。

あるパッケージのメンテナと協議せずに、そのパッケージに属するファイルを置きかえるべく dpkg-divert を使うべきではありません。 代替指定を追加あるいは削除する際には、パッケージメンテナスクリプトでは dpkg-divert--package フラグを必ずつけ、 --local を使用してはいけません。

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

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

パッケージメンテナスクリプトは、必要に応じてプロンプトを使ってユーザに入力を促すことができます。 プロンプト表示は Debian 設定管理仕様の第二版以降に準拠したプログラム (例えば debconf) を介して行わなければいけません。

Essential パッケージ、または Essential パッケージから依存されるパッケージは、 その実行時点で上記管理仕様にそったインターフェースが存在しない場合には、 他のプロンプト表示手段を代替として使用することができます。

Debian 設定管理仕様の第二版は、debian-policy パッケージの debconf_specification ファイル中に含まれています。 また、Debian web ミラーサイトの に置かれています。

Debian 設定管理仕様を用いるパッケージには、制御情報ファイル configtemplates ファイルを含めることができます。 config ファイルはパッケージ設定のための追加のメンテナスクリプトで、 templates にはユーザ問い合わせ用のテンプレートが収録されています。 config は、preinst の前、かつパッケージがアンパックされる前、かつ 依存関係 (dependency) および先行依存関係 (pre-dependency) が満たされる前に走ることがありますので、 Essential パッケージに属するツールのみを 初期設定が始まるまでに Debian 設定管理仕様を満たす Debconf や他のツールもインストールされていて、 それらからのバージョン指定の依存関係がある場合、 その依存関係があらかじめ満たされている必要があります。 使う必要があります。

Debian 設定管理仕様に準拠したパッケージでは、 po-debconf パッケージなどで提供される gettext ベースのシステムを使った、ユーザから見えるメッセージの翻訳が可能なようにしなければなりません。

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

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

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

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

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

ソースパッケージには、あなたのパッケージが最後の更新の際にパッケージのコンパイルで準拠した、その時点で最新のパッケージング基準のバージョンを指定すべきです。

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

このバージョンは Standards-Version コントロールフィールドで指定されます。Standards-Version フィールドの書式は で記載されています。

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

この文書の各版の間でポリシーにどのような変更が加えられたかについては 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: debian/changelog

Debian 版のパッケージの変更は全て簡潔に Debian changelog ファイル debian/changelog

changelogs の誤記は通常は古い changelog エントリを変更して『歴史を改竄する』より、単に新しい changelog を追加して修正する方がよい方法です。

に記載すべきです。 これには上流の版に加えた Debian パッケージ向けの変更

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

、 およびパッケージに対するそれ以外の修正や更新を記載します。

この debian/changelog のフォーマットは、パッケージのどのバージョンを現在ビルド中なのか、 及びその他のリリース特有の情報を、パッケージビルドツールが認識できるようになっています。

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

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

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

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

* また別の変更内容

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

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

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

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

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

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

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

より正確には、以下の Perl 正規表現にマッチするような文字列です。 /closes:\s*(?:bug)?\#?\s?\d+(?:,\s*(?:bug)?\#?\s?\d+)*/i 列挙された一つまたは複数のバグ番号は、changelog エントリの version を使ってアーカイブメンテナスクリプト (katie) で閉じられます。

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

changelog ファイルに記載するメンテナの名前と電子メールアドレスは この バージョンをアップロードした人について記されているべきです。 それは、必ずしも通常のパッケージ管理者である必要は ありません パッケージをアップロードした開発者がそのパッケージの通常のメンテナで無い場合 (つまり、パッケージのコントロールフィールドの MaintainerUploaders に列挙されていない場合)、 changelog の最初の一行にメンテナ以外のパッケージのアップロードを行った理由を説明することが慣行になっています。 The Debian Developer's Reference (see ) に使われている慣行の説明があります。 。 ここでの情報は、.changes ファイルの Changed-By ( 参照) フィールドにコピーされ、その後アップロードの完了時に通知を送るために使用します。

日付 は以下のフォーマット

これは date -R プログラムで作成したものと同じです。

(RFC2822 および RFC5322 と互換で、同じ意味をもちます) でなければいけません。以下に例を示します。 day-of-week, dd month yyyy hh:mm:ss +zzzz ここで、 day-of-week は Mon, Tue, Wed, Thu, Fri, Sat, Sun のいずれかです。 dd は、1 桁または 2 桁の月内の日付を示します (01-31)。 月は、Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec のうちのいずれかです。 yyyy は 4 桁の年を示します (e.g. 2010) hh は 2 桁の 24 時間制の時刻です (00-23) mm は 2 桁の分を示します (00-59) ss は 2 桁の秒を示します (00-60) +zzzz および -zzzz は国際標準時 (UTC) からの標準時間帯のずれを示します。 + は UTC より進んでいる (東にある) ことを、- は UTC より遅れている (西にある) ことを示します。最初の 2 桁は UTC からの 1 時間単位の差を、下位 2 桁は UTC からの追加の時差を示します。 下位 2 桁は 00 と 59 の間でなければいけません。 このフォーマットは、数字によって表現されたタイムゾーンを含まなければならず、 オプションとして、かっこに入ったコメントの形でタイムゾーン名かその省略形を付加することができます。

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

changelog 全体が UTF-8 でエンコードされていなければいけません。

バイナリパッケージ中に置かれる changelog ファイルの書式についてのより詳しい解説は を参照ください。

著作権表記: debian/copyright

各パッケージには、著作権と配布条件のライセンス文書が元のままの形式で /usr/share/doc/package/copyright に収録されていなければいけません (詳細は 参照)。また、パッケージの著作権を取り込む際の考慮事項については を参照ください。

makefile でのエラーを捕捉する

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

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

タイムスタンプ

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

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

ソースパッケージに含まれるものに対する制限

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

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

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

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

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

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

debian/rules - メイン構築スクリプト

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

このファイルの先頭は #!/usr/bin/make -f という行でなければなりません。 make を明示的に実行するのではなく、 debian/rules という名前で実行できるようにする為です。 つまり、make -f debian/rules args... と実行した場合と、./debian/rules args... と実行した場合が同じ結果でなければいけません。

以下のターゲットは、debian/rules に必要で、実装されていなければいけません。 - clean, binary, binary-arch, binary-indep, および build。 これらのターゲットは、dpkg-buildpackage から呼ばれます。

対話型の debian/rules スクリプトは、そのパッケージの自動コンパイルを不可能にし、さらにメンテナ以外の人が同じバイナリパッケージを再構築するのを難しくします。 ですから、全ての 必要なターゲット は非対話的でなくてはなりません。 また、これらのターゲットによって呼び出されるターゲットも非対話的でなくてはなりません。

ターゲットは次の通りです。 build (必須)

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

いくつかのパッケージで、同一のソースツリーからそれぞれ違う二つのバイナリパッケージを生成する場合があります。 build ターゲットはそういう場合には対応できません。 これらの場合は、それぞれの構築方法にしたがって、2 つまたは それ以上のターゲット (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 のドキュメントを参照ください。

build-arch (オプション) build-indep (オプション)

パッケージは build-archbuild-indep の一方あるいは両方のターゲットを指定することが出来ます。 build-arch ターゲットが指定された場合、これはアーキテクチャ依存のバイナリパッケージ (これらのパッケージには、debian/controlArchitecture フィールドに all 以外が指定されています) を作成するのに必要なすべての非対話型の処理を実行します。 同様に build-indep ターゲットが指定された場合、これはアーキテクチャ非依存のバイナリパッケージ (これらのパッケージでは、debian/controlArchitecture フィールドの値は all です) を作成するのに必要なすべての非対話型の処理を実行します。

build-arch または build-indep が rules ファイルに指定されている場合、build ターゲットは、それらに依存関係を指定するか、 それらのターゲットを呼んだ時に行われる動作に対応した何らかの処理を行うべきです この分割の意図は、バイナリのみのビルド時に build-indep ターゲットで必要になる依存パッケージのインストールを行わなくてよいようにするためです。 但し、この条件はまだ実運用に入っていません。それは dpkg-buildpackage -B が、そしてオートビルダがオプションの build-arch ターゲットが存在するかどうかの難しい判定を回避するため、 build-arch ではなく build を呼ぶようになっているためです。

build-archbuild-indep の一方あるいはいずれも指定されていない場合、 debian/rules を存在しないターゲットを指定して起動した際にはステータスコード 2 を返すべきです。 通常、make はターゲットが存在しない場合、自動的に上記の結果を返します。

build-archbuild-indep では、root 権限が必要なことを行ってはいけません。

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 (オプション)

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

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

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

patch (オプション)

このターゲットでは、ソースを修正可能とするための何らかの操作 (追加の上流のアーカイブの展開や、パッチの適用など) が必要な場合、それを実行します。dpkg-source -x の実行のみでは修正可能なソースが得られないパッケージの場合、利用を推奨します。 を参照ください。

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

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

パッケージを実際にビルドするマシンや、インストールの対象となるマシンのアーキテクチャは、 dpkg-architecture を使って make 変数を設定することによって決定されます。 これにより、ホストアーキテクチャだけでなくパッケージのビルドをするマシン アーキテクチャの Debian 形式のアーキテクチャ指定文字列と GNU 形式のアーキテクチャ指定文字列を得ることができます。 ビルドアーキテクチャとは、debian/rules が実行され、パッケージビルドが行われるアーキテクチャです。 ホストアーキテクチャとは、生成されたパッケージがインストールされ、実行されるアーキテクチャです。 これらは通常は同じですが、クロスコンパイル (あるアーキテクチャ向けのパッケージを異なったアーキテクチャのマシンでビルドする) の場合、異なっていても構いません。

次に、サポートされている make 変数を示します。 DEB_*_ARCH (Debian 形式のアーキテクチャ) DEB_*_ARCH_CPU (Debian CPU 名) DEB_*_ARCH_OS (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 や システムの情報を得るのにこれを使うべきではありません。 それには、DEB_*_ARCH_CPUDEB_*_ARCH_OS 変数を使うべきです。 GNU 書式の変数は、一般的には上流のビルドシステムのみで用いるようにすべきです。

debian/rules および DEB_BUILD_OPTIONS

標準の環境変数 DEB_BUILD_OPTIONS のサポートを推奨します。 この変数は、パッケージをどのようにコンパイル・ビルドするかを変更するための複数のフラグを含みます。 各フラグは、flag という形式か、 flag=options という形式でなければいけません。 複数のフラグがある場合、空白で分離してください デリミタをサポートしているパッケージもありますが、空白が makefile 中での処理が最も容易で、コンマを含むフラグとの曖昧さも避けることができます。 flag は英子文字 (a-z) で始まり、英小文字と数字、 - または _ (ハイフンとアンダスコア) のみを含むようにしなければいけません。options には空白を含んではいけません。 同一のタグで、矛盾する値を持つものを複数回指定してはいけません。 パッケージメンテナは、DEB_BUILD_OPTIONS にはタグ間の矛盾がないことを仮定してもかまいません。

以下のタグの意味は標準化されています。 nocheck このタグは、パッケージで提供されているビルド時のテスト集を実行しないことを指示します。 noopt このタグがある場合、このパッケージは最適化を最小限でコンパイルすべきであることを示します。 C プログラムの場合、CFLAGS-O0 を付ける (これが通常既定値ですが) のが最も良いでしょう。 一部のプログラムはこのレベルの最適化だとビルドや実行に失敗するため、その場合には、例えば -O1 を使います。 nostrip このタグは、パッケージにデバッグ情報を残すため、 インストール時にバイナリからデバッグシンボルを strip してはいけないことを意味します。 parallel=n このタグは、パッケージのビルド時に、ビルドシステムがサポートしている場合 n 多重の並列プロセスで実行すべきであることを示します make でビルドするパッケージでは、多くの場合 make-jn オプションを渡すことでこの仕様が実現可能です。 。パッケージのビルドシステムが並列 make をサポートしていない場合、このオプションは無視されます。 また、パッケージビルドシステムが n 未満の並列処理のみをサポートしている場合、パッケージはビルドシステムの許す限りの並列プロセスでビルドされるべきです。 パッケージビルド時間が十分に長く、並列ビルドに価値があるほどビルドシステムが安定であるか、の判断はパッケージメンテナに任されています。

未定義のフラグは、debian/rules で無視しなければいけません。

以下の 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 (,$(filter noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif ifeq (,$(filter nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) MAKEFLAGS += -j$(NUMJOBS) endif build: # ... ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) # パッケージテスト群を実行するためのコード endif

変数置換: debian/substvars

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

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

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

上流のソースの場所の設定 (オプション): debian/watch

これは、オプションではありますが推奨の設定ファイルで、新しく提供されたパッケージのアップデートを ftp および http サイトで走査する方法を uscan ユーティリティに対して、伝えるためのものです。 これは、 および他の Debian QA ツールで、パッケージ品質管理とディストリビューション全体の保守のために用いられています。

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 を呼ぶようにすべきです。

コードの便宜的写し

一部のソフトウェアパッケージでは、他のソフトウェアパッケージのコードの写しを含んでおり、 ソースからコンパイルする際に複数のパッケージをダウンロードしなくても済むようにしています。 Debian パッケージでは、含まれる側のパッケージが意図的にこのように使われるという想定でないかぎり 例えば、GNU ビルドシステムはこのようになっています。 、このような写しの使い方はすべきではありません。 もし、含まれているコードが既に Debian アーカイブでライブラリとして収録されている場合、Debian パッケージングではバイナリパッケージから既にあるライブラリへの参照を行ない、このような写しを使うべきではありません。 もし含まれているコードが Debian に収録されていない場合は、可能ならばそのコードを、前提の依存関係を付けて別にパッケージングすべきです Debian 中に同じコードの写しを持つことは非効率ですし、 静的リンクと共有ライブラリ間の衝突を招きがちですが、最も重要な点はコードの重複によりセキュリティ欠陥の処理を難しくすることです。

ソースパッケージの処理: debian/README.source

dpkg-source -x をソースパッケージに対して実行しても、直ぐ編集可能で、変更を加えた後修正されたパッケージを追加作業なしに dpkg-buildpackage で作成できるようなパッケージのソースが得られない場合には、 debian/README.source 解説ファイルの追加を推奨します。 このファイルには、以下のすべての手順が説明されていなければいけません。 編集可能で、Debian パッケージの作成が可能な、 全部のパッチが当たったソースを作成する方法。これを debian/rulespatch ターゲットで行なえるようにすることが推奨です。 参照。 ソースを変更し、その変更をセーブしてパッケージ作成の際に適用できるようにする方法。 パッケージをビルドする際に、現在当てられているソース修正をすべて元に戻す方法。 オプションとして、新しい上流の版がでた場合に (可能なら) Debian ソースパッケージをアップグレードするのに必要な手順の説明。 この説明には具体的なコマンド名や、追加で必要な Debian パッケージについて言及すべきです。また、Debian パッケージングシステムやパッチ管理ツールを熟知していることを仮定してはいけません。

この説明は、ビルド時依存を指定しているパッケージの一つがインストールする文書ファイルを参照してもかまいません。 ただし、それは参照された文書が手順を明確に記載しており、一般的なリファレンスマニュアルではない場合に限ります。

debian/README.source には、ソースパッケージを変更しようとする人にとって有益な情報を含めてもかまいません。 パッケージが上記の説明に該当するものではなくとも、特に複雑でわかりにくいソース配置やビルドシステム (例えば同じソースを複数回ビルドして異なったバイナリパッケージを作成するようなパッケージ) では、メンテナが debian/README.source を作成することを薦めます。

コントロールファイル (Control) とそのフィールド

パッケージ管理システムは共通のフォーマットで記述されたデータを扱います。 このフォーマットを control data と呼び、コントロールファイル 中に記載されています。 コントロールファイルはソースパッケージ、バイナリパッケージ、および .changes で使われており、 インストールとファイルのアップロードを制御します

dpkg の内部データベースも類似したフォーマットになっています。

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

コントロールファイルは、一つまたはそれ以上のフィールドの段落から成ります

この段落はしばしば連 (stanza) と呼ばれます。

。段落は、空白行で区切られます。 パーザは空白文字とタブだけからなる行も段落の区切りとして処理しても構いませんが、 コントロールファイルでは空行を使うべきです。 いくつかのコントロールファイルは一つの段落しか持てませんが、複数の段落を持つことができるコントロールファイルもあります。 その場合には、通常、各段落は、それぞれ違うパッケージに対する記述になっています (例えば、ソースパッケージでは第一段落はソースパッケージを指し、以降のパッケージはそこから作成されたバイナリパッケージ群を指します)。 コントロールファイル中の段落の順序は意味を持ちます。

一つ一つの段落は、フィールドと値の連続したものです。 個々のフィールドは、名前とそれに続くコロンとデータ/値によって構成されます。 フィールド名は制御文字、空白とコロンを除く ASCII 文字から構成されます (つまり、33-57 または 59-126 までの間でなければいけません)。 フィールド名は、コメント文字 # で始まってはいけません。

そして、改行または最後の継続行の終わりがフィールドの終わりです。 水平方向に連続する空白 (スペースとタブ) は値の前後に入れることもできますが、その場合は無視されます; 慣習として、コロンの後に一つの空白を入れます。 例えば、フィールドは以下のようなものです。 Package: libc6 ここで、フィールド名は Package で、フィールドの値は libc6 です。

一つの段落に、特定のフィールド名が二回以上現れることは許されません。

フィールドには三種類あります。 simple (単一行) このフィールドは値を含めて一行でなければなりません。 フィールドを折り返すことは許されません。 これは、フィールドの定義で他のフィールド種別を許していない場合、標準のフィールドの種類になります。 folded (折り返しを許す) 折り返しを許す (folded) フィールドの値は、複数行に展開可能な論理的な行です。 最初の行に続く行は継続行と呼ばれ、空白またはタブで始まらなければいけません。 改行を含む空白文字は、折り返しを許すフィールドの値の場合、意味を持ちません この折り返しの扱いは、RFC 5322 と同様です。このため、RFC 5322 向けに書かれたパーザを使って、ひとつの段落で複数行のフィールドを持たないコントロールファイルを読み込むことができます。 multiline (複数行) 複数行 (multiline) フィールドの値は、複数の継続行から構成されます。 最初の行の値は (フィールド名と同じ行にある値の部分)、 しばしば特別の意味を持ち、空にしなければならない場合もあります。 残りの行は「折り返しを許すフィールド」の継続行と同じ書式で付け加えられます。 空白や改行は、複数行フィールドでは意味を持ちます。

空白は、 名前 (パッケージやアーキテクチャ、ファイル、その他) やバージョン番号、複数のキャラクタのバージョン関係の中には、絶対にあってはいけません。

各フィールドの存在と用途、および値の書式はコントロールファイル毎に異なります。

フィールドの名前には、大文字か小文字かは関係ありません。 しかし、以下に示すように、大文字小文字を混在させる場合には、最初の一文字だけを大文字にするのが普通です。 フィールドの値は、フィールドの説明で特段の記載がない限り、大文字と小文字は区別されます。

段落の区切り (空行) や、空白行や空白とタブでだけ構成されている行が、フィールドの値や、フィールドとフィールドの間にあってはいけません。 フィールドの値としての空行は、通常は 空白とドット という値にエスケープされます。

行が前に空白なしで # で始まっている場合、それはソースパッケージコントロールファイル (debian/control) 中でのみ許されるコメント行です。 このコメント行は、継続行の途中にある場合も含めて、無視されます。 また、フィールドの論理行の終りを意味することもありません。

コントロールファイルは UTF-8 でエンコードしなければいけません。

ソースパッケージコントロールファイル -- debian/control

debian/control ファイルは、ソースパッケージとそれから生成されるバイナリパッケージについての最も重要な (バージョン非依存の) 詳細を含みます。

コントロールファイルの最初の段落には、ソースパッケージ全般に関する情報が収録されています。 それに引き続く部分にはソースツリーからビルドされたバイナリパッケージの記載が来ます。

全般部分の段落 (ソースパッケージ用の最初の部分) のフィールドは以下のものです。 Source (必須) Maintainer (必須) Uploaders DM-Upload-Allowed Section (推奨) Priority (推奨) Build-Depends など Standards-Version (推奨) Homepage

バイナリパッケージ用の段落のフィールドは以下のものです。 Package (必須) Architecture (必須) Section (推奨) Priority (推奨) Essential Depends et al Description (必須) Homepage

フィールドの書式と意味は以下で記載されています。

これらのフィールドは、dpkg-gencontrol がバイナリパッケージ用のコントロールファイルを 生成するとき (以下参照) や dpkg-genchanges がアップロードに付随する .changes ファイルを生成するとき、または dpkg-source がソースアーカイブの一部として .dsc ソースコントロールファイルを生成するときに使用されます。 一部のフィールドは、debian/control 中での折り返しを許す行の使用が許されていますが、 他のコントロールファイル中ではこれは認められていません。 上で挙げたツールは、debian/control 中のそのようなフィールドに対して、他のコントロールファイルを作成するために使用する際に、改行を削除する責任を負っています。

また、これらのフィールドは、変数参照を含むこともあります。 それらの値は、出力コントロールファイルを生成するときに dpkg-gencontroldpkg-genchanges 及び dpkg-source によって使用されます。 詳細は、 をご覧ください。

バイナリパッケージコントロールファイル -- DEBIAN/control

DEBIAN/control ファイルには、バイナリパッケージに関する最も重要な (バージョン依存の) 情報が収録されています。これは一つの段落からなります。

このファイルのフィールドは以下の通りです。 Package (必須) Source Version (必須) Section (推奨) Priority (推奨) Architecture (必須) Essential Depends et al Installed-Size Maintainer (必須) Description (必須) Homepage

Debian ソースコントロールファイル -- .dsc

このファイルは、一つの段落からなり、恐らく PGP 署名で囲われています。 含まれるフィールドを以下に示します。またフィールドの書式は前に で説明されています。 Format (必須) Source (必須) Binary Architecture Version (必須) Maintainer (必須) Uploaders DM-Upload-Allowed Homepage Standards-Version (推奨) Build-Depends ほか Checksums-Sha1 および Checksums-Sha256 (推奨) Files (必須)

Debian ソースコントロールファイルはソースアーカイブビルド時に dpkg-source によりソースパッケージ中の、上記の説明している他のファイルから作成されます。 パッケージを展開する時、ソースパッケージ中の他の部分のファイルとディレクトリとの整合性がチェックされます。

Debian changes ファイル -- .changes

.changes ファイルは、パッケージ更新を処理する際に Debian アーカイブ管理ソフトウェアによって使用されます。 このファイルは一つの段落からなり、debian/control と、 debian/changelogdebian/rules などから抽出したソースパッケージの情報が含まれています。

.changes ファイルは、文書化されたフィールドまたはその意味が変更されるたびに +1 されるフォーマットバージョン番号を持っています。 この文書では、&changesversion; フォーマットを記載します。

このファイルのフィールドは以下のものです。 Format (必須) Date (必須) Source (必須) Binary (必須) Architecture (必須) Version (必須) Distribution (必須) Urgency (推奨) Maintainer (必須) Changed-By Description (必須) Closes Changes (必須) Checksums-Sha1 および Checksums-Sha256 (推奨) Files (必須)

フィールドのリスト Source

このフィールドは、ソースパッケージの名前です。

debian/control ファイルや .dsc ファイル中のフィールドでは、 ソースパッケージの名前のみを含まなければいけません。

バイナリパッケージ中のコントロールファイルの中、または .changes ファイル中では、ソースパッケージ名の後に、 かっこに入れたバージョン番号を続けて記載することができます

もしバージョンナンバーが指定されているなら、慣習的にパッケージの名前の後に一つの空白を残します。

このバージョン番号は、該当のバイナリパッケージの Version フィールドと同一の値を持っていた場合、dpkg-gencontrol によって削除されます。 また、ソースパッケージがバイナリパッケージと同じ名前とバージョンを持っていた場合は、 このフィールド自体がバイナリパッケージコントロールファイルから削除されます。

パッケージ名 (ソースパッケージとバイナリパッケージの両方とも。 参照) 小文字英字 (a-z), 数字 (0-9), プラス記号 (+) マイナス記号 (-) とピリオド (.) のみを含むようにしなければいけません。 また、少なくとも二文字で、英数字から始まらなければいけません。

Maintainer

パッケージメンテナの名前と email アドレスです。 最初に名前がこなくてはいけません。 その後に email アドレスを <> の中に (RFC822 フォーマットで) 入れます。

パッケージメンテナの名前にピリオドが含まれていると、RFC822 に規定されている文法のミスによって、全てのフィールドが email アドレスとして適用されなくなります; このフィールドをアドレスとして使用するプログラムは、これをチェックして、必要であれば修正しなければいけません (例えば、名前をかっこのなかに入れて最後尾に移動し、 email アドレスを前の方に持ってきます)。

パッケージメンテナに関するこれ以外の要求事項や説明は、 を参照ください。

Uploaders

パッケージの共同メンテナがいる場合、その人 (達) の名前と email アドレスの一覧です。もし、パッケージに Maintainer フィールド に記載した以外のメンテナがいる場合、その人たちの名前と email アドレスをここに記載します。 書式はメンテナフィールドのものと同じであり、複数のエントリはコンマ "," で区切ります。

これは通常はオプションのフィールドですが、Maintainer にメールアドレスを共有するグループが指定されている場合には Uploaders フィールドの指定が必須で、ひとりの個人とその人の電子メールアドレスとが記載されていなければいけません。

debian/control ファイルの Uploaders フィールドでは、折り返しが許されています。

Changed-By

この版のパッケージを用意した人、通常はメンテナ、の名前と電子メールアドレスです。 Maintainer fieldと同じ書式が適用されます。

Section

このフィールドには、パッケージを分類したアプリケーション分野を指定します。 を参照ください。

debian/control ファイルに現れている場合、 .changes ファイルの Files フィールドの同名のサブフィールドの値に代入されます。 また、バイナリパッケージの同名のフィールドの初期値にも代入されます。

Priority

このフィールドには、このパッケージをインストールすることの重要性が示されています。 参照のこと。

debian/control ファイルに現れている場合、 .changes ファイルの Files フィールドの同名のサブフィールドの値に代入されます。 また、バイナリパッケージの同名のフィールドの初期値にも代入されます。

Package

バイナリパッケージの名前です。

バイナリパッケージの名前は、ソースパッケージの名前と同じ書式および制限を持ちます。 詳細は を参照ください。

Architecture

これまでのコンテキストと、コントロールファイルの内容に依存しますが、 Architecture は以下の値を取ることができます。 Debian マシンアーキテクチャを示す、一意の一語。 で規定されています。 アーキテクチャワイルドカードは Debian マシンアーキテクチャの集合を指定します。 を参照ください。 any は全ての Debian マシンアーキテクチャにマッチし、もっとも良く使われます。 all これはアーキテクチャに依存しないパッケージであることを示します。 source 、つまりソースパッケージであることを示します。

ソースパッケージの中の、メインの debian/control ファイル中では、このフィールドには特別な値 all または 特別のアーキテクチャワイルドカード any か、スペースで区切られた複数のアーキテクチャまたはアーキテクチャワイルドカードのリストが許されます。 any または all が記載されている場合、これ以外の値を書くことは許されません。 殆どのパッケージでは、any または all のいずれかを使うことになります。

特定のアーキテクチャのリストを使う場合、そのソースからはフィールドに含まれているアーキテクチャのみに依存したパッケージがビルドされることを意味します。 特定のアーキテクチャのワイルドカードリストを使う場合、そのソースがフィールドにマッチするアーキテクチャのみに依存したパッケージをビルドすることを意味します。 アーキテクチャのリストや、any 以外のアーキテクチャワイルドカードを使う場合は例外的で、プログラムに可搬性がないか、一部のアーキテクチャでは役に立たない場合です。 一般的に言って、可能な限りプログラムは可搬性を持つように作成すべきです。

Debian ソースコントロールファイル .dsc の中には、スペースで区切られたアーキテクチャまたはアーキテクチャワイルドカードのリストを書くことができます。 リストにアーキテクチャワイルドカード any が含まれる場合は、他には all のみをリストに記載することが許されます。

リストには、特別な値 all (あるいはそれのみ) を記載することが許されます。言い方を変えれば、.dscdebian/control とは異なり、all は他の特定のアーキテクチャとの組み合わせとして記載することが許されています。 Debian ソースコントロールファイル .dsc 中の Architecture フィールドは、通常はソースパッケージの debian/controlArchitecture フィールドから作成されます。

any のみを指定した場合、ソースパッケージは特定のアーキテクチャへの依存性はなく、どのアーキテクチャでもコンパイルできるはずであるということを意味します。 作成されたバイナリパッケージ (群) は、現在のビルドアーキテクチャ依存になります。

単に all は、ソースパッケージは特定のアーキテクチャに依存しないパッケージのみをビルドすることを示しています。

any all が指定されている場合は、ソースパッケージは特定のいずれのアーキテクチャにも依存しないことを示しています。 作成されるバイナリパッケージには、少なくともひとつのアーキテクチャ依存のパッケージと、ひとつのアーキテクチャ非依存のパッケージが含まれます。

アーキテクチャあるいはアーキテクチャワイルドカードが列挙されている場合、 ソースはアーキテクチャ依存としてビルドされることを示しており、列挙されているか、あるいはワイルドカードにマッチしたアーキテクチャでのみ動作します。 ソースパッケージから少なくとも一種類のアーキテクチャ非依存のパッケージがビルドされる場合、リストに all を含めてください。

.changes ファイルの中の、Architecture フィールドは、そのパッケージが現在対応しているアーキテクチャを示します。 これはリストです。もし、特別なエントリ source があれば、そのパッケージのソースもアップロードされます。 アーキテクチャ非依存のパッケージがアップロードされる場合、all を含めます。.changes ファイルの Architecture フィールドに any などのアーキテクチャワイルドカードが現れてはいけません。

パッケージ構築の過程でアーキテクチャをどのように得るかについての情報は、 を見てください。

Essential

これは、バイナリパッケージのコントロールファイル中、またはソース制御データファイル中のパッケージごとの段落に記述される yes/no の値です。

yes とセットしてあった場合、dpkgdselect は、このパッケージの削除を行ないません (更新と置きかえは可能です)。 no の場合は、このフィールドを持っていない場合と同じです。

パッケージ間の関連性を示すフィールド: Depends, Pre-Depends, Recommends, Suggests, Breaks, Conflicts, Provides, Replaces, Enhances

これらのフィールドは、パッケージ間の関係を記述します。 を参照してください。

Standards-Version

パッケージが準拠した最新の標準 (Debian ポリシーマニュアルおよびそれに関連するテキスト) のバージョンです。

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

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

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

です。

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_revision0 と等価です。

二つのバージョン番号を比較する場合には、まず epoch 値が比較され、次に epoch が同じである場合には upstream_version が比較され、さらに upstream_version も同じである場合には debian_revision が比較されます。 epoch は数字として比較されます。 upstream_versiondebian_revision の部分はパッケージ管理システムによって、以下記載のアルゴリズムを用いて比較されます。

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

最初に、比較対象となる2つの文字列の中で、全て非数字で構成される最初の部分を決定します。 両方の文字列に対する、この数字でない部分 (そのうちの一つは空であってもかまいません) を辞書順で比較します。 もし違いが見つかれば、それを返します。 ここでの辞書順とは、すべての文字が非文字より先に来る様に修正し、 更にチルドがもっとも前に来る修正 (行末の空文字列より更に前) を加えた ASCII 順です。 例えば、以下の各部分は早いほうから遅いほうへの順でソートされます。 ~~, ~~a, ~, 空部分, a チルドの典型的用法は、上流でのプリリリース版を処理する場合です。 例えば、1.0~beta1~svn12451.0~beta1 より早いものとしてソートされ、さらにいずれも 1.0 より前だと見なされます。

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

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

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

Description

ソースおよびバイナリパッケージのコントロールファイル中で、 Description フィールドにはバイナリパッケージの説明が含まれています。 この説明は、概要または短い説明と、長い説明の二つの部分からなります。 このフィールドは複数行を許す行であり、書式を以下に示します。

Description: <一行概要> <複数行にわたる長い説明>

長い説明の部分のフォーマットは以下の通りです。

空白一つから始まる行は、パラグラフ (節) の一部です。 この行に引き続く行は、表示の際にはワードラップが行われます。 最初の空白は通常 (表示の際は) 削除されます。 この行には少なくとも一文字の空白以外の文字が含まれていなければいけません。 空白二つ以上から始まる行は、そのまま表示されます。 表示部を水平方向に広げられない場合は、表示プログラムは内容を強制改行 (単語境界を考慮せずに改行を挿入する) します。 可能な場合は必要に応じて表示が右側にはみ出します。表示時に、0 個 から 2 個までの空白が削除されますが、この際に削除される空白の個数は各行で一緒です (従って、インデントされた内容は正しく表示されます)。 この行には少なくとも一文字の空白以外の文字が含まれていなければいけません。 空白とドット ('.') のみからなる行は、空行として表示されます。 これは空行を表示させる唯一の手段です

完全な空の行は空白としては処理されず、パーザにコントロールファイルの新しいレコードを開始するものとして解釈されます。 このため、詳細説明中に空白行を入れると、普通はエラーで異常終了します。

空白、ドットといくつかの文字が続く行形式は将来の拡張用で、使わないでください。

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

更に詳しい説明は、 の項を参照ください。

.changes ファイル中では、Description フィールドにアップロードされるパッケージの説明文の要約を含んでいます。 この場合、フィールド値の最初の行 (Description: などと同じ行の部分) は常に空行です。 これは複数行を許すフィールドで、パッケージ毎に論理行一行になります。 それぞれの行は、一つの空白でインデントされ、バイナリパッケージ名、空白、 ハイフン (-)、空白、パッケージから持ってきた短い説明という構成になっています。

Distribution

.changes ファイルか changelog の解析出力には、 このパッケージがインストールされていた、またはこれからインストールされるディストリビューションの名前が空白で区切られて含まれます。 有効なディストリビューション名はアーカイブメンテナが決定します。

現在、.changes ファイル中で使用されている Debian アーカイブでのディストリビューション名の例は下記のとおりです。 unstable (不安定版) このディストリビューションは、Debian の配布ツリーの中で、開発中 のものであるということを示します。 新しいパッケージおよびパッケージの最新のバージョン、バグフィックスは、この unstable ディレクトリに収録されます。 experimental (試験版) このディストリビューションのパッケージは、メンテナから、ハイリスクであると宣言されています。 初期のβ版や開発中のパッケージなど、多くのソースコードから構成されている開発中のパッケージや、試してほしいと思っているけれども Debian の他の ディストリビューションに含まれるほどの完成度ではないものが含まれています。

このフィールドには、そのパッケージがインストールされる、 すべて のディストリビューションを列挙しなければいけません。

他の指定も、安定版リリースの更新やセキュリティアップロードで使用されます。 より詳しい情報は Debian Developer's Reference の "The Debian archive" の項を参照してください。

Debian アーカイブソフトウェアは、単一のディストリビューションの記載しかサポートしていません。 パッケージを他のディストリビューションに移動する処理はアップロードプロセスの外で行われます。

Date

このフィールドにはパッケージがビルドされた、または修正された日付を記載します。 これは、debian/changelog エントリの date と同じフォーマットでなければいけません。

このフィールドの値は通常 debian/changelog ファイルから抽出します。 を参照ください。

Format

.changes ファイルでは、このフィールドはこのファイルのフォーマットバージョンを宣言します。 このフィールドの値の書式は パッケージバージョン番号と同じですが、 epoch や Debian revision は付けることができません。 書式は、本文書では &changesversion; に記載されています。

Debian ソースコントロールファイル .dsc では、このフィールドはソースパッケージのフォーマットを宣言します。 このフィールドの値は、ソースパッケージ内のファイルのリストを解釈し、アンパック方法を判断する必要があるような、パッケージを操作するためのプログラムで用いられます。 このフィールドの値の書式は、数字のメジャーレビジョン、ピリオド、数字のマイナーレビジョンに、その後空白を挟んでオプションのサブタイプが続くものです。 サブタイプがある場合、それはかっこで囲まれた英数字の語です。 サブタイプは書式上は省略可能ですが、特定のソースフォーマットレビジョンでは必須になります Debian アーカイブで現在サポートされているソースフォーマットは 1.0, 3.0 (native), 3.0 (quilt) です。

Urgency

以前のバージョンからのアップグレードがどの程度重要なのかを示します。 以下のいずれかのキーワードのひとつを指定します lowmediumhigh emergency および critical これ以外の緊急性を示す値もアーカイブソフトウェアの設定を変更することでサポートされていますが、Debian 使われていません。緊急性の値はそのパッケージが testing ディストリビューションに収録される早さの判断に影響し、アップロードの際の修正の重要性を示す目安も与えます。 Emergencycritical は同じものとして扱われます。 (大文字と小文字は区別されません)。 空白で区切られたコメント (たいていかっこにはいっています) がオプションとしてつくこともあります。例えば: Urgency: low (HIGH for users of diversions)

このフィールドの値は普通は debian/changelog から取ってきます。 を参照ください。

Changes

このフィールドは複数行を許す書式で、人が読むための変更点のデータを示します。 一つ前のバージョンと現在のバージョンとの相違を説明します。

フィールドの最初の値 (Changes: と同じ行の部分) は必ず空です。 フィールドの値は継続行に記載され、最低限一つの空白によってインデントされます。 空行は、空白とピリオド (.) だけからなる行で作成されます。

このフィールドの値は普通は debian/changelog から取ってきます。 を参照ください。

それぞれのバージョンの変更情報は、「title」行の後に続きます。 この「title」行には、すくなくとも、バージョン、ディストリビューション、緊急度のフィールドが人が読める形式で含まれています。

もし、いくつかのバージョンのバージョン情報が返されるような場合、 最新のバージョンに対するものを最初に返すようにすべきで、 同時に空行を入れてエントリ行を分割してください (「title」行の後もまた空行のあとで 続けてください)。

Binary

このフィールドは折り返しを許す書式で、バイナリパッケージのリストです。 書式と意味は、このフィールドが現れたコントロールパッケージが何であるかに依存します。

.dsc ファイルに記載されている場合は、それはそのソースパッケージが生成できるバイナリパッケージのカンマで区切られたリストです 慣行上、カンマの後には空白を入れます。 。 ソースパッケージでは、ここに記載された全バイナリパッケージがすべてのアーキテクチャで生成できる必要はありません。 個々のバイナリパッケージがどのアーキテクチャに対応しているかの詳細は、ソースコントロールファイルには含まれません。

.changes ファイル中では、このフィールドの値は、 実際にアップロードされているバイナリパッケージの名前の、空白 (カンマではなく) で区切られたリストです。

Installed-Size

このフィールドは、バイナリパッケージのコントロールファイルと Packagesファイルに現われます。 名前で指定されたパッケージをインストールするのに必要なディスク容量の概算値を示します。 実際に消費されるインストールサイズはブロックサイズ、ファイルシステムプロパティやパッケージメンテナスクリプトでの処理に依存します。

ディスク容量は、バイト値のインストールサイズを 1,024 で割って切り上げた整数値です。

Files

このフィールドは、ファイルとそれについての情報を逐一記したリストから構成されます。 厳密な情報と書式は使われる状況によります。

どの場合においても、Files は複数行からなるフィールドです。 フィールドの最初の行 (即ち Files: のある行) は空です。 継続行に 1 つのファイルにつき一行の内容が記されます。 このとき各行は 1 つの空白文字でインデントされ、下記の通り、空白で区切られた各サブフィールドが続きます。

.dsc ファイルの場合には、このフィールドには tar ファイルと、ソースパッケージの残りの部分である diff ファイル (存在する場合) の各々について、MD5 チェックサム、サイズ、ファイル名が記されます。 この diff ファイルは、ソースパッケージの変更分

つまり、tar ファイルに無い部分のうちで、.dsc ファイル以外の部分のことです。

です。例を挙げます。 Files: c6f698f19f2a2aa07dbb9bbda90a2754 571925 example_1.2.orig.tar.gz 938512f08422f3509ff36f125f5873ba 6220 example_1.2-1.diff.gz ファイル名などの項目についての正確な書式は、 をごらんください。

.changes ファイルの場合には、このフィールドには 1 つのアップロードされるファイルごとに 1 行ずつ、 MD5 チェックサムとサイズ、セクション、プライオリティ、ファイル名が記述されます。 以下に例を示します。 Files: 4c31ab7bfc40d3cf49d7811987390357 1428 text extra example_1.2-1.dsc c6f698f19f2a2aa07dbb9bbda90a2754 571925 text extra example_1.2.orig.tar.gz 938512f08422f3509ff36f125f5873ba 6220 text extra example_1.2-1.diff.gz 7c98fe853b3bbb47a00e5cd129b6cb56 703542 text extra example_1.2-1_i386.deb セクション (section)プライオリティ (priority) フィールドはメインのソースコントロールファイルの対応する値となります。 もし、セクションとプライオリティが決定されていなかったら、 - を使うべきです。 しかしながら、セクションとプライオリティの値は新しいパッケージを適切にインストールするため、本来指定しておかなければならないものです。

.changes ファイルのセクションが byhand という特別の値であれば、該当するファイルは通常のパッケージファイルとして扱えないため、 ディストリビューション管理者が手動でインストールしなければなりません。 セクションが byhand 値であった場合には、プライオリティは - にすべきです。

新しい Debian パッケージをリリースする時に、新しい上流のソースアーカイブの配布を伴わない場合、 .dsc ファイルの Files フィールドには、オリジナルのソースアーカイブ package_upstream-version.orig.tar.gz に対するエントリを含んでいなければなりません。 一方、.changes ファイル中の Files フィールドにはこのエントリがあってはいけません。 この場合、配布サイトのオリジナルソースアーカイブは、アップロードしようとしている .dsc ファイルと、diff ファイルを生成するのに使用されたソースアーカイブとバイト単位で正確に一致していなければなりません。

Closes

.changes ファイルでの変更/修正により、アップロードで閉じられるバグレポート番号を、空白で区切って列挙します。

Homepage

このパッケージのウェブサイトの URL です。 可能な場合、望ましいのは元のソースが入手でき、追加の上流の文書や情報が入手できるようなサイトです。 このフィールドの内容には、<> などで囲まない単純な URL を記載します。

Checksums-Sha1 および Checksums-Sha256

これらのフィールドは複数行を許す書式で、各ファイルに対しチェックサムとサイズを付けたリストが格納されています。 Checksums-Sha1Checksums-Sha256 は同じ書式で、使ったチェックサムアルゴリズムのみ異なります。 Checksums-Sha1 では SHA-1 が用いられ、 Checksums-Sha256 では SHA-256 が使われます。

Checksums-Sha1Checksums-Sha256 は、複数行を許すフィールドです。フィールドの最初の行の値 (つまり、Checksums-Sha1Checksums-Sha256 と同じ行にある値) は、常に空白です。 実際のフィールドの内容は継続行に記載され、ファイル一つにつき一行です。 各行は、チェックサム、空白、ファイルサイズ、空白、ファイル名となります。 例を (.changes ファイルから) 以下に示します。 Checksums-Sha1: 1f418afaa01464e63cc1ee8a66a05f0848bd155c 1276 example_1.0-1.dsc a0ed1456fad61116f868b1855530dbe948e20f06 171602 example_1.0.orig.tar.gz 5e86ecf0671e113b63388dac81dd8d00e00ef298 6137 example_1.0-1.debian.tar.gz 71a0ff7da0faaf608481195f9cf30974b142c183 548402 example_1.0-1_i386.deb Checksums-Sha256: ac9d57254f7e835bed299926fd51bf6f534597cc3fcc52db01c4bffedae81272 1276 example_1.0-1.dsc 0d123be7f51e61c4bf15e5c492b484054be7e90f3081608a5517007bfb1fd128 171602 example_1.0.orig.tar.gz f54ae966a5f580571ae7d9ef5e1df0bd42d63e27cb505b27957351a495bc6288 6137 example_1.0-1.debian.tar.gz 3bec05c03974fdecd11d020fc2e8250de8404867a8a2ce865160c250eb723664 548402 example_1.0-1_i386.deb

.dsc ファイルには、これらのフィールドにはソースパッケージを構成する全てのファイルを列挙すべきです。 .changes ファイルには、これらのフィールドにはアップロードしようとする全てのファイルを列挙すべきです。 これらのフィールド中のファイルのリストは、Files フィールドのファイルのリストと一致している必要があります。

DM-Upload-Allowed

Debian メンテナに、対象パッケージを Debian アーカイブにアップロードして良いことを指示します。 このフィールドの有効な値は yes のみです。 もし、不安定版または実験版中のパッケージの最新版で、フィールド DM-Upload-Allowed:yes がソースコントロールファイルのソースセクションに存在する場合は、 Debian メンテナキーリング内の鍵で署名されたアップロードを Debian アーカイブは受け入れます。 この件の詳細は、一般決議 を参照ください。

ユーザ定義フィールド

Debian ソースコントロールファイルにはユーザ定義フィールドを追加することができます。 これらは無視され、(例えば) バイナリやソースパッケージコントロールファイル、アップロードコントロールファイルにはコピーされません。

出力ファイルにサポートされていないフィールドを付加したいときは、ここに述べる方法を使用してください。

メインのソースコントロールファイルにおいて、X から始まり、BCS とハイフン - が続くフィールドは、出力ファイルにコピーされます。 そして出力ファイルには、フィールド名のハイフンの後に続く文字部のみが使用されます。 ここで、B はバイナリパッケージコントロールファイルに使用されるとき、 S Debian ソースコントロールファイルに使用されるとき、 C は、アップロードコントロールファイル (.changes) に使用されるときに使われます。

メインのソース情報コントロールファイルが以下のフィールドを含んでいるときは、 XBS-Comment: I stand between the candle and the star. バイナリと Debian ソースコントロールファイルは、次のフィールドを含みます。 Comment: I stand between the candle and the star.

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

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

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

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

さらに、postinst 中で debconf を用いてユーザとの対話を行うパッケージでは、制御情報ファイル内に config スクリプトをインストールすべきです。 詳細は、 を参照ください。

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

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

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

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

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

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

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

です。

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

メンテナスクリプトは制御端末がある状態で実行されているとは限らず、 ユーザとの対話ができることは保証されていません。 制御端末が提供されていない場合、非対話型で処理することができるようにしなければなりません。 Debian Configuration Management Specification に準拠したプログラムを使ってプロンプトを出しているメンテナスクリプト ( 参照) は、非対話型の動作になった場合の扱いを、そのプログラムが行うと仮定して構いません。

優先順位の高い、妥当な標準回答の無いような対話を行いたい場合、 制御端末がない際に異常終了することは許されています。 但し、可能な限りそのようなことが起きないようにすべきです。 これは、自動インストールや、無人インストールの妨げになるからです。 大抵の場合は、このような挙動はユーザにそのパッケージのバグと見做されるでしょう。

終了ステータス

各スクリプトは成功の場合には終了ステータスを 0 に、失敗の場合には 0 でない値にして帰ってください。これは、 パッケージ管理システムがこれらスクリプトの終了ステータスを監視しており、このデータに基づいて次に取るべき処理を決めているためです。

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

以下は、メンテナスクリプトのすべての呼ばれ方と、 スクリプトが呼ばれる際に依存して良い機能についてまとめたものです。 スクリプト名で、new- で始まるものは、インストール/更新/ダウングレード対象の新バージョンのパッケージから呼ばれるスクリプトです。 スクリプト名で、old- で始まるものは、更新/ダウングレードされる対象の旧バージョンのパッケージから呼ばれるスクリプトです。

preinst スクリプトは以下のやり方で呼ばれる可能性があります。 new-preinst install new-preinst install old-version new-preinst upgrade old-version 問題のパッケージはまだ展開されていないため、preinst スクリプトはパッケージに含まれるファイルに依存することはできません。 essential パッケージと、先行依存 (predependency) (Pre-Depends) を指定したパッケージが提供されていることは期待してもかまいません。 先行依存されたパッケージは少なくとも一回は設定されていますが、ただし preinst が呼ばれた時点では単に展開された直後か、 "Half-Configured" 状態である可能性があります。 この状況は、先行依存を指定したパッケージの旧版がきちんと設定されていて、その後削除されていなかった場合に起きます。 old-preinst abort-upgrade new-version 新パッケージの展開後に、アップグレードが postrm upgrade 処理の失敗のために失敗した場合に、エラー処理で呼ばれます。 展開されたファイルは一部が新しい版に置き換わっていたり、一部が削除されている可能性があるため、 パッケージに含まれるファイルに依存することはできません。 パッケージの依存関係は満たされていないかもしれません。 先行依存 (pre-dependencies) 関係については、展開については上記と同じ考え方ですが、先行依存関係の更新に失敗した場合 "Half-Installed" 状態までに留まります この状況は、新版のパッケージが、この部分的に更新された先行依存対象のパッケージに対する先行依存関係を持たないよう変更された場合に発生します。

postinst スクリプトは以下のやり方で呼ばれる可能性があります。 postinst configure most-recently-configured-version パッケージに収録されたファイルは展開されます。 依存するパッケージも少なくとも展開されています。 巡回依存関係がない限り、依存するパッケージは設定状態となります。 巡回依存関係がある場合の挙動は、 の解説を参照ください。 old-postinst abort-upgrade new-version conflictor's-postinst abort-remove in-favour package new-version postinst abort-remove deconfigured's-postinst abort-deconfigure in-favour failed-install-package version [removing conflicting-package version] パッケージに収録されたファイルは展開されます。 依存するパッケージも少なくとも "Half-Installed" 状態ではあり、その場合は以前に設定されていて削除されていない状態になっています。 ただし、依存関係にあるパッケージは設定状態ではないかもしれず、またエラーが起きている場合は展開に失敗している可能性もあります 例えば、パッケージ foo と bar があり、foo は bar に依存し、foo をインストールしようとしているとします。bar のアップグレードが開始後異常終了し、その後 foo の削除が foo の prerm スクリプトが失敗したために失敗したとします。 この場合、foo の postinst abort-remove が bar が "Half-Installed" の状態で呼ばれます。 その場合でも、postinst は、依存関係が必要となる処理を試行すべきです。 これは、この依存関係は通常の場合は満たされているためです。 ただし、これらの処理が失敗した場合には適切なエラー処理動作を行うよう検討してください。 パッケージ依存関係で要求したコマンドや機能がなかった場合には postinst を異常終了させるのが、多くの場合適切なやり方です。

prerm スクリプトは以下のやり方で呼ばれる可能性があります。 prerm remove old-prerm upgradenew-version conflictor's-prerm remove in-favour package new-version deconfigured's-prerm deconfigure in-favour package-being-installed version [removing conflicting-package version] 内部の prerm が呼ばれるパッケージは、少なくとも "Half-Installed" 状態です。すべての依存関係のパッケージは少なくとも "Half-Installed" 状態で、その場合は以前に設定されており、削除されていない状態です。 これら処理が呼ばれる際には、すべての依存関係のパッケージはもしエラーがない場合には少なくとも展開状態ですが、 エラーがある場合は部分アップグレードに伴う "Half-Installed" 状態になっており、更に様々なエラー状態の発生下で呼ばれます。 new-prerm failed-upgrade old-version prerm upgrade が失敗した場合のエラー処理で呼ばれます。 新しいパッケージはまだ展開されておらず、preinst upgrade と同じ制約条件が適用されます。

postrm スクリプトは以下のやり方で呼ばれる可能性があります。 postrm remove postrm purge old-postrm upgrade new-version disappearer's-postrm disappear overwriter overwriter-version postrm スクリプトは、 パッケージのファイルが削除あるいは置き換えられたあとに呼ばれます。 postrm が呼ばれたパッケージは、以前に設定解除され、展開されただけである可能性もあります。 この時点で、以降のパッケージの変更では依存関係は考慮されません。 このため、すべての postrm 処理は "essential" パッケージのみに依存し、パッケージの依存関係が必要な処理はすべて、依存関係が満たされない場合に丁寧に処理を飛ばすようにしなければいけません これは、postrm で呼びたいコマンドや機能について、呼ぶ前に有無をチェックするようにして実現するのが普通です。 例えば、以下のスクリプトが postrm に記載されていた場合、 if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then . /usr/share/debconf/confmodule db_purge fi とします。debconf パッケージがインストールされているならば 当該パッケージの debconf 設定が完全削除されます。 new-postrm failed-upgrade old-version 古いパッケージの postrm upgrade 処理が失敗した場合に呼ばれます。 新しいパッケージは展開されていますが、"essential" パッケージと先行依存パッケージのみへの依存が可能です。 先行依存したパッケージは設定されているか、"Unpacked" または 以前に設定されてそれ以降削除されていない "Half-Configured" 状態です。 new-postrm abort-install new-postrm abort-install old-version new-postrm abort-upgrade old-version preinst が失敗した場合のエラー処理の一環として新しいパッケージを展開する際に呼ばれます。 preinst で前提とできる状態と同じ状態を、前提とすることができます。

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

インストール/アップグレード/上書き/消去 (すなわち、 dpkg --unpack が走っているとき、または dpkg --install の展開段階のとき) の手続きは下記の通りになります。どのような場合においても、 もしエラーが起これば (下記の場合を除けば) そこでの動作は、一般に逆方向へ走る処理です。 これは、管理スクリプトが異なる引数で逆順に走らされるということです。 このような呼び出しは以降の説明では「エラー回復」呼び出しとして記しています。 対象となるパッケージの、あるバージョンが既に インストールされている場合は次の呼び出しをします。 old-prerm upgrade new-version もし、これがエラーとなったら (つまり、 ゼロでない終了ステータスであったら)、 dpkg はかわりに次の呼び出しをします。 new-prerm failed-upgrade old-version これが動作するなら、アップグレード作業を続けます。 うまくいかないなら、エラー回復は次の通りです。 old-postinst abort-upgrade new-version これが正常動作するなら、"old-version" がインストールされています。正常動作しないなら、 "old-version" は "Half-Configured" 状態になっています。 「衝突する (conflicting)」パッケージが同時に削除される場合、 またはいずれかのパッケージが壊れている (Breaks のため) 場合には もし、--auto-deconfigure が指定されている場合、 Breaks で設定破棄されるパッケージ各々に対し以下を呼び出します。 設定破棄されるパッケージの prerm deconfigure \ in-favour package-being-installed version このときのエラー回復は 設定破棄されるパッケージの postinst abort-deconfigure \ in-favour package-being-installed-but-failed version です。もし、--install が使われたばあいに再設定可能としておくため、設定破棄 (deconfigured) されたパッケージには設定を要求するマークが付けられます。 もし、その削除されようとしている衝突するパッケージに依存するパッケージがあり、 --auto-deconfigure が指定されているならば、 該当の各パッケージについて、次の呼び出しを行ないます。 設定破棄されるパッケージの prerm deconfigure \ in-favour package-being-installed version \ removing conflicting-package version このときのエラー回復は 設定破棄されるパッケージの postinst abort-deconfigure \ in-favour package-being-installed-but-failed version \ removing conflicting-package version です。もし、--install が使われたばあいに再設定可能としておくため、 設定破棄 (deconfigured) されたパッケージには設定を要求するマークが付けられます。 衝突しているパッケージを削除するための準備として、各パッケージに対して次の呼び出しが行われます。 衝突しているパッケージの prerm remove \ in-favour package new-version このときのエラー回復は 衝突しているパッケージの postinst abort-remove \ in-favour package new-version です。 パッケージがアップグレードされる場合には、次の呼び出しが行われます。 new-preinst upgrade old-version これらが失敗した場合、 new-postrm abort-upgrade old-version を呼びます。

これが正常終了する場合、次に old-postinst abort-upgrade new-version を呼びます。更にこれが正常終了する場合、旧バージョンは "Installed" 状態になっており、正常終了しない場合は "Unpacked" 状態のままになっています。

これが失敗した場合、旧バージョンは "Half-Installed" 状態で残っています。

そうではない場合、もしそのパッケージの以前のバージョンからの設定ファイルがあった (すなわち「設定ファイルのみ」の状態にあった) ならば、次の呼び出しが行われます。 new-preinst install old-version このときのエラー回復は new-postrm abort-install old-version です。これが正常終了しない場合、パッケージは "Half-Installed" 状態で残っており、この修正には再インストールが必要になります。 正常終了した場合には、パッケージは "Config-Files" 状態になっています。 そうでもない (つまり、そのパッケージが完全削除されていた) 場合、次の呼び出しが行われます。 new-preinst install このときのエラー回復は new-postrm abort-install です。これが正常終了しない場合、パッケージは "Half-Installed" 状態で残っており、この修正には再インストールが必要になります。 正常終了した場合には、パッケージは未インストール 状態になっています。

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

あるパッケージが、現在システムにある別のパッケージの ファイルと同名のファイルを含んでいる場合、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 です。これが失敗した場合、パッケージは "Half-Installed" 状態で残っています。これが正常終了した場合、dpkg は次に、 new-postrm abort-upgrade old-version を実行します。これが失敗した場合、パッケージは "Half-Installed" 状態で残っています。 これが正常終了した場合、dpkg は次に、 old-postinst abort-upgrade new-version を実行します。これが失敗した場合、旧バージョンは "Unpacked" 状態になっています。

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

古いバージョンのパッケージにはあって、新しいものには無いファイルは削除されます。 ファイルリストが、古いものから新しいものに置きかえられます。 新しいメンテナスクリプトで、古いものを置きかえます。

あるパッケージに属するファイルが、インストールの間に全て上書きされ、依存の要求も無いような場合、そのパッケージは削除されたと見なします。 そのようなパッケージそれぞれに対して、 dpkg は次の呼び出しを行ないます。 disappearer's-postrm disappear \ overwriter overwriter-version パッケージ管理スクリプトが削除されます。 パッケージ状態のデータベースには、正常な状態、つまりインストールされていないものとして記録されます (そのパッケージが持っていた設定ファイルがあれば、それは dpkg によって削除されるのではなく、無視されます)。 dpkg は前もって、そのパッケージが削除されそうなのかどうかを知らないので、 削除されるパッケージの `prerm' は 呼び出されないということに注意してください。

展開しようとしているパッケージの中にあって、他のパッケージのファイルリストにも記されている全てのファイルは、これらのリストから削除されます (これにより、もし「衝突する」パッケージがあれば、その衝突するパッケージのファイルリストが修正されます)。 今までのインストール作業の中で作成されていたバックアップファイルを消去します。

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

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

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

設定の詳細

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

設定中にエラーが起こった後、回復は行われません。設定に失敗した場合、パッケージは "Failed Config" 状態になっており、エラーメッセージが作成されます。

もし最近設定されたバージョン (上の呼び出しの most-recently-configured-version) が存在しなければ、 dpkg は引数として何も渡しません。

歴史に関する注記:とても古い (1997 年以前の) バージョンの dpkg では、この場合に <unknown> を (不等号も含めて) 渡していました。 更に古いものでは、どのような状況においても二番目の引数として何も渡しませんでした。 そこまで古い dpkg のバージョンを用いたアップグレードは、仮に postinst スクリプト中でその場合の引数の処理が考慮されていたとしても、そのほかの理由もあって動くとは期待できません。

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

prerm remove

もし、prerm が競合 (conflict) のために置きかえに失敗する場合、 conflictor's-postinst abort-remove \ in-favour package new-version または、 postinst abort-remove を実行します。

これが正常終了しない場合、パッケージは "Half-Configured" 状態か、"Installed" 状態のままのいずれかになります。

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

postrm remove

失敗した場合にエラーを巻き戻す方法はありません。パッケージは "Half-Installed" 状態となっています。

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

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

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

postrm purge

これが失敗した場合、パッケージは "Config-Files" 状態のままになっています。

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

パッケージ間の関連性の宣言 関係性フィールドの書式

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

パッケージの 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

依存関係は、ある特定のアーキテクチャの集合に限定してもかまいません。 これは、それぞれのパッケージ名とオプションのバージョン指定の後に、 角括弧ではさんで指定します。角括弧のなかには、空白で区切られた Debian アーキテクチャの ( で記載された書式に従う) 名前の空でないリストを入れます。感嘆符 (!) を一つまたは複数の各アーキテクチャ名の前に置くこともできます (一部の名前に感嘆符を置き、他の名前に置かない、という指定は許されません)。

ビルド時のパッケージ間の関連を示すフィールド (Build-DependsBuild-Depends-IndepBuild-Conflicts 及び Build-Conflicts-Indep) で、現在の Debian ホストのアーキテクチャがこのリストに無く、感嘆符のついた指定も無い場合、 もしくは感嘆符付きでこのリスト中にある場合には、 そのパッケージ名とバージョン指定はパッケージ間の関連を定義するためには使われず、完全に無視されます。

例を次に示します。 Source: glibc Build-Depends-Indep: texinfo Build-Depends: kernel-headers-2.2.10 [!hurd-i386], hurd-dev [hurd-i386], gnumach-dev [hurd-i386] という指定は hurd-i386 以外のすべてのアーキテクチャで kernel-headers-2.2.10 を要求し、hurd-i386 のみで gnumach-dev を要求するものとなります。

バイナリの依存関係を示すフィールドについては、アーキテクチャによる制限書式はソースパッケージコントロールファイル debian/control でのみサポートされます。 対応したバイナリパッケージコントロールファイルが作成される際、依存関係は省かれるか、そのバイナリパッケージのアーキテクチャに基づいてアーキテクチャ制限部を削除した形で収録されます。 つまり、アーキテクチャ制限は、アーキテクチャ非依存のパッケージ (Architecture: all) のバイナリ依存関係フィールドでは使うことはできません。

例を以下に示します。 Depends: foo [i386], bar [amd64] 上記の例では、パッケージが i386 アーキテクチャでビルドされた場合 Depends: foo に変換され、amd64 アーキテクチャでビルドされた場合 Depends: bar に変換され、それ以外のアーキテクチャでビルドされたバイナリパッケージでは省略されます。

アーキテクチャ制限つきの依存関係が | を使った代替パッケージ集合の一部であった場合、制約を満たさないアーキテクチャ上では代替パッケージは完全に無視されます。 例を以下に示します。 Build-Depends: foo [!i386] | bar [!amd64] という記載は i386 アーキテクチャでは bar に等しく、amd64 アーキテクチャでは foo に等しく、その他のアーキテクチャでは foo | bar に等しいものとなります。

依存関係は、 で記載された仕様のアーキテクチャワイルドカードを使って特定アーキテクチャへの制限を与えることも可能です。 そのような制限の宣言の書式は、アーキテクチャワイルドカードを使わずにアーキテクチャを列挙する場合の宣言と同様です。例を以下に示します。 Build-Depends: foo [linux-any], bar [any-i386], baz [!linux-any] 上記の例では、foo は Linux カーネルで任意の cpu、 bar は任意のカーネルで i386 cpu、そして baz は Linux 以外のカーネルで任意のアーキテクチャ、という意味になります。

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

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

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

この宣言には、DependsPre-DependsRecommendsSuggestsEnhancesBreaksConflicts コントロールフィールドを使用します。 Breaks で、Conflicts で説明されています。残りは以下で説明されています。

これらの七つのフィールドは、あるパッケージと他のパッケージとの依存関係を宣言するために使用します。 これらのフィールドは、EnhancesBreaks を除いて、依存する側のパッケージのコントロールファイルの中に記述されます。 Enhances は推奨される側のパッケージのコントロールファイルに記述されます。 Breaks はこのパッケージに依存するパッケージのバージョンに記述され、 対象パッケージが記載バージョンでは動かないことを示します。

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

Depends はパッケージが設定されるべき順番に対する要求を指定するのみであり、インストール時はパッケージは普通はまず全て展開され、その後で設定が行われます この方法により依存関係の解決が容易になります。もし二つのパッケージ A と B をアップグレードしようとする場合、インストールされたパッケージ A がインストールされたパッケージ B に厳密に依存し、また新しいパッケージ A が新しいパッケージ B に厳密に依存しているとします。 これは、共有ライブラリと、それに対応した開発用のパッケージをアップグレードする場合に普通に発生する状況です。 この場合、依存関係をアップグレードのすべての途中過程で満たすことは不可能です。 上記のように制限を緩めることは、二つの新しいパッケージを一緒に展開し、その後で依存関係に従って設定してよいということです。

インストールまたは削除しようとするパッケージ間に巡回依存関係がある場合には、インストールと削除の順序は依存関係を尊重した順序では行うことは不可能で、 依存関係のループがどこかの時点で崩れたり、すくなくともひとつのパッケージではインストールや削除時に依存関係が満たされていることを期待できなくなります。 巡回依存関係をもつパッケージは、自分が設定される前に依存関係にあるパッケージが設定されていることを前提とすることはできず、状況はこの依存関係のループがどちらの側で崩れるかによります。 もしループを構成しているパッケージの一つが postinst スクリプトを含んでいない場合、ループの輪はこのパッケージで破られます。 これにより、すべての postinst スクリプトが、可能な限り依存関係が適切に満たされた状態で実行されるよう保証しようとしているためです。 上記の条件が満たされない場合、破られるポイントは予測できません。 このため、パッケージは可能な限り、特に postinst スクリプトを持っている場合には、巡回依存関係を避けるべきです。

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

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

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

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

Dependspostinstprerm の各スクリプトを実行するために特定のパッケージが展開されているか、設定されていることが必要になる場合にも指定すべきです。 postinst configure の場合は、依存されたパッケージはまず展開され、設定されます (巡回依存関係に両方のパッケージが含まれる場合、事は期待通りには進みません。 数節前の説明を参照ください)。prerm と、これいがいの postinst 操作時には、依存パッケージは通常少なくとも展開されていますが、その依存関係にあるパッケージの以前のアップグレードが失敗していた場合、 "Half-Installed" 状態でとどまっている可能性があります。

最後に、依存するパッケージの存在が postrm スクリプト中でパッケージ削除の際のクリーンアップで必要になる場合、Depends フィールドを指定すべきです。 postrm が実行される際にパッケージの依存関係が満たされている保証はありませんが、 依存関係を指定した場合依存対象のパッケージがある可能性がそれだけ高くなります (特に、postrm remove の際には)。postrm スクリプトは、依存関係が満たされない場合、依存を必要とする処理を丁寧に (文句を言わずに) 飛ばさなければいけません。

Recommends

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

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

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

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

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

先行依存を宣言したパッケージを 設定 しようとする場合、先行依存関係は通常の Depends と同じように扱われます。 すなわち依存するパッケージが正常に設定済である場合にのみ満たされていると判断されます。 ただし、Depends とは異なり、Pre-Depends は巡回依存関係が崩れることを許しません。 Pre-Depends を尊重しようとした際に巡回依存関係を発見した場合、 インストール処理は異常終了します。 これは、通常の Depends の場合と同じです。

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

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

Pre-Depends エントリは、予め debian-devel メーリングリストで議論を行い、そうしたほうが良いとの合意を経ないで使用すべきではありません。 を参照ください。

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

他のパッケージを壊すパッケージ - Breaks

あるバイナリパッケージが他を壊すと宣言した場合、dpkg により、壊されたパッケージが設定解除されるまでは Breaks を宣言したパッケージの展開は拒否されます。 また、壊されたパッケージの再設定も拒否されます。

パッケージは、設定ファイルがインストールされているだけの状態で、壊されるとは見なされません。 少なくとも "Half-Installed" 以上の状態である必要があります。

特別な例外として、自分自身のパッケージ名や、自パッケージが提供する仮想パッケージが壊れていることを宣言する場合があります。 これは実際の「壊れ」とは見なされません。

通常は、Breaks エントリには「これ以前のバージョン」 を指定する節を持ちます。このような Breaks は、明示的あるいは暗示的な依存関係が何らかの前提を壊したか、 以前の「壊れている」バージョンのパッケージのバグを顕在化させてしまう、 または Breaks で指定された以前のバージョンのパッケージのファイルを引き継いだためなどの理由で指定されます。 このような Breaks の用法は上位階層のパッケージ管理ツールに、 「壊れている」パッケージを新版にアップグレードしなければならないことを伝えます。

パッケージを壊す際、旧パッケージの一部のファイルを上書きする場合、 処理がスムーズに進むように Replaces を指定すべきです。 他のパッケージを引き継ぐ場合の詳細な説明は を参照ください。そこにはそのような場合での Breaks の利用法についても記載されています。

Breaks を使うべき場合の多くは、以前は Breaks がなかったため、Conflicts が使われていました。 多くの Conflicts フィールドが Breaks に置き換えられています。 違いの詳細は をご覧ください。

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

あるバイナリパッケージが他のパッケージとの競合関係を Conflicts フィールドを使って宣言している場合、 dpkg は、そのシステム上でそれら二つのパッケージを同時に展開することを拒否します。 これは、Breaks より強い制約です。 Breaks では、Breaks を指定したパッケージの展開後には「壊された」パッケージの再設定は妨げられますが、両方のパッケージを展開することは可能なためです。

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

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

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

通常は、Conflicts ではなく Breaks を用いるべきです。 これは、Conflicts がパッケージインストールやアップグレードに対してより強い制約を課すため、パッケージマネージャがアップグレードやインストールを行う際の問題の適切な回答を得るのがより難しくなるためです。 Breaks は以下の場合に使用すべきです。 ファイルをパッケージ間で移動する場合 ( 参照のこと) パッケージを分割する場合 (ファイル移動の特殊な場合) (対象パッケージをインストールすることにより) Breaks を指定したパッケージの以前の版でバグが表に出たり、ひどい相互干渉がある場合 そして Conflicts は以下の場合に使用すべきです。 二つのパッケージが同じファイルを提供し、かつその状況を続ける場合 Provides と組み合わせて、指定された仮想パッケージ機能を提供するパッケージを展開するのは、どの時点でも一つにしたい場合 ( 参照) その他の場合で、同時に二つのパッケージがインストールされることを当面避ける (そのパッケージの後続の版で修正予定が無い) または両方のパッケージが設定ではなく、アンパックされることを避ける必要がある場合。 ただし、一般的に二つのパッケージが同じファイルを提供する場合に Conflicts を指定するのは良い方法ではありません。 競合の理由に依存しますが、代替パッケージ機能を使うか、ファイルの名称変更を行う方が通常はより良い方法です。例を で参照ください。

二つのパッケージが同時にインストールできないか、同時にインストールした場合に何れかのパッケージが壊れたり利用不能になったりするのでなければ、 BreaksConflicts を指定すべきではありません。 他のパッケージと似た機能を持っていたり、同じ仕事をおこなえることは、 BreaksConflicts をパッケージに指定するのに十分な理由とはなりません。

Conflicts フィールドは、将来の版で競合が解消される場合には、バージョン番号の指定に「より古い」という指定を含むことができます。 但し、通常そのような「より古い」という指定を含む場合は、Breaks を代わりに使うべき場合でしょう。「より古い」という指定を行うと、dpkg は、その競合関係を宣言しているパッケージが削除されるかアップグレードされるまで、そのパッケージのインストールまたはアップグレードを中止するため、より強い制限になります。

仮想パッケージ - Provides

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

この仮想パッケージ名は、他のパッケージの Provides コントロールフィールドに書かれるものです。 これによって、当該の仮想パッケージ名が書かれているところすべてに、そのパッケージ名が指定されるという扱いになります ( 参照)。

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

依存関係を示すフィールドにバージョン番号が付けられている場合は、 関係が満たされているかどうか (あるいは、競合関係が侵されていないか、または 「壊され」ていないか) を見るのには、実パッケージだけが考慮されます。 言い換えれば、バージョン番号が指定されている場合、それはそのパッケージに対する Provides を無視し、実パッケージのみを考慮します。 パッケージマネージャは、仮想パッケージを提供するパッケージは、「正しい」バージョン番号ではないと見なします。 Provides フィールドには、バージョン番号を含んではいけません。 また、仮想パッケージとの競合または依存関係を決定するときには、その仮想パッケージを提供する実際のパッケージのバージョン番号は参照されません dpkg の将来のリリースで提供する仮想パッケージのバージョンを指定する機能が提供される可能性はあります。 しかし、この機能は今はまだ実装されていませんし、またそれはめったに使われないことと思います。

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

仮想パッケージが、一度に一つのパッケージからのみ提供可能な機能を持つ、例えば mail-transport-agent 仮想パッケージのように、当該仮想パッケージを提供するパッケージのバイナリインストールと競合する ( 参照) 場合、その仮想パッケージを提供する全てのパッケージは Conflicts を使って競合を宣言すべきです。 これにより、その仮想パッケージを提供するパッケージは最大一つまでしかインストールされないことが保証されます。

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

パッケージが、他の特定のパッケージのファイルを上書きする、または他のパッケージを完全に置きかえることを宣言することができます。 Replaces コントロールフィールドは、異なった状況下で作用する二つの異なった目的を持っています。

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

システム中の他のパッケージに含まれているファイルを、 インストールしようとするパッケージが含んでいるケースは、通常エラーです。 但しここで、上書きするパッケージが上書きしようとしているファイルを Replaces (置換) すると宣言していた場合、dpkg はその処理を実行し、古いパッケージ中のファイルを新しいファイルと置きかえます。 そのファイルは古いパッケージの所有リストからは削除されます。 通常は、ReplacesBreaks と組み合わせて用います Replaces に加えて Breaks が通常必要になる理由を説明しましょう。 foo パッケージのファイルが foo-data パッケージのファイルで置き換えられる場合を考えます。Replaces により、foo-data はインストール時に当該ファイルを置き換えます。 一方、Breaks なしでは、当該ファイルがパッケージに含まれておらず foo-data に依存していることを知っている foo の新版への更新を誰も要求しません。 また、foo-data をインストールし削除した場合、foo パッケージから所有権を取ったファイルが削除されることを妨げるものも誰もいません。 この操作後には、パッケージマネージャはシステムが一貫性の取れた状態だと認識していますが、 foo の当該ファイルは失われています。

例えば、パッケージ foofoofoo-data にバージョン 1.2-3 で分割したとします。 foo-data のコントロールファイルには以下のフィールドを定義します。 Replaces: foo (<< 1.2-3) Breaks: foo (<< 1.2-3) 新たな foo パッケージでは、普通以下のようなフィールドになります。 Depends: foo-data (>= 1.2-3) foo-data パッケージに移動した内容が通常の動作に必要が無い場合、 Recommends や、さらに Suggests となる可能性もあります。

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

Replaces は一方通行の依存関係です。 置換されるパッケージの後で、置換するパッケージをインストールすることだけができます。

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 コントロールフィールドを使って指定します。

"build-essential" に属するビルド時の依存関係の記載は省略できます。 詳細は を参照ください。

これらの指示された依存、および競合関係は (上記のバイナリパッケージの場合と同様) 以下で記載するように、debian/rules 中のターゲットを起動するために満たされていなければいけません

Build-Depends-Arch はありません。この機能は、Build-Depends のみで満たされます。build-indep 及び binary-indep ターゲットをビルドしようとすることは、 基本的にはパッケージ全体をビルドしていることと等価で、 ビルドの依存関係で必要なものは、すべてのインストールが必要になるからです。

オートビルダは、dpkg-buildpackage -B を用います。 これは、build (build-arch ではありません。 この時点では、このターゲットの有無の判定を行う方法がないためです) と binary-arch を順に実行します。 この Build-DependsBuild-Depends-Indep の分離の基本的目的は、オートビルダが binary-indep だけのために必要な追加パッケージをインストールしなくて済むようにするためです。 但し、殆どの作業は build ターゲットの作成であり、binary ターゲットの作成ではありませんから、build-arch/build-indep の分離なしでは、これは意味をなしません。

clean, build-arch および binary-arch これらのターゲットの起動の際には、Build-DependsBuild-Conflicts フィールドは少なくとも満たされていなければいけません。 build, build-indep, binary および binary-indep The Build-Depends, Build-Conflicts, Build-Depends-Indep および Build-Conflicts-Indep の各フィールドが、これらのターゲットを起動する際には満たされていなければいけません。

共有ライブラリ

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

この節では公開される共有ライブラリのみを扱います。 つまり、既定でダイナミックリンカが探索するディレクトリに置かれるか、他の独立したパッケージから普通にリンクされることを意図した共有ライブラリを扱います。 特定のパッケージの内部で使うための共有ライブラリや、動的モジュールとしてロードされるだけのライブラリはこの節では扱わず、以下の要求事項の対象とはなりません。

共有ライブラリはダイナミックセクションに格納された SONAME アトリビュートで識別されます。 バイナリが共有ライブラリにリンクされている場合、共有ライブラリの SONAME がバイナリの NEEDED セクションに記録され、ダイナミックリンカはその情報を使って当該ライブラリを実行時にロードしなければならないことを認識します。 共有ライブラリの名前の全体 (これには通常 SONAME には必要ではない追加のバージョン情報が含まれます) は、従って直接参照されることはありません。代わりに、共有ライブラリは 共有ライブラリの実際の名前 (の全体) を指すシンボリックリンクとしてシステムに配置された SONAME を使ってロードされます。 シンボリックリンクはパッケージ側で提供しなければいけません。 これを行う方法については、 を参照ください これは共有ライブラリのバージョン付けの慣行であり、要求事項ではありません。 一部のライブラリでは、SONAME をライブラリ名として使っており、 シンボリックリンクを必要としません。但し、大多数の共有ライブラリでは、 後方互換のレビジョン番号をマイナーバージョンとしてファイル名に付加しています。 この場合、SONAME は、以前のバージョンの共有ライブラリにリンクしていたバイナリが動かなくなる場合にのみ変更されますが、ファイル名はライブラリのリリース毎に細かく変更されます。 詳しくは を参照ください。

共有ライブラリに対してバイナリや他の共有ライブラリをリンクする時点では、 その共有ライブラリの SONAME はまだ分かっていません。 この場合、共有ライブラリは対応するライブラリ名に .so を付けた名称のファイルの探索により決定されます。 このようなファイルは、ファイルシステム上では、共有ライブラリを指すシンボリックリンクとして存在します。

共有ライブラリを含むパッケージは、通常複数のバイナリパッケージに分割されます。 SONAME シンボリックリンクは、共有ライブラリのランタイムパッケージによりインストールされます。 また、生の .so シンボリックリンクは、バイナリや共有ライブラリとリンクする際にのみ用いるため、開発用パッケージによりインストールされます。 但し、一般的ではない共有ライブラリや他のプログラムから動的モジュールとしてロードされる共有ライブラリなどは例外になります。

この節では、共有ライブラリを複数のパッケージに分割するための (適切な) 手法と、共有ライブラリとバイナリパッケージとの依存関係が Debian でどのように処理されるか、を主として記載します。さらに に共有ライブラリに収録されるファイルに関する追加の規則が記載されていますので、そちらを合わせて読んでください。

ランタイム共有ライブラリ

ランタイム共有ライブラリのパッケージは、収録された共有オブジェクトの SONAME が変更されるたびに、パッケージ名称を変更する必要があります。 これにより、共有ライブラリの複数のバージョンを同時にインストールできるため、共有ライブラリの古いバージョンに依存したバイナリを直ぐに動かなくすることなしに新バージョンのインストールが可能です。 通常は、共有ライブラリのランタイムと、その SONAME シンボリックリンクは、 librarynamesoversion という名称のパッケージに収録すべきです。ここで、soversion は、共有ライブラリの SONAME 中のバージョン番号です。 バージョンの判定方法の詳細は、 を参照ください。 または、librarynamesoversion を直接付加すると混乱する場合 (例えば、 libraryname 自体が数字で終わっている場合など) には、 libraryname-soversion を代わりに用いるべきです。

一つのソースツリーから複数の共有ライブラリをビルドする場合には、すべての SONAME 名を常に一括して変えるようにすることで、複数の共有ライブラリを一つのパッケージにまとめられます。 注意点としては、これは一般的な状況ではなく、SONAME が同期して変更されない場合には、まとめられた共有ライブラリのアップグレードが、旧バージョンのライブラリとのファイル名の競合のため不必要に複雑になります。 自信の無い場合には、共有ライブラリパッケージを分割して、各バイナリパッケージに一つの共有ライブラリが収録されるようにしてください。

共有ライブラリの旧版とリンクしたバイナリが動かなくなるような ABI 変更が行われる場合には、ライブラリの SONAME と、それに対応した共有ライブラリを収録したパッケージ名は毎回変更すべきです。 これは、共有ライブラリからインターフェースが削除された場合、またはインターフェースの特性の変更があった場合 (例えば、引数の数や引数のタイプが変更された場合など) SONAME を通常変更すべきだということです。 この約束事は、パッケージの旧バージョンからの綺麗なアップグレードに不可欠で、さらに関連パッケージを同期してアップグレードせずに、旧 ABI から新 ABI に綺麗に移行する処理にも不可欠になります。

インターフェースの削除や変更なしに単に追加が行われたという場合には、 SONAME 名とバイナリパッケージ名は変更する必要はありませんし、変更すべきでもありません。 これは、このような変更は旧共有ライブラリにリンクしていたバイナリを壊すことがないためです。 新しいインターフェースを用いるバイナリでの、新しい共有ライブラリとの正しい依存関係に対するバージョン付けは、 shlibs system またはシンボルファイルを使って ( 参照) 管理されます。

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

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

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

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

です。

ldconfig

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

これは、現在 /usr/local/lib および /lib/usr/lib 以下のシステムアーキテクチャに対応した多アーキテクチャ三つ組み文字に対応したディレクトリです。

にライブラリをインストールするパッケージは、 共有ライブラリシステムをアップデートするために ldconfig を使わなければいけません。

パッケージが postinst スクリプト中で ldconfig を呼ぶのは、以下の場合に限られます。 postinst スクリプトが、最初の引数を configure として呼ばれた場合、スクリプトで ldconfig を呼ばなければいけません。 postinst スクリプトではそれ以外の際に ldconfig を呼んでもかまいません。 postrm スクリプトが、最初の引数を remove として呼ばれた場合、スクリプトで ldconfig を呼ばなければいけません。

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

パッケージがインストールあるいはアップグレードされる際には、 "postinst configure" が新しいファイルがディスクに置かれたことを保証してから呼ばれます。 従って、ldconfig を無条件に postinst 中で呼ぶことは完全に安全ですし、パッケージでは引数をチェックしないで単に postinst 中で ldconfig を記載しても問題ありません。 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" の引数で呼ばれている際には、 共有ライブラリは一時的な名称でディスク上にあるかもしれません。

ランタイムサポートファイル

パッケージに、ライブラリの共有オブジェクトに合わせては変更されないファイルを含む場合、それを共有ライブラリパッケージに収録してはいけません。 これを行うと、複数バージョンの共有ライブラリをファイル名の衝突なしにインストールすることができなくなり、アップグレードや移行が不必要に難しくなります。

サポートファイルとランタイムサポートプログラム (ユーザが手動で実行する必要がないが、パッケージ動作には必要なもの) は、バイナリなら /usr/lib のサブディレクトリ以下に置くことを推奨します。 /usr/lib/package-name 以下が望ましい場所です。 プログラムやファイルがアーキテクチャ非依存ならば、推奨の格納場所は /usr/share のサブディレクトリ (/usr/share/package-name が望ましい) になります。以下の package-name の名前付けの規則により、 共有オブジェクトバージョンが変更された場合、ファイル名も変更されることが保証されています。

共有ライブラリを使うが、ライブラリの動作には必要のないランタイムサポートプログラム、または共有ライブラリのバージョンによらず共通して使用されるファイルは、 独立したパッケージにすることを推奨します。このパッケージは通常 libraryname-tools という名前にします。 パッケージ名に soversion が含まれていないことに注意してください。

ファイルとサポートプログラムで、ライブラリを使うプログラムのコンパイル時にのみ有用なものは、ライブラリの開発用パッケージに含めてください 例えば、package-name-config スクリプトや pkg-config 設定ファイルのようなものです。

スタティックライブラリ

スタティックライブラリ (libraryname.a) は、通常共有ライブラリと併せて提供されています。 これは、開発用パッケージ (下記参照) に収録されています。

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

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

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

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

開発用ファイル

共有ライブラリに関連した開発用のファイルがある場合には、ソースパッケージでは librarynamesoversion-dev という名前のバイナリ開発用パッケージを作成して収録するか、 または一度に一つの開発用バージョンのみをサポートしたい場合は libraryname-dev という名前のパッケージを作成して収録する必要があります。 この開発用のパッケージをインストールすることにより、対象共有ライブラリを使ってプログラムをコンパイルするのに必要な全ての開発用ファイルがインストールされなければいけません この規定では、開発用のファイルが例えばアーキテクチャに依存して libraryname-headers などの複数のパッケージに分割されることは許されます。 その場合、開発用パッケージを必要な全ての追加パッケージに依存させなければいけません。

複数の開発用ライブラリが存在する場合、開発用のパッケージは一度に一バージョンのみインストールされることを保証するため、恐らく dpkg の競合 (Conflict) メカニズム ( 参照) を使う必要があるでしょう。 異なった開発用のパッケージといえども同じヘッダファイルを持つことが多いですから、二種以上を展開しようとするとファイル名衝突が起こるためです。

開発用パッケージには、対応する共有ライブラリに対するバージョン番号なしのシンボリックリンクを含めるべきです。 例えば、libgdbmg1-dev パッケージには、 /usr/lib/libgdbm.so から libgdbm.so.3.0.0 へのシンボリックリンクを含めるべきです。 このシンボリックリンクは、リンカ (ld) がパッケージをコンパイルする際に必要になります。 リンカは動的コンパイル時に libgdbm.so しか見ないためです。

パッケージが GMAT で用いる Ada ライブラリ情報 (*.ali) ファイルを含む場合、 このファイルは読み出し専用 (mode 0444) でインストールし、GNAT がこれを再コンパイルしないようにしなければいけません。 これは で記載の通常のファイルモード指定に対する例外規定です。

同一のライブラリのパッケージ間の依存関係

通常、開発用バージョンは、コンパイルとリンクを正しく行うため、ランタイムライブラリに対して正確な依存関係を持たせるべきです。 ${binary:Version} による変数置換がこの目的には便利です 以前は ${Source-Version} が使用されていましたが、 この名称は混乱を招くため dpkg 1.13.19 からは非推奨となりました。

ライブラリと他のパッケージとの依存関係の扱い - shlibs システム

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

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

dpkg-shlibdepsobjdumpreadelf を利用して、対象パッケージのバイナリおよび共有ライブラリで直接必要なディレクトリを探索します。

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

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

これがなぜ役に立つのかを示す良い例として、libimlib を (メジャーバージョン番号をそのままにしつつ) dgf という新しいグラフィックフォーマットに対応し、libdgf に依存した新しいバージョンに更新する場合を考えます。 もし、ldd を使って直接あるいは間接的にバイナリにリンクする全てのパッケージへの依存関係を加えた場合、 libimlib を用いる全てのパッケージも libdgf に依存するよう再コンパイルが必要になります。 再コンパイルを行わないとシンボル不足で実行できなくなるためです。 依存関係を ELF の NEEDED アトリビュートのみに基づいて追加すれば、 libimlib を使っているパッケージは libimliblibdgf への依存関係指定に任せることができ、再ビルドする必要がありません。

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

システム中の shlibs ファイル

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

debian/shlibs.local

これはこのパッケージの情報を上書き変更するために使います。 このファイルは通常は使うべきではありませんが、他のパッケージのバグを回避するための特別な場合や、 インストールされているライブラリに対する shlibs の通常の宣言されている依存関係を使うことができないような特別の場合などに一時的に必要になる場合があります。

/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 フィールドに ${shlibs:Depends} 変数を置かなければならないでしょう。

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

Debian Installer 中で使用するために udeb を作成する場合には、 dpkg-shlibdepsudeb タイプに対する依存指定行を用いるように、 -tudeb オプション debhelper プログラム群の dh_shlibdeps を用いることによって、udeb を使うという判定がなされればこのオプションが自動的に付加されます。 を追加する指定を行なう必要があるでしょう。shlibs ファイル中に udeb タイプに対する依存関係の指定行がない場合、 dpkg-shlibdeps は標準の依存関係指定行を用います。

dpkg-shlibdeps について更に詳しく知りたい場合には、 をご覧ください。

shlibs ファイルフォーマット

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

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

type はオプションとなる要素であり、 その行が有効なパッケージのタイプを示します。 現在使われている唯一のタイプは、udeb です。 タイプの後には、コロンと空白が必要です。

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

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

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

です。 バージョン部は .so. の後に来ている部分で、ここの例では 1 です。soname 部は libdb-4.8.so のように name-major-version.so とすることもでき、この場合はライブラリ名が libdb で、バージョン番号が 4.8 になります。

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

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

zlib1g も共有ライブラリを含む udeb を提供するため、更に二行目が付加されています。 udeb: libz 1 zlib1g-udeb (>= 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 で行われている方法です。あなたのパッケージが共有ライブラリを提供する udeb を含む場合、--add-udeb オプションを使って udeb 名を指定することにより、dh_makeshlibs を用いて自動的に udeb: 行を生成することができます。

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

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

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

全てのファイルやディレクトリの配置は、それが他で記載されている Debian ポリシーの項目に違反しない限り、そして以下の例外を除いて、 すべて Filesystem Hierarchy Standard (FHS) バージョン 2.3 に従わなければなりません。以下に FHS に対する例外を列挙します。

アプリケーションの、ユーザ固有の設定をユーザのホームディレクトリに置くというオプションルールが緩和されています。 このようなファイルは、'.' 文字で始まるファイル (ドットファイル) とすることが推奨され、アプリケーションが一つ以上のドットファイルを作成する必要がある場合には、'.' 文字で始まるディレクトリ (ドットディレクトリ) 以下に置くことが推奨されています。 また、後者の場合には設定ファイルを '.' 文字で始めないことが推奨されています。

amd64 が 64 ビットバイナリに対して /lib64 を用いなければならないという制約は撤廃されています。

オブジェクトファイル、内部で使うバイナリ、ライブラリ (libc.so.* を含む) は、/lib{,32} または /lib{,32} 以下に直接配置するという要求事項は改訂され、 /lib/triplet および /usr/lib/triplet 以下に置くことも許されています。ここで triplet は対象アーキテクチャでの dpkg-architecture -qDEB_HOST_MULTIARCH の返す値です。 パッケージが、その対象アーキテクチャ以外の triplet パスにファイルをインストールすることは許されていません。 例えば、Architecture: amd64 であるパッケージに 32-bit x86 向けライブラリが含まれている場合、 それらのライブラリを /usr/lib/i386-linux-gnu にインストールすることは許されません これは、multiarch 向けの計画配置の一環としてライブラリパッケージを他のアーキテクチャ環境にクロスインストールする場合に、 ディレクトリを確保するために必要となる制約です。

アプリケーションは、/usr/lib/triplet 以下にサブディレクトリを一つ作成して使うことも許されています。

実行時のリンカ・ローダ、ld* などは /lib または /lib64 以下の既存の場所に置くことが引き続き必須となっています。 これは、この仕様が各アーキテクチャでの ELF ABI 仕様の一部であるためです。

/usr/local/share/man と、 /usr/local/man を同一視するという制約は、 推奨に緩和されています。

ウィンドウマネージャが、system.*wmrc という名前の設定ファイルを一つだけ持つことを許されるという制約は撤廃されています。 また、ウィンドウマネージャのサブディレクトリ名をウィンドウマネージャ名と同じにしなければならないという制約も撤廃されています。

ブートマネージャの設定ファイルを /etc 以下に置くか、少なくとも /etc にシンボリックリンクを置かなければならないという制約は、推奨に緩和されています。

root ファイルシステムに追加ディレクトリ /run があることは許されます。/run/var/run を置き換えるもので、そのサブディレクトリ /run/lock/var/lock を置き換えるものであり、/var 以下のディレクトリは後方互換性のためシンボリックリンクに置き換えられます。 /run/run/lock は、FHS での /var/run/var/lock に対する全ての要求 (ファイル命名規則、ファイルフォーマットの制限、ブート時のファイル初期化への要求など) に従っていなければいけません。/run にあるファイルおよびディレクトリは、一時ファイルシステムに格納されているべきです。

root ファイルシステムで、/sys/selinux ディレクトリが追加で許されるようになりました これらのディレクトリは、カーネル情報にアクセスするための仮想ファイルシステムのマウントポイントとして使われます。

GNU/Hurd システムでは、/hurd/servers の 2 ディレクトリも、追加で root ファイルシステムに置くことが許されます これらのディレクトリはトランスレータの格納と、マウントポイントの標準名の格納に使われます。

この文書で言及されている版は debian-policy パッケージと一緒に配布されていますし、このマニュアル付属以外では に、また debian-policy パッケージをインストールしているなら、 を見てください。 最新版はこの文書で言及されている版より新しいかもしれませんが、 にあります。この標準に従うことに対する質問は debian-devel メーリングリストに送るか、 もしくは FHS メーリングリスト ( 参照) に詳細を問い合わせて下さい。

サイト毎のプログラム

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

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

このようなパッケージ固有のディレクトリを作成していいのは /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 は、スプールが依然として物理的にその場所に置かれている場合でも、使うべきではありません。

/run および /run/lock

ディレクトリ /run はブート時に初期化されます。 通常は、この動作は一時ファイルシステムのマウントポイントとして実現されています。 パッケージは、したがって、最後のリブート以降にそのパッケージが作成しているのでない限り、 /run/lock 以外のファイルまたはディレクトリの存在を仮定してはいけません。 通常、このような作成はパッケージの init スクリプトで行われます。 詳細は を参照ください。

パッケージは、/run 以下、及び古い /var/run または /var/lock パス以下にファイルまたはディレクトリを収録していてはいけません。 後者のパスは、今後は後方互換性のために /run 以下へ、シンボリックリンクまたは他の方法で転送されるようになります。

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

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-59999:

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

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 付きで実行されます。

スクリプトの書き方

システムサービスを行うデーモンを含むパッケージは、 ブート時やランレベル変更時にサービスを開始及び停止させるため、 /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--oknodo オプションをつけて用いるようにすることです。

init.d スクリプトで set -e を使う場合は注意してください。 正しい init.d スクリプトでは、デーモンが既に実行されていた、 またはすでに異常終了ではなく停止していたなどの様々な異常終了状態を受け付ける必要があり、共通に使われる init.d 関数ライブラリは、set -e を付けた安全な呼び出しが行えない 例として、LSB 準拠の init スクリプトを書く補助となる /lib/lsb/init-functions は、set -e が有効で、コンソールへのエラー出力が行え無い場合、動かないかも知れません。 可能性があります。init.d スクリプトでは、多くの場合 set -e を使わずに個々のコマンドの結果を別々にチェックするほうが容易です。

もしサービスが設定を自動的に再読み込みするような場合 (例えば 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 スクリプトと同じ名前にしてください。 この追加ファイルはスクリプトを実行する際に参照されます。 このファイルに SUSv3 sh フォーマット形式の変数設定と、コメント以外を書かないでください。 また、これは conffile とするか、またはパッケージのメンテナスクリプトで処理される設定ファイルとすべきです。 詳細は、 の節を参照ください。

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

/run 以下のファイルまたはディレクトリ、および後方互換性のためのパス /var/run および /var/lock 経由のファイルまたはディレクトリは、通常は一時ファイルシステム上に格納され、通常リブート間では保持されません。 init.d スクリプトはこの挙動を正しく扱うことが出来なければいけません。 これは、典型的には必要なサブディレクトリを init.d 実行時に動的に作成するという事です。詳しくは を参照ください。

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

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

直接 /etc/rc?.d リンクを操作し、直接 /etc/init.d/ initscript を起動して良いのは、initscript サブシステムを提供するパッケージ (例えば sysv-rc および 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 を用いるようにしなければなりません。

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

ほとんどのパッケージでは、postinstprerm スクリプトで、 /etc/init.d/<package> <action> を単に以下のように変更すればいいはずです。 if which invoke-rc.d >/dev/null 2>&1; 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 にファイルを置くことは許されていません。

実例

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

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

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

まず、/etc/init.d スクリプトで出力メッセージを作成する際に使うべき基本的なルールを示します。

メッセージは一行に書かれ、大文字で始まり、ピリオド (.) と改行 ("\n") で終えなければなりません。 スクリプトがバックグラウンドで時間のかかる処理を行っている場合 (単にプログラムの開始や終了ではなく、特定の作業が進行中である場合などです) "省略符号" (ellipsis。すなわち、三つのドット ... で、前後に空白や改行は入れません) を使います。 コンピュータが何をしているのか教えようとするかのように 丁寧に :-) メッセージを作成してください。 但し、コンピュータ自体を主語としては使わないでください。 例えば、 I'm starting network daemons: nfsd mountd. と表現したいならば、単に次のようにしてください。 Starting network daemons: nfsd mountd.

init.d スクリプトでは、以下の標準の書式を場合分けに対応して使ってください。

デーモンを開始するとき

スクリプトが一つ以上のデーモンを起動するときには、次の書式を使います。 出力は次のようにしてください (1 行にし、 最初に空白は入れません)。 Starting description: daemon-1 ... 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.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly これらのディレクトリの名前が示す通り、これらの中のファイルはそれぞれ、 毎時 (Hourly)、毎日(daily)、毎週(weekly)、毎月(monthly) 実行されます。 正確な時刻は /etc/crontab に記載されています。

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

これ以外の頻度、あるいは指定時刻に実行する必要のあるジョブがある場合には、 パッケージは /etc/cron.d ディレクトリに で規定された仕様に沿った名称のファイルをインストールしてください。このファイルは /etc/crontab と同じ書式で、cron により自動的に実行されます。 このファイルも設定ファイルとして扱わなければいけません (注記:この /etc/cron.d の中のエントリは anacron では処理されないので、ここに置くジョブはシステムが停止しているときには行う必要がないものに限られます)。

から取得できる IEEE Std 1003.1-2008 (POSIX.1) で記載された crontab とは異なり、 /etc/cron.d のファイル、および /etc/crontab は 7 つのフィールドを持ちます。具体的には 分 [0,59] 時 [0,23] 月中の日付 [1,31] 月 [1,12] 曜日 ([0,6] with 0=Sunday) ユーザ名 実行するコマンド 数字の範囲が指定できます。範囲は、ハイフンで分離した二つの数字で指定します。 指定する範囲は排他的ではありません。また、リストも許されます。 リストは、一連の数字 (または数字の範囲) をカンマで区切って指定します。 範囲と飛び飛びの値は併用できます。

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

cron デーモンは、/usr/bin/crontab と POSIX 規定に従った crontab サポートを提供しなければいけません。またデーモンは月日の名前、 範囲、飛び飛びの値などをサポートしなければいけません。 また /etc/crontab をサポートし、/etc/cron.d のスクリプトを正しく実行しなければいけません。 また、デーモンは /etc/cron.{hourly,daily,weekly,monthly} 中のスクリプトを正しく実行しなければいけません。

Cron ジョブファイル名称

cron ジョブのファイル名は、通常はそのジョブを提供したパッケージの名称と同じにすべきです。

パッケージが複数の cron ジョブファイルを同じディレクトリに置く場合、ファイル名はパッケージ名 (以下の修正も必要かもしれません) で始まり、ハイフン (-) と適切な接尾子をつけるようにすべきです。

cron ジョブ名には、ピリオド . やプラス文字 + を含めることは許されません。含まれていた場合には、cron から無視されます。 .+ の代わりにアンダースコア (_) を使うべきです。

メニュー

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

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

Menu エントリは現在の Menu ポリシーに従う必要があります。

Menu ポリシーは debian-policy パッケージに menu-policy ファイルとして同梱されています。また、 Debian ウェブミラーサイト にもあります。

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

マルチメディアハンドラ

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

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

ある種の MIME タイプを表示/閲覧/再生/合成/編集や印刷する機能を もつプログラムは debian-policy パッケージに mime-policy ファイルとして同梱された現在の MIME サポートポリシーに従って登録を行う必要があります。

MIME タイプを表示、作成、編集、印刷するプログラムをパッケージから登録するためのプログラム update-mimemime-support パッケージが提供しています。

MIME タイプを扱うプログラムを収録するパッケージは、そのようなプログラムを 説明文書に従って update-mime により登録しなければいけません。これらのプログラムは、mime-support に対して depend、recommend、suggest を指定すべきではありません。 代わりに、それらのパッケージでは postinst および postrm スクリプトに以下の例のような処理を含めるべきです。 if [ -x /usr/sbin/update-mime ]; then update-mime fi キーボード設定

システムで一貫したキーボードの設定、具体的には すべてのアプリケーションがキーボード打鍵イベントを同じように解釈するようにするために、 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 パッケージの設定ファイルですので、他のプログラムはこのファイルに環境変数やそのほかのコマンドの設定を追加してはいけません。

doc-base を用いて文書を登録する

doc-base パッケージは文書を扱ったり表示したりするための柔軟な枠組を提供します。 おすすめのやりかたは、オンライン文書 (単なる man ページだけではなく) を提供している Debian パッケージでは、その文書を doc-base に登録する方法です。これには、 doc-base コントロールファイルを、 /usr/share/doc-base/ にインストールします。

詳細については、doc-base パッケージの付属文書を参照ください。

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

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

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

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

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

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

ライブラリ

もし、パッケージが architecture: any となっている場合には、共有ライブラリのコンパイルとリンクフラグには -fPIC を含めなければいけません。 さもなければ、一部のサポートされているアーキテクチャでビルドに失敗します

GCC を使っている場合、-fPIC は位置非依存の再配置可能なコードを吐きます。 これは多くのアーキテクチャで共有ライブラリを作るのに必要で、 i386 および恐らく他のいくつかのアーキテクチャでは共有ライブラリ中に位置依存のコードを含めることは許されていません。

位置非依存のコードには、性能上のペナルティのある場合があります。 特に i386 では速度低下があります。 但し、多くの場合はこの速度低下を、 位置依存のコードを用いることができる一部のアーキテクチャでのメモリ消費とのトレードオフで考慮しなければなりません。

。この規則の例外は必ず debian-devel@lists.debian.org メーリングリストで議論して、一応の合意を得ておく必要があります。 -fPIC フラグを使わないでコンパイルした理由は必ず README.Debian ファイルに記載をしなければいけませんし、 同時にアーキテクチャを制限するか、必要なアーキテクチャでは -fPIC を用いるようにするケアを行わなければいけません

これが必要になる理由の一つとして、ライブラリに再配置不可の手書きのアセンブラコードが含まれていて、 これを使わない場合の計算主体の作業時の速度の低下が有意である、などの場合があります。

言葉を換えれば、もし共有ライブラリとスタティックライブラリの両方をビルドする場合には、各ソース部分 (C 言語では *.c に当たる) は二回コンパイルする必要があります。

ライブラリは、スレッドサポートを行うようビルドすべきで、さらにライブラリのサポートがある場合はスレッドセーフとすべきです。

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

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

します。

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

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

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

共有ライブラリを作成・インストールする際に libtool を使うパッケージは、追加のメタデータを含むファイル (.la という拡張子を持つファイル) をライブラリ以外にインストールします。 他のパッケージからの利用を想定した公開ライブラリでは、これらのファイルを Debian パッケージには通常は収録すべきではありません。 これは、このファイルに含まれる情報は、Debian では共有ライブラリとリンクする際に必要ではなく、さらに他のプログラムやライブラリへの不要な依存関係を追加してしまうためです これらのファイルには、他の情報に加えて、共有ライブラリが依存する全てのライブラリの情報が格納されています。 残念ながら、.la ファイルが存在し、依存関係が含まれていた場合、 libtool を使ってライブラリをリンクした場合には、リンクしようとしたプログラムやライブラリが、不必要なのにも関わらず、それらの依存関係にあるライブラリともリンクされてしまいます。 これは共有ライブラリパッケージに不必要で、本来ライブラリ ABI に隠されているはずの依存関係を生成してしまい、ライブラリの新しい SONAME への移行を複雑で管理困難としてしまいます。 ライブラリに .la ファイルが必要な場合 (例えば、 メタ情報が必要となるやり方で libltdl よりロードされる場合など) .la ファイルの dependency_libs 設定には、通常は空文字列をセットすべきです。 共有ライブラリの開発向けパッケージで、歴史的な経緯から .la が含まれている場合、開発向けパッケージには、それに依存している全てのライブラリに収録された .la ファイル内の dependency_libs が削除されるか空になるまで (つまり、libtool を使った他のパッケージのリンクが失敗しないようになるまで)、 それを維持 (dependency_libs を空にして) しなければいけません。

.la を含めなければならない場合で、ライブラリが libtoollibltdl ライブラリからロードされるのでなければ、 .la ファイルは開発用パッケージ (-dev) に含めるべきです。 libltdl での利用を想定している場合には、.la ファイルはランタイムパッケージに含めなければいけません。

以上の .la ファイルの扱いに関する規定は、ローダブルモジュールや、 標準状態ではダイナミックリンカがサーチしないディレクトリにインストールされるライブラリに対しては適用されません。 ローダブルモジュールをインストールするパッケージは、多くの場合モジュールに加えて .la ファイルをインストールし、libltdl によってロードできるようにする必要があるでしょう。 dependency_libs は、ダイナミックリンカがサーチしないディレクトリにインストールされ、 他のパッケージからの利用を意図していないライブラリやモジュールの場合は、変更する必要はありません。

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

共有ライブラリ

この節は に移されました。

スクリプト

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

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

シェルスクリプトをシステムの PATH 内のディレクトリにインストールする場合、スクリプト名には .sh.pl などの、スクリプトを実装するのに現在使っている言語を示す拡張子を含めるべきではありません。

シェルスクリプト (shbash を使う) で、init.d 以外のものは、特殊な場合をのぞいて最初に set -e を書いてエラーを検出するようにすべきです。 init.d スクリプトはここでは特殊な場合で、失敗することが許されるコマンドを実行する必要がある頻度が異なるため、代わりにコマンドの終了ステータスをチェックするほうが容易でしょう。 init.d スクリプトについての詳細は を参照ください。

全てのスクリプトは、set -e を使うか、すべての コマンドの終了ステータスをチェックすべきです。

スクリプトは、SUSv3 Shell Command Language 規定 Single UNIX Specification, version 3 です。これは IEEE 1003.1-2004(POSIX) と同じものであり、無料の登録後 Web の から入手できます。 の仕様に沿っており、かつ SUSv3 で必須とはされていない以下の機能 これらの機能は Linux コミュニティで広く使用されており、bash, dash, ksh など、ユーザが /bin/sh として使いたいと思うような最も一般的なシェルのすべてで実装されています。 をもつような /bin/sh の実装であることを仮定してかまいません。 echo -n これがシェルの内部コマンドとして実装されている場合、改行を挿入してはいけません。 test これがシェルの内部コマンドとして実装されている場合、 -a-o を二値の論理値を返すオペレータとしてサポートしていなければいけません。 スコープをもつ変数を作成する local を、複数の変数を一つの local コマンドに並べて、ローカル変数として生成するとともに初期値を設定することを含めてサポートしていなければいけません。 但し、local が代入を伴わない場合は、スコープ外からの変数の値を保持してもしなくてもかまいません。 即ち、以下のような使用方法はサポートされ、c の値は delta に設定されなければいけません。 fname () { local a b c=delta d # ... use a, b, c, d ... } kill -signal という書式を許している kill の XSI 機能拡張は、kill がシェルのビルトインコマンドとして実装されている場合でも、signal としてシグナル名か、XSI 機能拡張で列挙されている数字で指定したシグナル (0, 1, 2, 3, 6, 9, 14, および 15) を、サポートしている必要があります。 数字で指定するシグナルを許す trap の XSI 機能拡張をサポートする必要があります。 機能拡張で列挙されている、kill と同じシグナル番号群以外に、 13 (SIGPIPE) を許さなければいけません。 もし、シェルスクリプトが上記記載以外の SUSv3 規定外の機能をシェルインタープリタで必要とする場合、適切なシェルをスクリプトの最初の行に (例えば #!/bin/bash のように) 指定しなければならず、 そのシェルを提供しているパッケージに対する依存関係をパッケージで指定しなければいけません (そのシェルパッケージが "Essential" 扱いになっている、例えば bash のような場合は依存関係の指定は不要です)。

スクリプトをできる限り SUSv3 規定の機能および上記の追加機能だけを用いて書くようにし、 /bin/sh をインタープリタとして使えるようにしたいと思う場合、あなたのスクリプトを devscripts パッケージの checkbashisms を使ってチェックするか、posh などの代替シェルでスクリプトを動かしてテストを行えば、上記の制限に対する違反の発見に有益でしょう。 但し、疑問があるなら明示的に /bin/bash を使ってください。

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

cshtcsh をスクリプト言語に使うのは避けるべきです。 この理由は comp.unix.* の FAQ の一つ Csh Programming Considered Harmful () を参考にしてください。 上流のパッケージに csh スクリプトが含まれているときには、 そのスクリプトが #!/bin/csh で始まり、そのパッケージを c-shell 仮想パッケージに依存するよう設定したことをよく確認してください。

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

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

シンボリックリンク

通常、トップレベルディレクトリ (ルートディレクトリ / のサブディレクトリがトップレベルディレクトリです) 内のシンボリックリンクは相対参照とすべきです。 また、トップレベルディレクトリ間のシンボリックリンクは絶対参照とすべきです。 例えば、/usr/lib/foo から /usr/share/bar へのシンボリックリンクは相対参照とすべき (../share/bar) ですが、 /var/run から /run へのシンボリックリンクは絶対参照とすべきです この規定は、トップレベルディレクトリにシンボリックリンクを置くために必要になります。 /var/run から /run からのシンボリックリンクを相対参照として ../run とした場合、/var/srv/disk1 へのシンボリックとなっていると、シンボリックリンク ../run は意図したものではない /srv/run を指してしまいます。

それに加えて、シンボリックリンクは可能な限り短くすべきです。 例えば 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* に変更すべきです。

パッケージで必要な名前付きパイプは、postinst スクリプトで作成しなければいけません 名前付きパイプを作成するには、mknod ではなく mkfifo を使用するほうが望ましいです。 これは、パッケージで mknod を使ったデバイスファイルの誤作成をおこなっていないかの自動チェックでの誤検出を避けるためです。 。また、必要に応じて prerm または postrm スクリプトで削除しなければいけません。

設定ファイル 定義

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

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

別途記載されているとおり、/etc/init.d スクリプト、 /etc/default ファイル、 /etc/cron.{hourly,daily,weekly,monthly} 中のスクリプトや /etc/cron.d 中の cron の設定ファイルなどは「設定ファイル」として扱わなければいけません。 一般的に、設定情報を内部に持つスクリプトはは事実上の設定ファイルですし、そのように扱われます。

設定ファイルの置き場所

パッケージによって作られ使われる設定ファイルは /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 がパッケージをアップグレードする際に毎回ファイルを上書きするかどうか問い合わせてくるようになり、頭を掻きむしることになります。

設定ファイルの共用

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

もし二つ以上のパッケージが同じ設定ファイルを使用し、 かつ これらのパッケージが設定ファイルを変更する場合がある、という状況下では、以降の各項を満たすようにしてください。 関連したパッケージの一つ (『所有者』パッケージ) が前節で説明した方法で、メンテナスクリプトから設定ファイルを管理するようにします。 『所有者』パッケージは他のパッケージが設定ファイルを変更する際に用いるプログラムを提供しなければいけません。 関連するパッケージは設定ファイルを変更する際には上で記した 『所有者』パッケージの提供するプログラムを使わなければいけません。 また、関連するパッケージは変更のためのプログラムが存在することを保証するために『所有者』 パッケージに依存することを宣言するか、変更のためのプログラムがなかったときにはエラー等を出さず変更をあきらめるようにするかの、 どちらかとしておかなければいけません (後者のシナリオでは、設定ファイルが存在していない場合に加えこの考慮も必要になります)。

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

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

2つのパッケージが同じ conffile を宣言している場合、それらパッケージが互いに conflict を指定している場合でも、設定が残っている状況になる場合があります。 もしユーザが一方のパッケージを削除 (完全削除ではなく) し、他方のパッケージをインストールした場合、新しいパッケージは古いパッケージの conffile を引き継ぐことになります。 もしファイルがユーザの手で変更されていた場合、これはアップグレードの際には、 ローカルで変更されていた conffile と同じ扱いを受けます。

The maintainer scripts must not alter a conffile of any package, including the one the scripts belong to. メンテナスクリプトは、それ自身が収録されたパッケージを含む いかなるパッケージの conffile を変更してもいけません。

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

/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 ディレクトリにログ循環設定ファイル (通常、 /etc/logrotate.d/package という名前です) を置き、logrotate の提供する機能を使うやり方

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

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

です。 次に logrotate の設定ファイルのいい例を挙げましょう (詳しくは を見てください)。 /var/log/foo/*.log { rotate 12 weekly compress missingok postrotate start-stop-daemon -K -p /var/run/foo.pid -s HUP -x /usr/sbin/foo -q endscript } 上記の例は /var/log/foo 以下の全ファイルを巡回させ、12 世代分保存し、循環終了時にデーモンに設定ファイルを再オープンさせるものです。 もしログがなかった場合にはログ循環をスキップする (missingok 経由で) ようになっており、パッケージが削除されているが完全削除状態でない場合にエラーにならないようにしています。

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

ファイル属性と所有者

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

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

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

パッケージがアップグレードされる際に、パッケージに含まれるファイルのオーナやパーミッションが変更されていた場合には、dpkg はインストール時に所有権とパーミッションが正しく設定されるように処理します。 但し、これはディレクトリに対しては適用されません。 つまり、システムに既に存在するディレクトリのパーミッションと所有権は、パッケージのインストールやアップグレードの際に変更されません。 これは、/usr などの共通ディレクトリに頻繁な変更が入らないようにするための処置です。 パッケージの持つディレクトリのパーミッションを正しく変更するには、 通常 postinst などから明示的に処理を行う必要があります。 この場合、ダウングレードを扱う場合の対処も行わなければいけません。

制御情報ファイルは、root:root の所有権で、パーミッション 644 (ほとんどのファイルでは) か、755 (maintainer scripts などの実行可能なファイル) にすべきです。

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

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

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

dpkg でインストールされる通常のファイルは (conffile やその他の同様なファイルとは異なり) 再インストールしたときに配布時のパーミッションに戻ってしまいます。 但し、dpkg-statoverride を使えばこの動作を変更できます。

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

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

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

第二の方法は、プログラムが実行時にグループ名から uid、gid を決定するようにするもので、ID は動的に

訳注:ここでの動的、はインストール時ホスト毎に、の意。

割り当てられます。この場合、debian-devel で討議を行ない、また preinst か postinst スクリプトで (繰り返しますが後者が好ましいです) 必要に応じて adduser を使ってユーザあるいはグループを作成するようにしてください。

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

dpkg-statoverride の使い方

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

システム管理者が配布状態の 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 # only do something when no setting exists if ! dpkg-statoverride --list $i >/dev/null 2>&1 then #include: debconf processing, question about foo and bar if [ "$RET" = "true" ] ; then dpkg-statoverride --update --add sysuser root 4755 $i fi fi done 以下はパッケージ完全削除 (purge) の際、override を削除するコードです。 for i in /usr/bin/foo /usr/sbin/bar do if dpkg-statoverride --list $i >/dev/null 2>&1 then dpkg-statoverride --remove $i fi done

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

もしプログラムに アーキテクチャを指定するための文字列 が必要な場合には、dpkg-architecture -L で提供される文字列の一つを使うべきです。この文字列は、 os-arch という書式になっています。 OS が Linux である場合には、OS 部分は省略されることがあります。

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

アーキテクチャワイルドカード

パッケージは、アーキテクチャワイルドカードを指定することができます。 アーキテクチャワイルドカードは、ant (全アーキテクチャにマッチします)、 os-any, または any-cpu の形式 内部的には、パッケージシステムは GNU 三項識別子と Debian アーキテクチャを Debian アーキテクチャ三項識別子 (GNU 三項識別子を逆にしたようなもの) に正規化します。 ここで最初の識別子の要素は使っている libc と ABI を代表するもので、その後はこの三項識別子に対応するものになります。 但し、この三項識別子は内部の実装依存であり、パッケージで直接使うべきものではありません。 libc と ABI の部分は oscpu を元にパッケージシステムの内部で処理されます。 をとります。

デーモン類

設定ファイルのうち、/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 スクリプトを呼んで、自分を /usr/bin/editor または /usr/bin/pager の適切な方の代替プログラムとして登録しておかなければいけません。 代替処理では、/usr/share/man/man1/editor.1.gz または /usr/share/man/man1/pager.1.gz が対応 man ページを指すよう、副代替指定 (slave alternative) を行うべきです。

EDITOR、PAGER 環境変数を参照して動作するようプログラムを修正するのが困難な場合は、 /usr/bin/sensible-editor/usr/bin/sensible-pager をエディタ及びページャのプログラムとして使うように設定してもかまいません。 これらは sensible-utils パッケージで提供されるスクリプトで、自動的に 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 (または、cgi-bin-name の前にサブディレクトリ名がついたものに) 設定するべきです。

HTML 文書へのアクセス

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

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

画像へのアクセス

パッケージで使用する画像は、 /usr/share/images/package に格納し、 /images/ のエイリアスを用いて http://localhost/images/<package>/<filename> として参照できるようにすることを推奨します。

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

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

httpd や httpd-cgi を提供すること

ウェブサーバは、仮想パッケージ httpd を提供すべきです。ウェブサーバが CGI をサポートしている場合、 さらに仮想パッケージ httpd-cgi を提供すべきです。

CGI スクリプトを含まないウェブアプリケーションは、httpd に依存すべきです。また、CGI スクリプトを 実際に 含むウェブアプリケーションは、 httpd-cgi に依存すべきです。

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

電子メールを扱う 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 を使うのが上記を実現するお勧めのやり方です。

メールボックスは、通常は user 所有でモード 600 か、user:mail 所有でモード 660 のいずれかとします メールスプールに関しては、昔から使われている二つのパーミッション手法があります。 一つは宛先ユーザ権限で動かすプロセスですべてのメール配送を行い、モード 600 を使うもの、もう一つは mail グループのシステムユーザがメール配送を行い、モード 660 で所有権を mail とするものです。歴史的には、Debian では後者の手法を使うためモード 660 のメールスプールを要求していました。 しかしながら、この方法は時とともに一般的ではないものとなり、また最小特権の原理に基づいても最初のモデルでメールシステムがモード 600 を使う方法の方が望ましいものです。 配送プログラムさえ許すなら、配送エージェントを宛先ユーザ権限で動かす方がメールシステムのセキュリティを保つのが容易です。 このため Debian Policy では両方の手法を許しています。 。 ローカルのシステム管理者は、これと異なったパーミッション手法をとることができます。 このため、パッケージは特定の要求 (例えば新規にメールボックスを作成するなど) がない限り、メールボックスのパーミッションと所有者について仮定を置くべきではありません。 MUA は必要に応じてメールボックスを削除してもかまいません (特殊なパーミッションになっていない場合)。 その場合には MTA や ほかの MUA は必要に応じてメールボックスを再作成しなければなりません。

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

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

メールボックスに転送先のアドレスを書く仕組みはサポートされていません。 代わりに .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 サーバを提供するパッケージ、言い換えると直接または間接に実際の入力機器と表示ハードウェアを操作するパッケージは Provides コントロールフィールド中に仮想パッケージ xserverを提供することを

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

宣言すべきです。

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

以下で記載する条件を満たすターミナルエミュレータを提供するパッケージは、Provides コントロールフィールド中に仮想パッケージ x-terminal-emulator を提供することを宣言すべきです。 また、このようなパッケージはまた自分自身をプライオリティ 20 で /usr/bin/x-terminal-emulator の代替とするよう宣言するべきです。代替パッケージでは、 /usr/share/man/man1/x-terminal-emulator.1.gz が対象マニュアルページを指すよう、副代替指定 (slave alternative) を行うべきです。

x-terminal-emulator であるためには、プログラムは次の条件を満たさなければいけません DEC VT100 ターミナル、またはそれに互換なターミナルをエミュレートできること。 コマンド行オプション -e command によって、新しいターミナルウィンドウを作成でき

新しいターミナルウィンドウは、ウィンドウマネージャを親とする新しいトップレベルの X 上のウィンドウである必要はありません。 プログラムがそういう風にコーディングされているなら、複数文書インターフェース (MDI) での新しい "ビュー" であってもかまいません。 、その上で指定のコマンドを、xterm と同様にコマンドラインの残りの部分を exec に渡すことで解釈実行させることができること。 コマンド行オプション -T title で、ウィンドウタイトルに title を使った新しいターミナルウィンドウを作成できること。

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

ウィンドウマネージャを提供するパッケージは、Provides コントロールフィールド中に仮想パッケージ x-window-manager を提供することを宣言すべきです。 このようなパッケージはまた自分自身を次に説明するプライオリティで /usr/bin/x-window-manager の代替とするよう宣言するべきです。 まずプライオリティ 20 から始めます ウィンドウマネージャが Debian メニューシステムをサポートしてしており、 パッケージの標準設定でこのサポートが使えるようになっている (システムやユーザの持つ設定ファイルで、この機能を有効化する必要がない) 場合、20を足してください。 設定ファイルを変更しなければならない場合、10 だけを足してください。 もしウィンドウマネージャが の基準を満たしている場合、40 を足してください。 もしウィンドウマネージャが標準設定下で 別の ウィンドウマネージャを使って X セッションを再起動可能 (X サーバを再起動せずに) なら 10 を足してください。 それができないなら何も足しません。 代替パッケージでは、 /usr/share/man/man1/x-window-manager.1.gz が対象マニュアルページを指すよう、副代替指定 (slave alternative) を行うべきです。

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

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

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

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

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

BDF フォントは xutils パッケージ収録の bdftopcf ユーティリティを使って PCF フォントに変換し、gzip で圧縮し、解像度に応じたディレクトリに置かなければいけません。 100 dpi のフォントは /usr/share/fonts/X11/100dpi/ に置かなければいけません。 75 dpi のフォントは /usr/share/fonts/X11/75dpi/ に置かなければいけません。 絵文字フォント、カーソルフォントやそのほかの低解像度のフォントは /usr/share/fonts/X11/misc/ に置かなければいけません。 Type 1 フォントは /usr/share/fonts/X11/Type1/ に置かなければいけません。 もしメトリックファイルが提供されているなら、それも同じディレクトリに置かなければいけません。 上記で並べられた以外の /usr/share/fonts/X11/ 以下のサブディレクトリを作成したり使ったりしてはいけません。 PEXCIDSpeedocyrillic ディレクトリは歴史的経緯で例外扱いされていますが、これらディレクトリ中にファイルをインストールすることはやはり避けたほうがいいでしょう。 フォントパッケージは上記の 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/share/fonts/X11/ 以下のサブディレクトリ名 (つまり、75dpimisc など) で、package はそのフォントを収録したパッケージの名前です。 また、extension はファイルの内容に従い scalealias のどちらかになります。 フォントパッケージは xfonts-utils への依存関係を Depends または Pre-Depends コントロールフィールドに宣言しなければいけません。 一つまたは複数の fonts.scale ファイルを収録するフォントパッケージでは、フォントをインストールした各ディレクトリで、 update-fonts-dir実行する前update-fonts-scale を当該ディレクトリに対して 実行しなければいけません。 この実行の起動は 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 であるとの属性を設定するか、設定ファイルとして扱わなければいけません。

X リソースを使ったプログラムの設定も /etc/X11/Xresources/ に置くパッケージと同じ名前のファイルを用意することで

この機構は app-defaults とは同じではないことに注意してください。 app-defaults はローカルファイルシステムのクライアントバイナリと結びついていますが、 X リソースは X サーバに格納され、すべての接続されるクライアントに適用されます。

サポートされています。このファイルは、conffile であるとの属性を設定するか、設定ファイルとして扱わなければいけません。

インストール対象ディレクトリに関する事項

歴史的には、X ウィンドウシステムを用いるパッケージは他のパッケージと独立したインストールディレクトリ群を用いていました。 このような運用は打ち切られ、X ウィンドウシステムを用いるパッケージは、一般的には他のパッケージと同じディレクトリにインストールされるようになっています。 特に、パッケージは /usr/X11R6/ 以下にファイルをインストールするよう設定してはいけません。 /usr/X11R6/ ディレクトリ階層は、 廃止になったと見なしてください。

以前 /usr/X11R6/include/X11/ にヘッダファイルをインストールしていたパッケージは、 /usr/include/X11/ にインストールを行うよう変更すべきです。以前 /usr/X11R6/lib/X11/ 以下のサブディレクトリにインストールを行っていた場合には、パッケージメンテナは /usr/lib//usr/share/ の何れかのサブディレクトリにインストールすることができるかを判断してください。 いずれも不適当な場合は、/usr/lib/X11/ 以下のサブディレクトリを使うべきです。

ウィンドウ、ディスプレイ、セッションマネージャや、それ以外でも X ウィンドウシステムに密接に統合されたアプリケーションについては、 /etc/X11/ 以下、対応するパッケージ名に合わせたサブディレクトリを利用することができます。 他の X ウィンドウシステムアプリケーションでは、ポリシィ制限 (例えば ) などで必須となる場合を除いては、 /etc/ ディレクトリを用いてください。

Perl プログラムとモジュール群

Perl プログラムとモジュールは、現在の Perl ポリシーに従うべきです。

この Perl ポリシーは debian-policy パッケージに perl-policy ファイルとして同梱されています。また、 Debian ウェブミラーサイト にもあります。

Emacs lisp プログラム

emacs lisp プログラムをパッケージングする際には『Debian Emacs Policy』を参照ください。

この Emacs Policy は emacsen-common パッケージに debian-emacs-policy.gz という名で収録されています。 また、Debian ウェブミラーサイトの にも置かれています。

ゲーム

/var/games のパーミッションはモード 755、所有者 root、グループ root です。

各ゲームは個々にセキュリティ方針を決めてかまいません。

ハイスコアファイル、保存ファイルなどの保護され、アクセスに特権 が必要なファイルを持つゲームは、オーナ・グループを root:games にして 2755 で set-gid しておき、ファイルとディレクトリには適当なパーミッション (例えば、770 root:games) を与えてもかまいません。 set-user-id はセキュリティ上の問題が起きるのでしてはいけません (アタックする人は set-user-id されたゲームを破ることができたら、そのファイルを他の実行ファイルで上書きし、ほかのプレイヤーがトロイの木馬を実行してしまうことになります。 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 形式のマニュアルをインストールしてはいけません。

各プログラム、ユーティリティ、機能はそれに関連するマニュアルページを同じパッケージに含めるべきです。 すべての設定ファイルもそれに関連するマニュアルページを含めることを推奨します。 プロトコルや、その他付随的なことがらに関するマニュアルページはオプション扱いです。

マニュアルページが存在していない場合はバグと見なし、Debian バグトラッキングシステムにバグとして報告すべきです (自分で報告しておく、という処理でもかまいません)。 適切なマニュアルが収録されるまではバグ報告を閉じないでください。

マニュアルページを書くことはそんなに難しくありません。 や、 を見たり、dh_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 ページの別名を man ページのヘッダだけの情報から見つけることを

これを man でサポートすることは man ページを検索して、存在していないという答えを返すのに不当なまでの時間を要する結果にしばしばつながりますし、 ファイルシステムに残した方がいい情報を man のデータベースに持ち上げることでもあります。 このため、このサポートは非推奨にして、将来削除します。

期待するべきではありません。

/usr/share/man 以下のロカール依存のサブティレクトリに置かれるマニュアルページは、 UTF-8 か、その言語で通常利用されるレガシーエンコーディング (通常、 /usr/share/i18n/SUPPORTED にその言語関連の最短のロカール名が記載されているもの) を使用することができます。 例えば、/usr/share/man/fr のページは、UTF-8 と ISO-8859-1 のいずれかを使用することができます man は自動的に UTF-8 が使われているかどうかを判定します。 将来は、すべてのマニュアルページの UTF-8 の使用が必須になります。

国名 (de_DEDE) は、言語に対して大きな違いを示す場合でなければ、サブディレクトリ名に使用してはいけません。 これは、他の国のその言語を利用者を除外することになるからです これを書いた時点では、中国語とポルトガル語がそのような差違のある主な言語です。 従って、pt_BRzh_CNzh_TW がすべて許されています。

マニュアルページのローカライズされた版を提供する場合、最新版であるか、読み手にとってそれが古いものであるため原語のマニュアルページを使った方が良いことが明確になっていなければいけません。 これは、マニュアルページの最初に注記を入れるか、現マニュアルと対象言語との抜けや変更部分を示すことによって達成可能です。

Info 形式の文書

info 形式の文書は /usr/share/info へインストールしてください。 また gzip -9 で圧縮しておくべきです。

install-info プログラムが info の読み手のため /usr/share/info/dir にインストールされた info ドキュメントの管理を行います 以前は各パッケージでメンテナスクリプトから install-info を実行して文書をインストールする必要がありました。 この処理はもう必要ありません。インストールシステムでは、dpkg をトリガーとするようになっています。 。このファイルはパッケージに含めてはいけません。info 文書を含むパッケージは dpkg (>= 1.15.4) | install-info に依存関係を宣言し、ディレクトリファイルが確実に Debian 5.0 (lenny) およびそれ以前のリリースからの部分アップグレードで再ビルドされるようにすべきです。

info 文書は、install-info で利用できるよう、文書中にセクションとディレクトリエントリ情報を含むようにすべきです。 セクションは INFO-DIR-SECTION で始まり、空白を置いて該当文書ページのセクションを指定した行で指定すべきです。 ひとつあるいは複数のディレクトリエントリは START-INFO-DIR-ENTRYEND-INFO-DIR-ENTRY 行の間で記載すべきです。 例を以下に示します。 INFO-DIR-SECTION Individual utilities START-INFO-DIR-ENTRY * example: (example). An example info directory entry. END-INFO-DIR-ENTRY どのセクションを使うべきかについては、自分のシステムの /usr/share/info/dir を調べて最も関係の深そうなものを (現状に適切なものがない場合には、新規に作成して) 選択してください 通常は、info 文書は Texinfo ソースから作成されます。 これらの情報を作成された info 文書に上手く含められない場合、以下のように文書の Texinfo ソースに以下のコマンドを足して、パッケージビルド時にソースから info 文書がリビルドされるようにしてください。 @dircategory Individual utilities @direntry * example: (example). An example info directory entry. @end direntry

追加文書

パッケージに付属しているそれ以外の文書はパッケージメンテナの裁量でインストールするかどうかを決めて下さい。 プレーンテキスト形式の文書は /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 が指定されているときのみ許されています

この規定は以下に記載した changelog ファイルの節の規定に優先するものではありません。つまり、 /usr/share/doc/package/changelog.Debian.gz ファイルは、対象となる package (パッケージ) の現在のバージョンの changelog を指していなければなりません。 実際には、この場合は上記の場合の後者の元ファイルと、シンボリックリンクの指す先は同じ (同じソースパッケージとバージョンのため) になるでしょう。

以前の Debian リリースでは添付文書類は /usr/doc/package ディレクトリに収録されていました。これは、現在は、 /usr/share/doc/package に変更になっており、パッケージはディレクトリ /usr/doc/package に文書を置いてはいけません

移行の現在の時点では、/usr/doc/ へのシンボリックリンクはもはや必要としていません。 将来は、シンボリックリンクの作成はバグとなるようポリシーが変更されるでしょう。

好ましい文書形式

Debian プロジェクトでは 文書の形式の統一化は HTML により行なわれています。

パッケージに各種書式に変換可能なマークアップ形式の詳細文書が付属している場合は、バイナリパッケージには可能なかぎり HTML 形式のものを

原則の解説:ここで重要なことは、HTML 形式の文書が一連のパッケージの いずれかに パッケージに収録されているようにすべきだということです。 主バイナリパッケージ自体に収録されている必要はありません。

/usr/share/doc/appropriate-package、 およびそのサブディレクトリにインストールしてください。

PostScript のような他の形式はパッケージメンテナの裁量で提供してください。

著作権関連情報

各パッケージには、著作権情報と配布条件のライセンス文書が元のままの形式で /usr/share/doc/package/copyright に収録されていなければいけません。 このファイルは圧縮されていたり、シンボリックリンクであったりしてはいけません

訳注:本節後半の GPL ほかの項参照

また、著作権情報ファイル中には元となった上流のソースをどこから手に入れたかを記載しなければなりません。 またパッケージの原作者の名前を載せるべきです。

contrib または non-free アーカイブエリアのパッケージは、著作権情報ファイルにこのパッケージが Debian の一部ではないこと、およびその簡潔な理由を示すべきです。

/usr/share/doc/package/copyright にインストールされるファイルのコピーは debian/copyright に収録しておくべきです。

/usr/share/doc/package は、/usr/share/doc 以下の他のディレクトリ中のシンボリックリンクの相手先と同じソースファイルから作成されたものであること、および相手先に対して "Depends" で依存していることが宣言されていること、の二つの条件を満たすときのみ、シンボリックリンクとすることができます。 この規則は、copyright(著作権関連ファイル) が機械的に抽出できるようにするために大切になるものです。

パッケージが Apache ライセンス (version 2)、 Artistic License、the GNU GPL (version 1、2 または 3), GNU LGPL (versions 2, 2.1, または 3) または the GNU FDL (version 1.2 または 1.3) に基づいて配布されている場合には、copyright ファイルで引用するのではなく、/usr/share/common-licenses 以下の各ファイル

具体的には /usr/share/common-licenses/BSD, /usr/share/common-licenses/Apache-2.0, /usr/share/common-licenses/Artistic, /usr/share/common-licenses/GPL-1, /usr/share/common-licenses/GPL-2, /usr/share/common-licenses/GPL-3, /usr/share/common-licenses/LGPL-2, /usr/share/common-licenses/LGPL-2.1, /usr/share/common-licenses/LGPL-3, /usr/share/common-licenses/GFDL-1.2 および /usr/share/common-licenses/GFDL-1.3 です。

を参照するようにしてください。カリフォルニア大 BSD ライセンスも、 base-files/usr/share/common-licenses/BSD として収録されていますが、ライセンスが簡潔なこと、明示的に著作権を Regents of the University of California としていること、そして細かい用語の変更の頻度が高いことから、このファイルを参照するのではなく著作権情報ファイルに本文を含めるようにしてください。

copyright ファイルを一般的な README として使うべきではありません。 パッケージがそのような README ファイルとして書くべき内容を持っている場合は /usr/share/doc/package/README、 あるいは README.Debian やその他の適切な場所にインストールされるべきです。

機械可読な著作権情報

debian/copyright の、標準の機械可読な形式の仕様は debian-policy の一部として維持管理されています。 仕様書は debian-policy に収録されている copyright-format です。また、以下の Debian ウェブミラーからも取得できます。

このフォーマットの利用は任意です。

設定例など

設定ファイルやソースファイルなどの例は /usr/share/doc/package/examples ディレクトリにインストールしてください。 これらのファイルをプログラムから参照してはいけません。 これらはシステム管理者やユーザの便宜のため、説明用として置かれている文書です。 アーキテクチャ固有の設定ファイル類は /usr/lib/package/examples にインストールし、 /usr/share/doc/package/examples から各ファイルにシンボリックリンクを張ってください。または、 /usr/share/doc/package/examples/usr/lib/package/examples ディレクトリへのシンボリックリンクであってもかまいません。

パッケージの目的が例を提供することである場合、その例を /usr/share/doc/package へインストールしてもかまいません。

Changelog ファイル

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 を対象として作られているものではありますが、他のシステムでの動作や移植は可能です。

です。

このバイナリパッケージは、インストール済の実行可能なプログラム (通常はコンパイル済のバイナリ) と関連データの管理用に設計されています。 ソースコードの例やドキュメントを含むものもあります。

このマニュアルには、Debian のバイナリパッケージ (.deb ファイル) を作成する上での技術的側面が記述されています。 dpkgdselect 等のパッケージ管理プログラムの動作と、それらがどのようにパッケージを取り扱うかについて記述されています。

このマニュアルは、dselect のコア部分とアクセスメソッドスクリプトの間のやり取り、新しいアクセスメソッドの作成方法についても言及します。 アクセスメソッドスクリプトは、選択したパッケージの実際のインストールを担当します。

このマニュアルでは、パッケージ作成ツールやインストールツールのオプションや使い方についての詳しい説明は行ないません。 それらのプログラムの man ページと一緒に読んで下さい。

dpkg と一緒に提供される update-rc.dinstall-info といった様々なシステム設定を行なうユーティリティプログラムについての詳細もここでは触れません。 これらについても、それぞれの man ページを見て下さい。

このマニュアルは dpkg System Administrators' manual をよく理解している人を対象に書かれています。 しかし、残念ながらそのマニュアルはまだありません。

Debian パッケージを作ってみたい人のために、FSF の GNU hello プログラムの Debian 版が例として提供されています。 これらのツールや例は有用ではありますが、読んで従うべき文書としての Policy Manual や Programmer's Manual の代わりにはなるわけではありません。

バイナリパッケージ (旧 Packaging Manual より)

バイナリパッケージは大きく分けて2つの部分からなります。 最初の部分には dpkg がインストールや削除に使う様々な制御情報ファイルやスクリプトが入っています。 を見てください。

二つめの部分はインストールされるファイルやディレクトリを含んだアーカイブです。

将来、他にもチェックサムや電子署名などがバイナリパッケージに含まれるようになるでしょう。 アーカイブのフォーマットについてはマニュアル deb(5) の man ページに完全な記述があります。

パッケージファイルの作成 - 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 を同じオプションで起動します)。

新しく作られたファイルの中身を調べる方法についての詳細は man ページの を見てください。 次のコマンドの出力から役に立つ情報が得られることがわかるでしょう。 dpkg-deb --info filename.deb dpkg-deb --contents filename.deb dpkg --contents filename.deb パッケージの copyright 関連のファイルを見るには、以下のコマンドを使います。 dpkg --fsys-tarfile filename.deb | tar xOf - --wildcards \*/copyright | pager

パッケージ制御情報ファイル

バイナリパッケージの制御情報部は dpkg が知っている名前を持ったファイルの集合です。 dpkg はこれらのファイルの内容を特別に扱います。 この中の一部の内容はパッケージのインストールや削除の時に dpkg に使われるものであったり、 パッケージ管理者が dpkg に実行させたいスクリプトであったりします。

パッケージ制御情報ファイルエリアにそれ以外のファイルを入れることはできますが、あまりいい考えではありません (もっとも、それらは通常無視されますが)。

ここで、dpkg がサポートする制御情報ファイルの簡単なリストと、それらが何に使われるかについての概要を挙げておきます。

control

このファイルには dpkg が使う鍵となる情報が書かれています。 このファイルによりパッケージ名とバージョンの指定や、パッケージに関する説明のユーザへの提供、 他のパッケージとの関連の指定などを行ないます。 See を見て下さい。

このファイルは通常 dpkg-shlibdeps を補助として使い dpkg-gencontrol がソースパッケージ内の情報から自動的に作ります。 を見て下さい。

postinst, preinst, postrm, prerm

これらは dpkg が、パッケージのインストール、アップグレード、削除の時に起動する実行可能なファイル (通常はスクリプト) です。 これらのファイルにより、パッケージがパッケージに特有の事柄を扱ったり、dpkg が提供するよりもより複雑な処理をさせることが可能になります。 これらのファイルが、いつ、どの様に呼び出されるかについての詳細は を見て下さい。

これらのスクリプトに「常に同じ効き目」を持たせておくことは非常に重要です。 を参照ください。

管理スクリプトは制御端末で実行されることが保証されておらず、ユーザと対話することができないかもしれません。 を参照ください。

conffiles

このファイルには dpkg により自動的に扱われなければならない設定ファイルのリストが含まれます ( を参照)。 すべての設定ファイルをここに書く必要はないことに注意して下さい。

shlibs

このファイルにはパッケージが提供する共有ライブラリのリストが、それぞれの依存関係の詳細と共に含まれます。 このファイルは dpkg-shlibdeps がパッケージコントロールファイルで、どの依存関係が必要かを決める時に使用します。 shlibs ファイルの書式については に記述があります。

メイン制御情報ファイル: control

dpkg がパッケージをインストールする時に使うもっとも重要な制御情報ファイルが この control です。 このファイルはパッケージの「人口動態統計」をすべて 含んでいます。

Debian ソースから作られたパッケージのバイナリパッケージ control ファイルは dpkg-gencontrol という特別なツールで作られます。このツールは debian/controldebian/changelog から必要な情報を捜し出します。詳細は を見て下さい。

バイナリパッケージコントロールファイルのフィールドは に列挙されています。

コントロールファイルの文法とこれらのフィールドの目的についての記述は で得られます。

タイムスタンプ

を参照ください。

ソースパッケージ (旧 Packaging Manual より)

Debian バイナリパッケージは Debian ソースから生成されます。 Debian ソースはバイナリパッケージを簡単に、かつ自動的に構築しやすいように特殊な形式になっています。

ソースパッケージを処理するためのツール

ソースパッケージを扱うために様々なツールが提供されています。 これらはソースをパックやアンパックしたり、バイナリパッケージの構築や新しいバージョンのディストリビューションを扱うのを手助けしたりします。

ここではこれらのツールの紹介と典型的な用途を説明します。 引数や動作についての完全な文書は を見て下さい。

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 を呼びだし、最後に gpg (または pgp) を呼んで署名済のソースパッケージおよびバイナリパッケージを作成しアップロードします。

このコマンドは、通常、すでに構築されている、あるいは未構築のソースディレクトリのトップレベルで手動で実行します。 引数なしで呼び出してもかまいません。よく使う引数は次の通りです。 -uc, -us

それぞれ、.changes ファイル、ソースパッケージの .dsc ファイルにサインをしないという指示です。

-psign-command

sign-commandPATH で見つかる gpg または pgp の代わりに呼び出します。 sign-commandgpg または pgp と全く同じ動作をしなくてはなりません。

-rroot-command

root 特権が必要な時、root-command というコマンドを呼び出します。root-command は第 1 引数をコマンドとして、必要ならば PATH から呼び出し、第 2 引数以降を呼び出したコマンドに渡さなければいけません。 root-command が与えられなかった場合は、 dpkg-buildpackagefakeroot コマンドを使用します。これは、実際に 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 から呼ばれます。

このプログラムの引数は、バイナリパッケージのコントロールファイルに共有ライブラリの依存関係を含める必要のある実行形式および共有ライブラリ

引数となる実行可能ファイルには、それらの作られるソースツリーのある場所や、バイナリパッケージが作られる前に仮インストールされる構築ツリーのある場所を指定することもできます。

です。

検索された共有ライブラリが RecommendsSuggests のみを保証すべき場合や、Pre-Depends を保証すべき場合は、 それらの実行形式の前に -ddependency-field オプションをつけてこれを指示しなければなりません (各 -d オプションは次の -d が現れるまで有効です)。

dpkg-shlibdeps は出力されるコントロールファイルを直接修正することはしません。 代わりに、デフォルトでは shlibs:Depends の様な変数の設定を debian/substvars というファイルに加えます。 ソースコントロールファイルにはバイナリパッケージ毎にセクションがありますが、 これらの変数の設定は適切なセクションの依存関係フィールドから参照しなければなりません。

例えば、依存関係を必要 (depend) とする主要部と、依存関係として "Recommendation" のみを必要とするオプション部を生成するパッケージでは、これらの二種類の依存関係を二つの異なったフィールドとして分離します

これを書いている時点で、このような例としては 。この場合、debian/rules では以下のように書きます。 dpkg-shlibdeps -dDepends プログラム 他のプログラム ... \ -dRecommends オプション部 他のオプション部 そしてメインコントロールファイル debian/control で次のように書きます。 ... Depends: ${shlibs: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/rules - メイン構築スクリプト

を参照ください。

debian/control

を参照ください。

debian/substvars と変数の置換

を参照ください。

debian/files

を参照ください。

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 このファイルは一連のフィールドを含んでいて、各フィールドはバイナリパッケージのコントロールファイルと同様に識別され分離されています。 を参照ください。 もとのソースアーカイブ package_upstream-version.orig.tar.gz

このファイルは、プログラムの上流の作者からのソースコードを含む tar (gzip -9 されている) です。

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 パッケージに必要なものか、省略した場合に問題を引き起こすようなものである場合があります。

フィールドのリスト

を参照ください。

このセクションでは、ポリシーマニュアルに収録されていないフィールドについてのみ説明しています。

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 をもう一度呼び出します)。

詳細は の man ページをごらん下さい。

update-alternatives ではうまくいかないような場合には、パッケージの退避バージョンの使用を考慮してみるとよいでしょう。

退避バージョン - あるパッケージに含まれるファイルを上書きするには (旧 Packaging Manual より)

パッケージを再インストールする時、その中のあるファイルを dpkg によって上書きさせないようにして、そのファイルをどこか他の場所に置くことができます。

この方法は、あるパッケージに含まれるファイルをローカルに入れ替える場合や、あるパッケージが別のパッケージに含まれるファイルを置きかえる (または、そのプログラムのラッパーを 提供する) 場合に利用できます。

退避バージョン (diversion) の使用を決定する前に、 を読んでください。 本当に、あるプログラムに対して複数の代替バージョンを提供するよりも、退避バージョンを使用する方が適切であること確認してください。

退避操作専用のプログラムである dpkg-divert は、退避されたファイルの一覧を更新します。また、dpkg はこの一覧を使用します。この操作に関する詳細は、 をご覧ください。

あるパッケージが、別のパッケージに含まれるあるファイルを退避したい場合、 preinst スクリプト中から、dpkg-divert を呼ばなければいけません。 dpkg-divert は、退避ファイル一覧にエントリを追加し、既存のファイルの名前を変更します。 例えば、smailwrapper というパッケージが、 /usr/sbin/smail を包含するラッパーをインストールしようとしている場合を考えます。 dpkg-divert --package smailwrapper --add --rename \ --divert /usr/sbin/smail.real /usr/sbin/smail オプション --package smailwrapper は、smailwrapper に含まれる /usr/sbin/smail が、退避バージョンではなく本来のバージョンとしてそのままインストールされることを保証します。 アップグレード時に退避バージョンを無条件に指定することは問題ありません。 これは、もし既に存在していた場合には変更は行われず、dpkg-divert がメッセージを表示するだけとなるためです。このメッセージを抑止する場合には、 コマンドをアップグレードしようとするバージョンを条件とするものとしてください。 if [ upgrade != "$1" ] || dpkg --compare-versions "$2" lt 1.0-2; then dpkg-divert --package smailwrapper --add --rename \ --divert /usr/sbin/smail.real /usr/sbin/smail fi 以上の例では、1.0-2 が、最初にパッケージに退避バージョンが追加されたバージョンです。 abort-upgrade 時にこのコマンドを実行することに意味はありませんが、害もありません。

postrm の場合はちょうどこの逆を行ないます。 if [ remove = "$1" -o abort-install = "$1" -o disappear = "$1" ]; then dpkg-divert --package smailwrapper --remove --rename \ --divert /usr/sbin/smail.real /usr/sbin/smail fi 特定のバージョン以降で退避バージョンが導入されている場合、postrm はそれ以前のバージョンからのアップグレード失敗の場合を扱えなければいけません (旧バージョンがあまりにも古く、直接のアップグレードがすでにサポートされていない場合は除きます)。 以下に例を示します。 if [ abort-upgrade = "$1" ] && dpkg --compare-versions "$2" lt 1.0-2; then dpkg-divert --package smailwrapper --remove --rename \ --divert /usr/sbin/smail.real /usr/sbin/smail fi ここでは、1.0-2 が退避バージョンの追加がおこなわれたバージョンです。 アップグレードの際の postrm ではいずれの退避バージョンも削除してはいけません。 これは、直後に再度追加するために退避バージョンを削除する理由がないこと、および古いパッケージの postrm が展開後に走った場合、退避バージョンの削除は失敗するためです。

システムの運用に必須となるファイルに、退避バージョンを用いようとはしないで下さい。 dpkg-divert の使用時には、ファイルの退避が行われた後に dpkg が新しいバージョンをインストールするまでの間、そのファイルが存在しないタイミングがあるのです。