%versiondata; ]> Debian ポリシーマニュアル Ian Jackson ijackson@gnu.ai.mit.edu Christian Schwarz schwarz@debian.org 改訂: David A. Morris bweaver@debian.org Debian ポリシーメーリングリスト debian-policy@lists.debian.org 翻訳 Debian-doc-jp メーリングリスト (八田、森本、かねこ、早瀬、芳尾) debian-doc@debian.or.jp バージョン &version;, &date; このマニュアルでは、Debian GNU/Linux ディストリビューションのポリシー (方針)、すなわち Debian に要求されるいくつかの必要条件について説明します。 このポリシーには、Debian アーカイブの構成と内容、オペレーティングシステムとしての Debian の設計に関するいくつかの事項に加えて、それぞれのパッケージがディストリビューションに受け入れられるために満たさなければならない技術的な必要条件も含まれます。 Debian 用の policy パッケージは、ポリシー自体を編集する権限は無い数人のメンテナによって管理されています。 現時点でのメンテナは以下の通り:

Michael Alan Dorman mdorman@debian.org

Philip Hands phil@hands.com

Julian Gilbey J.D.Gilbey@qmw.ac.uk

Manoj Srivastava srivasta@debian.org

Copyright ©1996,1997,1998 Ian Jackson and Christian Schwarz.

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

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

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

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

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

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

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

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

選ばれた取り決め

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

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

このマニュアル中の脚注は単に説明のためのものであり、Debian ポリシーの一部ではないことに注意してください。

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

この分類は大雑把に言って、バグ分類の important (しなければならない必要な 及びその派生語)、 normal (すべきである または 推奨された とその派生語)、wishlist (オプションとして の類)に相当しています

RFC 2119 参照。

この文書は、読者が前掲の二つのマニュアルの内容に精通していることを想定して書かれています。 しかし、残念なことに システム管理者マニュアルはまだ存在していません。

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

この文書の新しい版

この文書の最新版は常に Debian の FTP サーバ ftp.debian.org 上の /debian/doc/manuals/debian-policy.html.tar.gz、 あるいは Debian の WWW サーバ上の Debian ポリシーマニュアル として入手できます。

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

フィードバック

Debian GNU/Linux システムは継続的に進化していますので、 このマニュアルも時と共に変更が加えられています。

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

この日本語訳に関するご意見ご感想は debian-doc メーリングリスト debian-doc@debian.or.jp までお送り下さい。

Debian アーカイブ

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

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

Debian GNU/Linux ディストリビューションmainnon-US/main セクションによって構成されます。

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

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

このポリシーの意図は以下のようなものです。

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

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

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

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

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

Debian の一部分を構成するコンポーネントのライセンスは、いかなる団体に対しても、そのソフトウェアをいくつかの異なる出自を持つプログラムを複数含む集積されたソフトウェアの配布物の一部として、販売ないし無料で配布することを制限してはなりません。

ソースコード

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

派生物作成の許諾

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

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

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

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

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

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

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

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

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

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

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

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

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

ライセンスの例

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

main セクション

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

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

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

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

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

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

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

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

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

contrib セクション

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

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

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

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

non-free および non-US/non-free セクション

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

non-US セクション

暗号に関わるプログラムコードを含むいくつかのプログラムは 「non-us」サーバに置く必要があります。 アメリカ合衆国がそのようなプログラムに対して輸出制限を加えているからです。 そのようなプログラムは non-US/main、non-US/contrib または non-US/non-free から適切に選ばれた non-US セクションから配布しなければいけません。

この制限は、暗号化関連コードを含むパッケージのみに適用されます。 暗号化プログラム用のインターフェースを持つ含むパッケージ、 あるいは暗号に関わるライブラリに対して動的にリンクされているプログラムは、それが暗号ライブラリやプログラム無しで実行できるものであるならば、 non-us サーバではなく、通常のサーバから配布すべきです。

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

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

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

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

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

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

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

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

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

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

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

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

サブセクション

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

それぞれのパッケージのセクションはパッケージの 制御情報 (control record) で指定すべきです。但し、 Debian ディストリビューションとしての一貫性を保証するため Debian アーカイブの管理者がこの選択を上書きすることがあるかもしれません。

どういったセクションが利用可能なのかを知るためには、その時点での Debian ディストリビューションをチェックしてください。

プライオリティ

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

Debian パッケージ管理システムの dpkg によってサポートされてい プライオリティ値 を以下に示します。 required

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

important

どんな Unix ライクなシステムに於いても見つかることが期待されるような重要なプログラムはこのプライオリティに属します。 そのプログラムが欠けていることに気づいた時、Unix 経験豊富なユーザが「チキショーメ、foo は一体全体どこだ?」と悪態をつくと思われるような場合には、それは important に含まれるべきです。 私たちは何にもましてまずフリーな Unix を創ろうとしているわけですから、これは重要な基準です。 それ無しではシステムがうまく動作しなかったり、 あるいは使い物にならないといった種類のパッケージもここに含められるべきです。 このカテゴリには Emacs、X ウィンドウシステム、TeX といった大規模なアプリケーションは 含まれませんimportant なパッケージには一般に存在が期待される、または必要といえるような、かつその最小の集合と考えられるツール類のみが含まれています。

standard

これらのパッケージはほどよく小規模ながらもあまり制限のきつくない、キャラクタベースのシステムを提供します。 このパッケージ群がユーザが何も他に選択しなかった場合、デフォルトでインストールされます。大規模なアプリケーションの多くは含まれませんが、Emacs (これは単なるアプリケーションという以上にインフラストラクチャーの一部なので) と十分実用的な TeX および LaTeX のサブセット (もしこれが X 無しで可能なら) が含まれます。

optional

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

extra

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

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

バイナリパッケージ

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

パッケージ名

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

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

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

パッケージのメンテナ

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

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

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

パッケージの説明

全ての Debian パッケージには、制御情報内の適切なフィールドに詳細な説明文が記入されていなければなりません。

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

依存関係

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

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

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

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

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

仮想パッケージ

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

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

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

Base パッケージ

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

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

debian-devel メーリングリストで議論して同意が得られる前に、 パッケージを base セクションに収めてはいけません。

Essential パッケージ

いくつかのパッケージには essential 指定が付加されています (それらパッケージの制御情報で Essential: yes という指定がされている)。 このフラグはシステムにとって 不可欠な パッケージに用いられます。

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

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

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

メンテナスクリプト

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

インストールスクリプトの実行中に起こったエラーはチェックすべきですし、インストールはエラーの後実行を続けるべきではありません。

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

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

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

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

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

2.5 % の Debian パッケージがインストール時に debconf を使っています []。 またその数は毎日増加しています。debconf を使う利点は ; に説明されていますが、殆どの初期設定を含むこと、非対話的インストールが可能なこと、 不必要なプロンプトを避けられること、一貫したユーザインターフェースを実現できることなどがあげられましょう。

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

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

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

使う必要があります。

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

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

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

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

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

ソースパッケージの Standards-Version フィールドに、 あなたのパッケージが準拠したパッケージング基準の最新バージョンを指定しておくべきです。

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

この値は、タイトルページ、あるいはページのヘッダまたはフッタ (フォーマットによる) で見つかる Debian マニュアルのバージョンと対応しています。

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

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

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

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

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

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

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

Rationale:

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

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

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

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

ビルド時依存のパッケージを指定する場合、目的のパッケージをビルドするのに直接必要であるもののみをリストアップするべきです。 ビルド時依存として挙げたパッケージが依存しているという理由でパッケージを列挙する必要はありません。 これは、もしそれらの依存関係が変化した場合であっても、あなたは 自分 が必要なものだけを列挙すれば済むからです。他のパッケージはその人達の責任です。

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

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

ソースコードへの変更が一般的に有効なものであるなら、アップストリームの作者にその人達が望む形でそれを含めることができるようその変更を送るべきです。

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

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

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

あなたの行った変更を記述する

あなたがソースパッケージに加えた変更や更新は、 debian/changelog ファイルに適切に記述しておくべきです。 (この記載が不十分であるというミスは、元々の changelog エントリを編集して履歴を再作成して修正することもできますが、たいていの場合は新しい changelog エントリを作成することにするほうがよりよい方法です。)

experimental ではないパッケージにおいては、 debian/changelog の書式としては、最新リリースの dpkg がサポートしているものだけを使わなければなりません。 自分の使っている書式がサポートされていなくても、それが一般的に支持されている形式であるならば、 dpkg のメンテナに連絡をとり、その書式に対応するパーサを dpkg パッケージに含めてもらうようにして下さい。 (そのパーサとマニュアルページは、 dpkg の一部として GNU GPL で配付することを認める必要があります)。

makefile でのエラーを捕捉する

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

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

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

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

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

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

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

制御ファイルの書式

ファイルは、ひとつ以上のフィールドのパラグラフで構成されます。 パラグラフは、空白行によって分けられます。 いくつかの制御ファイルは、1つのパラグラフのみを許します。 また別の場合には複数個を許しますが、その場合にそれぞれのパラグラフが異なるパッケージを参照することがしばしばあります。

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

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

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

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

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

重要な点として、フィールド中には dpkg およびに関連のツールに関する限りオプション扱いであるのにも関わらず、すべての Debian パッケージになければならず、かつ省略した場合問題が発生するものがいくつか存在することに注意してください。 Debian パッケージのための制御ファイルを書くときには Debian ポリシーマニュアルで以下に記載された各特定のファイルのフィールドのリストの詳細を 熟読 しなければいけません。

フィールドのリスト

以下のリストは網羅的なものではありません。殆どのフィールドは この文書の他の部分か、パッケージングマニュアルで扱われています。

Package

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

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

Version

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

Standards-Version

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

このフィールドのフォーマットはバージョンナンバに準じますが、epoch と Debian レビジョンは使えません。 を参照ください。

Distribution

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

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

unstable

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

frozen

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

experimental

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

各ディストリビューションはいくつかのセクションに分かれます。現時点でのセクションは main

このセクションのパッケージが main Debian ディストリビューションを構成します。ここにはすべてフリー (Debian free software guidelines に従って) で、 このマニュアルに記載された他の基準を満たすソフトウェアが収録されています。

contrib

このディストリビューションのパッケージ群はこのマニュアルに規定されている Debian の main ディストリビューションに収録して配布するための条件を満たしていませんが、Debian フリーソフトウェアガイドラインに規定されたフリーソフトウェアの条件は満たしています。

non-free

non-free のパッケージは Debian フリーソフトウェアガイドラインに規定されたフリーソフトウェアの条件を満たさないものです。 繰り返しますがこのディストリビューションをダウンロードする際には自分なりの判断を行ってください。

このフィールドには、そのパッケージがインストールされる、すべて のディストリビューションを列挙しなければいけません。 特殊な場合を除いては、stable に対するインストールを指定するする場合、同時に (存在すれば) frozenunstable へのインストールも指定すべきです。 同様に、frozen に対するインストールを指定する場合、unstable へのインストールも指定すべきです。 。

ディストリビューションの名前は、パッケージの名前付けの規則に従います (を参照ください)。

Version 番号付け

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

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

バージョン番号のフォーマットは、 &lsqbepoch:]upstream-version[-debian-revision] です。

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

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

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

upstream-version

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

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

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

debian-revision

バージョンのこの部分は、そのパッケージを Debian バイナリパッケージにするためにほどこした修正のバージョンを表わしています。 これは upstream-version と同じ形式であり、同じやり方で比較が行われます。

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

upstream-version が増加するたびに、 debian-revision1 に戻すのが慣習となっています。

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

debian-revision は 英数字と文字及び + . (プラスとピリオド) だけから構成されます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

可能な限り上流のソースファイルファイルの更新時刻をパッケージ中で変更しないでおくことをメンテナに推奨します。 これはオプションですが、良い考え

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

ではありますので。

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

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

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

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

定義が必要なターゲットは次の通りです。 build

パッケージの構築、すなわち全てのパッケージの非対話的な設定とコンパイルを行ないます。 もしパッケージに構築前の設定作業がある場合は、Debian 化されたソースパッケージは設定作業を行なった後で構築すべきです。 これは、設定を再びせずに構築出来るようにするためです。

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

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

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

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

binary, binary-arch, binary-indep

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

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

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

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

binary ターゲットは、ルート権限で起動されなければいけません。

clean

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

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

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

get-orig-source (optional)

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

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

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

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

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

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

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

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

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

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

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

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

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

debian/changelog

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

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

記録します。

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

この書式は以下に示すものがひとつらなりになったものです。 パッケージ名 (バージョン) ディストリビューション; urgency=緊急度 * 変更内容 変更内容の続き * また別の変更内容 -- メンテナ名と電子メールアドレス 日付

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

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

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

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

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

日付 RFC822 フォーマット

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

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

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

changelog の別書式の定義

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

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

debian/substvars と変数置換

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

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

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

debian/files

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

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

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

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

dpkg-gencontrol はこれが作成する制御ファイルを使って、 dpkg-deb によって生成される .deb ファイル用のエントリを追加します。このため、たいていのパッケージが、 このファイルに関してやらなければいけないことは、clean ターゲットによって削除することだけです。

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

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

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

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

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

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

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

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

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

説明文を書く際の留意点

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

これは、一旦実行した結果が成功であっても失敗であっても、 再実行した場合に落ちたりせず、すべてがそうあるべくなるよう保証されていることを意味します。

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

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

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

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

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

new-preinst install

new-preinst install old-version

new-preinst upgrade old-version

old-preinst abort-upgrade new-version

postinst configure most-recently-configured-version

old-postinst abort-upgrade new version

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

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

prerm remove

old-prerm upgrade new-version

new-prerm failed-upgrade old-version

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

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

postrm remove

postrm purge

old-postrm upgrade new-version

new-postrm failed-upgrade old-version

new-postrm abort-install

new-postrm abort-install old-version

new-postrm abort-upgrade old-version

disappearer's-postrm disappear overwriter overwriter-version

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

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

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

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

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

もし、その衝突するパッケージに依存するパッケージがあり、 --auto-deconfigure が指定されているならば、 該当の各パッケージについて、次の呼び出しを行います。 deconfigured's-prerm deconfigure \ in-favour package-being-installed version \ removing conflicting-package version このときのエラー回復は deconfigured's-postinst abort-deconfigure \ in-favour package-being-installed-but-failed version \ removing conflicting-package version です。もし、--install が使われたばあいに再設定可能としておくため、 設定破棄されたパッケージには設定を要求するマークが付けられます。

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

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

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

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

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

あるパッケージが、現在システムにある別のパッケージの ファイルと同名のファイルを含んでいる場合、Replaces ( 参照) が指定されていない場合にはエラーになります。現在のところ --force-overwrite フラグが有効にされており、このエラーは警告に格下げされています。但し、将来にわたってもこうであるわけではありません。

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

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

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

が起こります。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

設定の詳細

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

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

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

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

prerm remove

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

postrm remove

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

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

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

postrm purge

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

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

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

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

この宣言には、制御ファイルの DependsRecommendsSuggestsEnhancesConflictsProvides 及び Replaces フィールドを使用します。

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

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

関係性フィールドの書式

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

パッケージの DependsRecommendsSuggestsPre-DependsBuild-Depends 及び Build-Depends-Indep の各フィールド (他のパッケージに依存関係がある場合に宣言するフィールド) 内に記述するパッケージ名は、代替パッケージ名の一覧でも構いません。 代替パッケージ名は、 垂直バーシンボル | (パイプシンボル) で区切って書きます。

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

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

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

例を以下に示します。 Package: metamail Version: 2.7-3 Depends: libc5 (>= 5.2.18-4), mime-support, csh | tcsh

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

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

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

これらの五つのフィールドはあるパッケージと他のパッケージとの 依存関係を宣言するために使用します。 これらのフィールドは、依存する側のパッケージの制御ファイルの中に記述されます。

Pre-DependsConflicts (これらについては以下で説明します) 以外のすべての宣言は、 パッケージを 設定する時にだけ 有効です。依存関係の宣言は、 依存関係を満たさないパッケージが、未設定な状態でシステム中にインストールされることを妨げません。 すでに依存関係が満たされ、正しくインストールされているパッケージを、 依存関係の満たされていない、または満たせ得ないような別のバージョンのパッケージで置き換えることもできます。 この場合は、未設定のまま (設定しようとするとエラーが返りますので) ですので、当然正しく動作しないでしょう。

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

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

これは、完全に依存するパッケージを宣言します。

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

Recommends

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

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

Suggests

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

Enhances

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

Pre-Depends

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

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

パッケージが設定中の時、Pre-Dependency は依存するパッケージが正常に設定済である場合にのみ満たされていると判断されます。 これは、通常の Depends の場合と同じです。

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

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

代替バイナリパッケージ - ConflictsReplaces

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

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

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

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

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

仮想パッケージ - Provides

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

この仮想パッケージ名は、あるパッケージの制御ファイルの、 Provides フィールドに書かれるものです。 これによって、そのパッケージが所定の仮想パッケージ名が書かれているところすべてにリストされるという扱いになります。

同じ名前の実際のパッケージと仮想パッケージが存在していた場合、依存関係は、そのパッケージによって、満足されたりされなかったりします。例えば、 Package: vm Depends: emacs というパッケージがあった場合、他の xemacs のパッケージが、 Package: xemacs Provides: emacs という宣言をしていた場合、とりあえずすべて正常に動作します (ただし、純粋な仮想パッケージ名が選ばれて、emacsvm がそれを使うように変更されるまでですが)。

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

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

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

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

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

Replaces フィールドでは仮想パッケージ () は考慮されません。 このフィールドに置換されるパッケージを宣言するときは、 実際のパッケージ名を使用してください。

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

まず、以前言及したように、システム中の他のパッケージに含まれているファイルをインストールしようとするパッケージが含んでいると、通常それはエラーです。 しかし、現在のところ、dpkg のオプション --force-overwrite がデフォルトでオンになっており、 このエラーは警告に格下げされています。

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

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

将来の dpkg では、すでにインストールされているパッケージがこれからインストールしようとするパッケージを置き換える (Replace) と指定されているときには、 すでにインストールされているパッケージが上書きすると宣言しているファイルは削除されるようになる予定です。 これによって、古いバージョンのパッケージを問題なく上書きインストールできるようになります。

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

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

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

ソースパッケージとバイナリパッケージ間の関連 - Build-DependsBuild-Depends-IndepBuild-ConflictsBuild-Conflicts-Indep

ソースパッケージはバイナリパッケージに対する依存、あるいは競合関係を宣言することができます。 これは制御ファイルの Build-DependsBuild-Depends-IndepBuild-Conflicts 及び Build-Conflicts-Indep を使って指定します。 これらは、debian/rules 中のターゲットのうちで、 適用を受ける特定のフィールドが呼び出されたときに、 定義されている依存、あるいは衝突関係が満たされていなければならない (上でバイナリパッケージに対して定義したのと同じように) という意味です。 Build-Depends, Build-Conflicts

Build-DependsBuild-Conflicts フィールドは buildbinarybinary-archbinary-indep ターゲットに適用されます。

Build-Depends-Indep, Build-Conflicts-Indep

Build-Depends-IndepBuild-Conflicts-Indep フィールドは binarybinary-indep ターゲットに適用されます。

設定ファイルの取り扱い

dpkg はパッケージ設定ファイルをある程度自動的に操作できます。

そのメカニズムを妥当に動作させられるかどうかは多数の要因によりますが、 基本的にはある特定の設定ファイルに対して二つのアプローチがあります。

簡単な方法は、パッケージ中にできうる限り最良のパッケージ設定ファイルを含んだ形でリリースし、以降の更新には dpkg の構成ファイルメカニズムを使用するやりかたです。 設定ファイルをユーザが編集することがなさそうでも、仮に編集していた場合にはその編集が失われないようにしたい、 そしてそのパッケージの新しいバージョンはそんなに頻繁にはリリースされない、そんな場合にはこれはよいアプローチです。

より複雑な方法として、設定ファイルを postinst スクリプト中で一から構成し、パッケージの以前のバージョンでの間違いを自動的に修正する責任を持つやり方です。 これは、構成ファイルがそれぞれのシステムによって違う場合には適切な方法です。

共有ライブラリ

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

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

次に、パッケージは ldconfig の作成する共有ライブラリ用のシンボリックリンクを含むべきです。 例えば、libgdbm1 パッケージは、 /usr/lib/libgdbm.so.1 から libgdbm.so.1.7.3 を含むべきです。これが必要なのは、dpkg がライブラリをインストールしてから postinstldconfig が実行されるまでの間に ld.so がそのライブラリを見つけることができるようにするためです。 さらに、古いバージョンのパッケージ管理システムでは、.deb ファイル中のライブラリは、それへのシンボリックリンクが置かれるより先に置かれていることを要求していました。 これは、dpkg が (古いバージョンのライブラリを指すシンボリックリンクを上書きすることによって) 新しいシンボリックリンクをインストールする時点で、新しい共有ライブラリが既に存在していることを保証するためです。 あいにく、これはいつでも可能なことと言うわけではありませんでした。 なぜなら、それはファイルシステムのふるまいに大きく依存するからです。 ある種の (reisefs のような) ファイルシステムはファイルを作る順番が問題にならないように、ファイルを並び換えます。 リリース 1.7.0 から、パッケージ作成時に dpkg が自動的にファイルそれ自身を並び換えるようになります。

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

共有ライブラリを、/etc/ld.so.conf に書かれてあるディレクトリか、ld.so によるデフォルトの検索ディレクトリ (現在のところ /usr/lib/lib です) のいずれかにインストールするパッケージは、 最初の引数が `configure' であったとき、かつそのときのみ postinst スクリプト中で ldconfig を呼ばなければなりません。 注意しなければならないのは、パッケージをアップグレードしよう ( 参照) とするときに postrm や preinst の中から ldconfig を呼ばないようにすることです。その場合には dpkg がインストールしている間に使う一時的なファイルを ldconfig が見てしまい、dpkg がインストールを進めてそのリンク先を消してしまう直前に、 ldconfig は共有ライブラリリンクがその一時的なファイルを指すようにしてしまうからです。

shlibs ファイルの書式

このファイルは、dpkg-shlibdeps によって使用され、 共有ライブラリを含むパッケージを提供する場合は必須です。

それぞれの行はつぎのものから構成されます。 library-name version-or-soname dependencies ...

library-name は、共有ライブラリの名前です。 例えば、libc5 です。

version-or-soname は、ライブラリの .so ファイル名です。 つまり、ld.so 認識されるライブラリ名と厳密に一致した名前を与えなければいけません。 これはふつうは、ライブラリのメジャーバージョン番号です。

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

例えば、パッケージ foo が、libfoo.so.1.2.3 を含む場合、ライブラリの .so ファイル名は libfoo.so.1 となります。そして、マイナーバージョンが少なくとも 2.3 であるような最初のパッケージのバージョンは、1.2.3-1 となります。その状況で、パッケージの shlibs には以下のように書きます。 libfoo 1 foo (>= 1.2.3-1)

特定のバージョン番号への依存関係は、古いバージョンの共有ライブラリで新しいバイナリを実行しようとした際に、 ld.so が出力する警告を回避するのに役立ちます。

shlibsに関する技術情報の詳細 shlibs とは 何か

debian/shlibs ファイルは、パッケージ化されたバイナリがどの共有ライブラリに依存しているか調べる方法を提供します。 このファイルを使用する目的は、パッケージメンテナが自分の作業を楽にするためです。

Debian システム上にある他の shlibs ファイルを以下に列挙します。

/etc/dpkg/shlibs.default

/etc/dpkg/shlibs.override

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

debian/shlibs.local

dpkg-shlibdeps はバイナリパッケージの構築時これらのファイルを使います。

dpkg-shlibdepsどのように 動作するのか?

dpkg-shlibdeps は、コマンドラインから入力されたコンパイル済のバイナリとライブラリが直接使っている共有ライブラリを

以前は ldd を読んでこの処理を行っていましたが、 現在は objdump を呼ぶようになっています。 これによってパッケージ構築方法にいくつかの変更が必要になっています。

バイナリ foo がライブラリ libbar にリンクされている場合、このバイナリはこのライブラリを直接使っています。 libbar が必要とするその他のライブラリは foo に間接的にリンクされており、ダイナミックリンカは libbar をロードする際に自動的にそれらのライブラリをロードします。 ldd を使うと、直接使われているライブラリと間接的に使われているライブラリのすべてが列挙されます。 一方、objdump は直接使われているライブラリのみを列挙します。 間接的に使われているライブラリは自動的に引いてこられるため、 パッケージが依存関係を指定する必要があるのは直接リンクしているライブラリだけです。

この変更は、パッケージの構築方法に変更があることを意味します。 現在、dpkg-shlibdeps はバイナリに対してのみ実行されています。 しかし、今後はあるライブラリが他のライブラリを必要とするという依存関係を使うことになるため、 そのような依存関係をもつライブラリを使用する場合には dpkg-shlibdeps を実行する必要があります。

このことについての理解を助けとなる良い例が、複数のバージョンの mesa ライブラリにたいする現在の混乱です。 ldd を基本としたシステムでは、mesa を使う全てのパッケージは、glide の mesa 派生物を扱うため svgalib|svgalib-dummy への依存関係を加える必要があります。 objdump を基本としたシステムでは、このような処置はもはや必要でなく、 全ての人のたくさんの労力を省くことができます。

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

調べます。

各共有ライブラリに対して、dpkg-shlibdeps は以下の情報を把握する必要があり、

the package containing the library, and

the library version number,

そのために以下のファイルをここに書かれている順に走査します。

debian/shlibs.local

/etc/dpkg/shlibs.override

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

/etc/dpkg/shlibs.default

様々な shlibs ファイルを 誰が 管理しているのか?

/etc/dpkg/shlibs.default - dpkg のメンテナ

/var/lib/dpkg/info/package.shlibs - それぞれのパッケージのメンテナ

/etc/dpkg/shlibs.override - ローカルのシステム管理者

debian/shlibs.local - そのパッケージのメンテナ

shlibs.default ファイルは、dpkg が管理しています。dpkg によって提供される shlibs.default の各エントリは、共有ライブラリパッケージすべてが、それぞれの shlibs ファイルを持つようになるまで、既定値を決めるために置かれています。

dpkg-shlibdepsshlibs ファイルを どのようにして 使うか ? あなたのパッケージが共有ライブラリを含んでいないとき

debian/rules ファイル中に dpkg-shlibdeps への呼出しルーチンを置いてください。バイナリだけを含んだパッケージ (つまり、スクリプトを含まない) の場合、以下を使用してください。 dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/* dpkg-shlibdeps が何も文句を言ってこなかったなら、うまくいっています。 もし、エラーや警告などが出力されたのであれば、たぶん、自前の debian/shlibs.local を作成する必要があるでしょう。

あなたのパッケージが共有ライブラリを含んでいるとき

debian/shlibs ファイルを作成して、debian/rules でそれを制御領域にインストールしてください。 install -m644 debian/shlibs debian/tmp/DEBIAN もし、あなたのパッケージが他のバイナリを含んでいるのであれば、 前項の記述を参照してください。

debian/shlibs.localどのように 書くのか

このファイルは、あなたの作ったパッケージが、そのパッケージ用の /var/lib/dpkg/info/*.shlibs をまだ提供していないライブラリに依存しているときの 一時的 解決のためのものです。

バイナリ foo をパッケージ構築中だとします。構築中のメッセージが、例えば以下のようになっていて、 $ ldd foo libbar.so.1 => /usr/X11R6/lib/libbar.so.1.0 (0x4001e000) libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4002c000) libc.so.6 => /lib/libc.so.6 (0x40114000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) dpkg-shlibdeps を実行すると、 $ dpkg-shlibdeps -O foo dpkg-shlibdeps: warning: unable to find dependency information for shared library libbar (soname 1, path /usr/X11R6/lib/libbar.so.1.0, dependency field Depends) shlibs:Depends=libc6 (>= 2.2.1), xlibs (>= 4.0.1-11) 以下のようになっている場合、foo バイナリは、 libbar 共有ライブラリに依存していますが、 /var/lib/dpkg/info/*.shlibs ファイルを提供しているパッケージはないようです。 というわけで、責任をとるパッケージを決定しましょう。

$ dpkg -S /usr/X11R6/lib/libbar.so.1.0 bar1: /usr/X11R6/lib/libbar.so.1.0 $ dpkg -s bar1 | grep Version Version: 1.0-1 どうやら、bar1 パッケージのバージョン 1.0-1 が現在我々の使用しているものということのようです。 ここで、この問題を一時的に解決するために、自分専用の debian/shlibs.local を作ります。以下の行を、 debian/shlibs.local 中に含めてください。 libbar 1 bar1 (>= 1.0-1) さあ、これであなたのパッケージ構築作業はうまくいくはずです。 libbar1 のパッケージメンテナにより、そのパッケージ用の shlibs ファイルが提供されしだい、あなたの debian/shlibs.local ファイルを削除することができます。

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

インストールされるファイルやディレクトリの配置はすべて Linux File system Hierarchy Standard (FHS) に従わなければなりません。 この文書の最新版は本マニュアルと一緒に配布されていますし、 にもあります。 以下の標準に対する質問は debian-devel に送るか、 もしくは FHS の責任者である Daniel Quinlan quinlan@pathname.com に問い合わせて下さい。

サイト毎のプログラム

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

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

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

/usr/local がリモートのサーバからリードオンリーでマウントされていている場合に対処するため、 それらのディレクトリはメンテナスクリプトである postinstprerm から作成や削除を行わなければいけません。 これらのスクリプトはそういった作業に失敗しても、それ自身が落ちるようなことがあってはいけません。 (将来的には、特定のパターンに該当するファイルを dpkg が展開しないよう指示を出せるようになるでしょう。 これにより、.deb パッケージに /usr/local 配下のディレクトリが含められていても、 システム管理者が不用と思えばインストールされることはなくなります。)

例えば、emacsパッケージは、postinst mkdir -p /usr/local/lib/emacs/site-lisp || true を含め、prerm rmdir /usr/local/lib/emacs/site-lisp && \ rmdir /usr/local/lib/emacs || \ true を入れることになるでしょう。

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

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

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

ユーザとグループ

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

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

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

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

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

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

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

100-999:

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

1000-29999:

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

30000-59999:

予約されています。

60000-64999:

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

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

65000-65533:

予約されています。

65534:

ユーザ `nobody' に割り当てられています。このユーザ id はグループ `nogroup' に割り当ててください。

65535:

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

システムランレベル はじめに

/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 オプション付きで起動されていきます。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

スクリプトの書き方

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

サービスを開始します。

stop

サービスを停止します。

restart

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

reload

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

force-reload

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

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

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

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

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

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

必要な設定値がいつも存在していることを保証するため、 `init.d' スクリプト中で /etc/default/ ファイルを取り込む前に各シェル変数に既定の値を設定して置いてください。 また、`/etc/default/' もしばしば conffile ですので、 `init.d' スクリプトはそれが消されていた場合にも失敗することなく妥当に振る舞わなければいけません。

リンクの取り扱い

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

/etc/rcn.d に変更を加えるときには必ず このスクリプトを用い、絶対に /etc/rcn.d 内のシンボリックリンクを直接アーカイブに含めたり、メンテナスクリプトによってシンボリックリンクの作成及び削除を行ってはなりません (後者の方法は、ランレベル情報の取り扱いをもう一つの方法で行っている場合には正しく動作しません)。

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

自分のパッケージをデフォルトの挙動を持つものとして設定するには、 postinst スクリプトに次のように書きます。 update-rc.d package defaults >/dev/null postrm では次のようになります。 if [ purge = "$1" ]; then update-rc.d package remove >/dev/null fi

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

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

ブート時における初期化

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

付記

/etc/rcn.d 内のシンボリックリンクを .deb アーカイブに含めることは問題を生ずるため、してはなりません。 上記にあるように、その場合には update-rc.d を使わなければいけません。

/etc/rcn.d 内のシンボリックリンクを dpkgの conffiles リストに含めることは 問題を生ずるため、してはなりません。 しかし、/etc/init.d スクリプトは設定ファイルとして扱うべきです。そのためには conffile としてマークするか、メンテナスクリプト (参照) の中で適切に扱うようにしてください (このことは、ローカルシステムの管理者が、自分達のシステムにあわせたスクリプトの変更ができるようにしておくために重要なことです。 例えば、ローカルシステムの管理者がパッケージを削除すること無くサービスを停止したり、サービス開始時に特殊なコマンドラインオプションを指定したりする場合、その変更がパッケージのアップグレードの際に失われないようにしなければいけません)。

実例

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

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

上記の init スクリプトを補うファイルが '/etc/default/bind' で、これはこのスクリプト中で使う設定可能なパラメータの値を含んでいます。

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

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

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

Cron ジョブ

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

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

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

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

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

コンソールメッセージ

この章では /etc/init.d 内のスクリプトが標準出力に書き出す各種のメッセージの書式について述べます。 この規定の狙いは Debian の起動とシャットダウン時の見栄えをより一貫したものとすることです。

詳細にわたって、注意深く読んでください。空白や句読点、大文字小文字の使い分けなどが厳密に同じに見えるようにしようと考えています。

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

全てのメッセージは一行に書かれ、大文字で始まり、ピリオド `.' で終わらなければなりません

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

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

以下の場合は、記載の書式を使うようにすべきです。

デーモンを開始するとき

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

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

このように出力するためにスクリプト中では以下のようにしています。 echo -n "Starting printer spooler: lpd" start-stop-daemon --start --quiet 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 文で引用符が正しくなるように使うことができます: echo "Setting DNS domainname to \`"value"'."

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

デーモンを停止するとき

デーモンを止めるときのメッセージの書式は起動時のメッセージに準じ、 `Starting' を `Stopping' に変えたものです。

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

何かを実行しているとき

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

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

デーモンが設定ファイルを再読み込みするときは、以下の書式を使ってください。 Reloading <daemon's-name> configuration...done.

これまでの規則が当てはまらないとき

これまで述べてきた場合に当てはまらないメッセージを表示しなければならない場合、 自分で適切なメッセージを作成して使うことができますが、 最初の項の一般的なルールを良く読んでおいてください。

メニュー

Menu エントリは現在の Menu ポリシーに従う必要があります。この Menu ポリシーは ftp.debian.org/debian/doc/package-developer/menu-policy.text.gz または手近のミラーサイトに置かれています。また、この Menu ポリシーは debian-policy にも収録されています。

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

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

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

マルチメディアハンドラ

ある種の MIME タイプを表示/閲覧/再生/合成/編集や印刷する機能を もつプログラムは ftp.debian.org/debian/doc/package-developer/mime_policy.text.gz または手近のミラーサイトの、現在の MIME サポートポリシーに従って登録を行う必要があります。 この MIME サポートポリシーは debian-policy にも収録されています。

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

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

キーボード設定

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

以下は特定のキーとその解釈の組です。 <--

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

Delete

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

Control+H

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

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

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

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

`Delete' X 環境では Delete キーイベントを起こします

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

Linux コンソールは `<--' は DEL を、 Delete キーは ESC [ 3 ~ を生成するように設定されています (現状そうなっています)。

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

stty erase は ^? と設定します

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

Emacs は バックスペースキーイベントと、`stty erase' で設定されたキーイベントは delete-backward-char にマップされ、 Delete キーイベントは delete-forward-char にマップされます。 また、^H は常にヘルプの呼び出しです。

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

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

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

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

一部のシステム (以前の Debian の版もそうでした) では <-- と Delete キーが Delete キーイベントを起こすよう xmodmap で設定しています。私たちは、 クライアントに対して同一の X リソースで私たちの望む設定を行い、 また各クライアントが別の設定を望んだときに個別のリソース で設定できるように上記のように変更しています。xmodmap を使ったシステムでは Delete はたぶん動きませんが、 <-- の方は正しく動作します。

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

環境変数

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

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

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

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

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

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

通常は以下記載のコンパイル時の引数を使ってください。 CC = gcc CFLAGS = -O2 -g -Wall # warning オプションは変更可です。 LDFLAGS = # なし install -s # (または、debian/tmp で strip をかけてください)

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

-N フラグは使ってはいけません。a.out システムでは小さなバイナリの時に便利なこともあったのですが、ELF ではよい影響をあたえません。

デバッグ情報はエラー解析やコアダンプ (バグレポートに添付してユーザから送られてきたもの) の分析や、ソフトウェアのテストや開発に役に立ちます。 このため、以下のインターフェースでデバッグ情報を含んだパッケージのビルドをサポートしておくことを推奨します: 環境変数 DEB_BUILD_OPTIONS が文字列 debug を含んでいた場合、ソフトウェアをデバッグ情報付きで (通常は CFLAGS-g フラグを含めることを意味します) コンパイルしてください。これにより、デバッグ情報付きのビルドツリーの世代管理ができます。 また、環境変数 DEB_BUILD_OPTIONS が文字列 nostrip を含んでいた場合、インストール時にファイルに strip を行わないようにしてください。これにより、デバッグ情報を含めたパッケージを作成できます。 以下に示す makefile の断片はこの両方の条件を試す例の部分だけを示したものです

原則の解説: 既定値として -g を使うのは単に CPU 時間の無駄使いです。 というのはデバッグに必要な情報はどちらにせよ strip されてしまっていますから。 パッケージが簡単にデバッグ情報付きでビルドし直せるようにすれば既定値としては -g なしでビルドすることにしておくことができます。 これは make ターゲットとして "build-debug" ターゲットを与えるか、パッケージのコンパイルの際に "DEB_BUILD_OPTIONS=debug" と環境変数を指定しておけばデバッグ情報付きのビルドが行えるようになります。

これには他の利点もあって、

まずデバッグ用のバイナリやライブラリをこのやり方で作ることができる (つまり、debian/rules を編集する必要は最早無い) ことです。何となれば、このやり方はまさにデバッグ用のバイナリを作るために規定された方法に沿ったやり方となっているからです。

自動ビルド時に CPU 時間をずっと節約できます。 これはデバッグ情報を含めない (したがってそれを strip もしない) ことはコンパイル速度を改善するからです。 これはコンパイラの手順を丸ごと一つ省くことになりますので。

CFLAGS = -O2 -Wall INSTALL = install INSTALL_FILE = $(INSTALL) -p -o root -g root -m 644 INSTALL_PROGRAM = $(INSTALL) -p -o root -g root -m 755 INSTALL_SCRIPT = $(INSTALL) -p -o root -g root -m 755 INSTALL_DIR = $(INSTALL) -p -d -o root -g root -m 755 ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) CFLAGS += -g endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif 上記の例は単なる参考のためのもので、policy で従うべき内容を示したものではないことに注意してください。 あなたのパッケージでこの例が動作するようにするためにはあちこち手直しする必要があるでしょう。

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

ライブラリ

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

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

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

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

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

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

というわけで、共有ライブラリを libtool を使って作成するパッケージでは、 -dev パッケージに .la ファイルを含めるべきです。 ただし、libtool の libltdl ライブラリに依存するパッケージは例外で、この場合には .la ファイルはランタイムパッケージに含めなければいけません。 後者のほうが通常良いやり方で、特にスタティックリンク時の問題に対処するのが容易になります。

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

共有ライブラリ

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

開発環境とランタイムキットとして共有ライブラリのみを含む単純な構成のパッケージでは、二つのパッケージを作成すべきです。 即ち、librarynamesonamelibrarynamesoname-dev です。 (.so ファイル名 (soname) は共有ライブラリの共有オブジェクト名です。 これはプログラムの作成時とダイナミックリンカがプログラムを実行する際に一致させなければならないもので、通常はライブラリのメジャーバージョン番号です)

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

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

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

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

パッケージ中に共有ライブラリを含むに当たっては Debian パッケージングマニュアル の指示に従うべきで、このライブラリを使うパッケージのための依存関係の詳細を記載した shlibs コントロールエリアファイルを含めておかなければなりません。

共有ライブラリに実行属性を付けてインストールしてはいけません。 ld.so はこのような属性を必要としていませんし、 共有ライブラリを実行してもコアダンプを吐くだけですから。

スクリプト

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

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

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

標準のシェルインタープリタは `/bin/sh' で、これは echo -nで改行を挿入することがないような POSIX 互換なシェルのどれかへのシンボリックリンクです

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

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

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

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

cshtcsh をスクリプト言語に使うのは避けるべきです。 理由は comp.unix.* の FAQ の一つ Csh Programming Considered Harmful を参考にしてください。 これは で、場合によっては ftp.cpan.org/pub/perl/CPAN/doc/FMTEYEWTK/versus/csh.whynot

訳注:日本語訳はとりあえず ftp.sra.or.jp/pub/news/fj.archives.documents/csh-whynot-jp にあります。

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

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

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

シンボリックリンク

通常、トップレベルディレクトリ (ルートディレクトリ `/' にあるディレクトリがトップレベルディレクトリです) 内のシンボリックリンクは相対参照とします。 また、トップレベルディレクトリ間のシンボリックリンクは絶対参照とします。

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

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

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

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

デバイスファイル

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

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

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

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

設定ファイル 定義

設定ファイル

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

conffile

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

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

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

配置

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

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

設定ファイルの扱い

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

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

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

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

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

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

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

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

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

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

設定ファイルの共用

同じファイルを conffile として指定しているパッケージ間は 競合 (conflict) していると指定しなければいけません。

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

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

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

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

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

関連するパッケージは設定ファイルを変更する際には上で記した "core" パッケージの提供するプログラムを使わなければいけません。 また、関連するパッケージは変更のためのプログラムが存在することを保証するために "core" パッケージに依存することを宣言するか、変更のためのプログラムがなかったときにはエラー等を出さず変更をあきらめるようにするかの、どちらかとしておかなければいけません。

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

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

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

この関係で、プログラムが動作するのに $HOME ディレクトリにドットファイルをあらかじめ用意しておく必要があるならば、 ドットファイルはあらかじめ /etc/skel にインストールしておくべきです (また、パッケージインストール スクリプト中で作成なり変更なりを行わないなら、conffile に列挙しておくべきです)。

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

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

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

ログファイル

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

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

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

ログファイルは時々循環させるようにして、どこまでも大きくなることがないようにしなければいけません。 これを実現する最良の方法は、ディレクトリ /etc/logrotate.d にスクリプトを置き、logrotate の提供する機能を使うやり方です。以下に logrotate の設定ファイルのいい例を挙げましょう (詳しくは を見てください)。 /var/log/foo/* { rotate 12 weekly compress postrotate /etc/init.d/foo force-reload endscript } 上記の例は `/var/log/foo' 以下の全ファイルを巡回させ、12 世代分保存し、循環終了時に HUP シグナルを送信するものです。

パッケージが完全削除 (purge) された時には、ログファイルがすべて消去されるよう (パッケージが削除されたときには消しません) postrm スクリプトに与えた引数を確認すべきです。

ファイル属性と所有者

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

ファイルは root.root の所有権で、所有者書き込み可能で誰でも読める (および適宜実行可能である) ようにしてください。

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

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

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

システム管理者がローカルなセキュリティの方針に合わせるため、 各バイナリのパーミッションを変えてパッケージを再設定せざるを得ないような枠組にしてはいけません。 設定ファイルやその他の同様な対象は、パッケージを dpkg を使って再インストールしたときに配布時のパーミッションに戻ってしまいます。 その代わりに、例えばプログラムを利用することができるグループを作り、 setuid した実行ファイルはそのグループだけが実行できるような設定とすることを考えてください。

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

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

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

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

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

もしプログラムにアーキテクチャを指定するための文字列が必要な場合には以下の書式に従わなければなりません。 <arch>-<os> ここで `<arch>' は i386、alpha、arm、m68k、powerpc、sparc のいずれかです。また `<os>' は linux か gnu のどちらかになります。 ここでの gnu は GNU/Hurd オペレーティングシステムのために予約されています。

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

デーモン類

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

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

設定ファイル /etc/inetd.confupdate-inetd スクリプトか、DebianNet.pm Perl モジュールを介さずにパッケージスクリプトから変更してはいけません。

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

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

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

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

エディタとページャ

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

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

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

これら2つのプログラムは `alternatives' を通して管理されています。 すなわち、エディタとページャ機能を提供する各プログラムは `update-alternatives' スクリプトを使って自分を登録しておかなければいけません。

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

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

パッケージは `editor' や `pager' に依存する必要がなく

Debian ベースシステムが `editor' と `pager' プログラムを提供しています。

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

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

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

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

HTML 文書へのアクセス

各パッケージの HTML 形式の文書は /usr/share/doc/package に置きます。 ただし、/usr/doc/package からシンボリックリンクでアクセスできるように 以前との互換性を維持するためです。 の項を参照ください。 してください。 また、次のようにして参照することができるようにしてください。 http://localhost/doc/<package>/<filename>

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

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

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

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

FHS に記載の通り、メールスプールは /var/spool/mail であり、メールを送るインターフェースプログラムは /usr/sbin/sendmail です。メールスプールは base システムの 一部で、 MTA パッケージの一部ではありません。

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

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

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

liblockfile version >>1.01

に含まれる maillockmailunlock を使うのが上記を実現するお勧めのやり方です。

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

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

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

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

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

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

各パッケージはこのファイルの存在をチェックしなければなりません。 そのファイルが存在すればそれ以上の質問なしにそのファイルを使ってください (MTAの設定スクリプト中では、このファイルが存在している場合にこれを使うかどうかの質問をしてもかまいません)。 このファイルが存在しなければ、パッケージの設定中にユーザに /etc/mailname に書くべき内容を問い合わせ、その内容を書いてください。 ここでの問い合わせでは、今問い合わせている名前は、ここで問い合わせを行ったプログラムだけで使うものではないことがはっきり分かるように質問を行うよう留意してください。 例えば、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 ウィンドウシステム下で使用する際の実行時の必要性を満たすようにパッケージ依存関係を宣言しなければいけません。 対象となるパッケージが standard またはより高いプライオリティでインストールされるものである場合には、 X 関連のパッケージを別パッケージに分離してもかまいませんし、また X をサポートした別バージョンのパッケージを作成してもかまいません。

X サーバを提供するパッケージ、言い換えると直接または間接に実際の入力機器と表示ハードウェアを操作するパッケージは制御データ中に仮想パッケージ xserverを提供することを

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

宣言すべきです。

ncurses-base パッケージに terminfo 情報が記載されたターミナルタイプをサポートする X ウィンドウシステムのターミナルエミュレータを提供するパッケージは制御データ中に仮想パッケージ x-terminal-emulatorを提供することを宣言すべきです。 このようなパッケージはまた自分自身をプライオリティ 20 で /usr/bin/x-terminal-emulator の代替とするよう宣言するべきです。

X ウィンドウシステムのウィンドウマネージャを提供するパッケージは制御データ中に仮想パッケージ x-window-manager を提供することを宣言すべきです。 このようなパッケージはまた自分自身を以下で説明するプライオリティで /usr/bin/x-window-manager の代替とするよう宣言するべきです。 まずプライオリティ 20 から始めます ウィンドウマネージャが Debian メニューシステムをサポートしている場合、パッケージの既定設定でこのサポートが使えるようになっている (システムやユーザの持つ設定ファイルで、この機能を有効化する必要がない) 場合、20を足してください。 設定ファイルを変更しなければならない場合、10 だけを足してください。 もしウィンドウマネージャが既定の設定下で別のウィンドウマネージャを使って X セッションを再起動可能 (X サーバを再起動せずに) なら 10 を足してください。そうでないなら何も足しません。

X ウィンドウシステムのフォントを提供するパッケージでは X およびフォントサーバの変更なしにそれが有効になるように、また自分自身の情報を登録する際に他のフォントパッケージの情報を壊さないよういくつかの作業を行う必要があります。 X ウィンドウシステムでサポートされるフォントはどの種類のものでもプログラムやライブラリや説明文書 (そのフォントに対するものはのぞいて) とは別のバイナリパッケージにするべきです。 もしプログラムかライブラリが特定の一つまたは複数のフォントがなければ使用できない場合には、必要とするフォントを収録したパッケージに対して依存関係を宣言するべきです。 BDF フォントは xbase-clients パッケージ収録の bdftopcf ユーティリティを使って PCF フォントに変換し、 gzip を行い、解像度に応じたディレクトリに置くべきです。 100 dpi のフォントは /usr/X11R6/lib/X11/fonts/100dpi/ に置くべきです。 75 dpi のフォントは /usr/X11R6/lib/X11/fonts/75dpi/ に置くべきです。 絵文字フォント、カーソルフォントとそのほかの低解像度のフォントは /usr/X11R6/lib/X11/fonts/misc/ に置くべきです。 Speedo フォントは /usr/X11R6/lib/X11/fonts/Speedo/ に置くべきです。 Type 1 フォントは /usr/X11R6/lib/X11/fonts/Type1/ に置くべきです。 もしメトリックファイルが提供されているならそれも同じディレクトリに置いてください。 上記で並べられた以外の /usr/X11R6/lib/X11/fonts/ 以下のサブディレクトリを作成したり使ったりすべきではありません。 (PEXcyrillic ディレクトリは歴史的経緯で例外扱いされていますが、これらディレクトリ中にファイルをインストールすることはやはり避けたほうがいいでしょう。) フォントパッケージは上記の X フォントディレクトリに直接ファイルをおかず、ファイルシステム中の実際の場所を指すシンボリックリンクをフォントディレクトリに置くようにしてもかまいません。 この場合、実際にフォントを置く場所は FHS 準拠の場所にしてください。 フォントパッケージに 75dpi と 100dpi の両バージョンのフォントを収録すべきではありません。 もし両方の解像度のものがあるなら、そのフォントを収録したパッケージ名に "-75dpi" と "-100dpi" を付けた独立のバイナリパッケージを提供してください。 miscサブディレクトリに収録されるフォントは、同じパッケージ中に 75dpi や 100dpi のフォントを収録していてはいけません。 その代わりに、そのフォントを収録したパッケージ名に "-misc" を付けた独立のバイナリパッケージを提供してください。 フォントパッケージはフォントディレクトリ中に fonts.dirfonts.alias 及び fonts.scale の各ファイルを収録してはいけません fonts.dirファイルはどのような形でも収録してはいけません。 fonts.aliasfonts.scale ファイルは必要なら /etc/X11/fonts/fontdir/ package.extension ディレクトリに収録すべきです。ここで fontdir は関連フォントが収録される /usr/X11R6/lib/X11/fonts/ 以下のサブディレクトリ名 (つまり、75dpimisc など)で、 package はそのフォントを収録したパッケージの名前です。 また、extension はファイルの内容に従い scalealias のどちらかになります。 フォントパッケージは xbase-clients への依存関係を宣言しなければいけません。 また、パッケージの post-installation と post-removal スクリプトでフォントをインストールした各ディレクトリで mkfontdir を実行しなければいけません。 一つまたは複数の fonts.scale ファイルを収録するフォントパッケージでは、上記の通り xbase-clients (>= 3.3.3.1-5) にバージョンを含む依存関係を宣言しなければならず、またフォントをインストールした各ディレクトリで mkfontdir を実行するまえに update-fonts-scale を実行しなければいけません。 この実行処理はパッケージの post-installation と post-removal スクリプトで行われなければいけません。 一つまたは複数のfonts.aliasファイルを収録するフォントパッケージでは、上記の通り xbase-clients (>= 3.3.3.1-5) にバージョンを含む依存関係を宣言しなければならず、またパッケージの post-installation とpost-removal スクリプトでフォントをインストールした各ディレクトリで update-fonts-alias を実行しなければいけません。 フォントパッケージは既にパッケージ化されている他のフォントと同じエイリアス名と衝突するエイリアス名でフォントを収録してはいけません。 フォントパッケージは既にパッケージ化されている他のフォントと同じ XLFD レジストリ名でフォントを収録してはいけません。

アプリケーションデフォルトファイルは /etc/X11/app-defaults/ にインストールしなければいけません(X Toolkit Intrinsics - C Language Interface マニュアル記載のように /etc/X11/ 下のサブディレクトリをローカルに使用することは許されます)。 これらは conffile であるとの属性を設定し、設定ファイルとしての扱いを行わなければいけません。 X ツールキット (Xt) とリンクしていないプログラムでも、 プログラムの X リソースの設定は、/etc/X11/Xresources/ にパッケージと同じ名前のファイルを用意することによって行うことができます。 このファイルは conffile として登録しなければいけません。 重要 /etc/X11/Xresources/ ディレクトリにファイルをインストールするパッケージは xbase (<<3.3.2.3a-2); へのコンフリクトを宣言してください。 これがなされていないと、パッケージのインストールの際に既存のシステム管理者の設定した /etc/X11/Xresources の中の ファイル を壊す可能性があります。

X ウィンドウシステムを使うパッケージは可能な際には FHS 標準に準拠するべきです。 つまり、バイナリやライブラリやマニュアルページやその他のファイルを FHS の指示する場所にインストールすべきです。 これはパッケージが正しく動作しないと言うことがない限り、ディレクトリ /usr/bin/X11R6//usr/share/doc/X11R6//usr/include/X11R6//usr/lib/X11R6/ にファイルをインストールしてはいけないことを意味します。 ディスプレイマネージャやウィンドウマネージャの設定ファイルは /etc/X11/ ディレクトリ以下のパッケージ名称のサブディレクトリにインストールしてください。 これは、これらのプログラムが X ウィンドウシステムの動作と密に関連するためです。 アプリケーションレベルのプログラムは、ポリシー中で別途指示されていない限り /etc/以下を用いてください。サブディレクトリ /usr/X11R6/include/X11//usr/X11R6/lib/X11/ 以下にファイルをインストールすることは許されていますが、できるだけ避けてください。 パッケージメンテナは /usr/lib//usr/share/ が代わりに使えないか判断するべきです (プログラムがファイルを他の場所で探すように簡単に変更するのが難しい場合には X11R6 ディレクトリから FHS 準拠の場所へシンボリックリンクを張る解決は推奨できます)。 ディレクトリ /usr/bin/X11//usr/share/doc/X11//usr/include/X11//usr/lib/X11/ にファイルをインストールしてはいけません。 但し、パッケージ内のファイルは、もしリソースが FHS 準拠の場所に移されていないならば、これらの ディレクトリ (対応する X11R6 名称の /usr/X11R6/bin//usr/X11R6/include/X11//usr/X11R6/lib/X11/ ではなく) に対してリンクを張るべきです。

DFSG に準拠しない OSF/Motif ライブラリを必要とするプログラムでは、Motif の別実装でフリーな LessTif で問題なく動作するかを調べるべきです。 もし、Motif では動作するプログラムが LessTif では配布、サポートに耐えるだけ満足に動作しないとメンテナが判断したならば、二つの版のパッケージ、一方は Motif ライブラリに静的にリンクし "-smotif" 、もう一方は Motif ライブラリに動的にリンクし "-dmotif" をパッケージ名に付けたものを作成すべきです。、 どちらの Motif にリンクしたパッケージも DFSG に準拠しないソフトウェアに依存しているので、main ディストリビューションにはアップロードできません。 一方、知られている OSF/Motif の各版はすべて静的にリンクされたバイナリの再配布を許していますが、使っている Motif のライセンスで再配布が可能かどうかを確認するのはメンテナの責任です。

Emacs lisp プログラム

emacs lisp プログラムをパッケージングする際には『Debian Emacs Policy』(emacsen-common パッケージの文書中に debian-emacs-policy.gz という名で収録されています) に当たってください。

ゲーム

/var/games のパーミッションは 755 root.root です。

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

ハイスコアファイル、保存ファイルなどの保護され、アクセスに特権 が必要なファイルを持つゲームは、オーナ・グループを root.games にして 2755 で set-gid しておき、ファイルとディレクトリには適当なパーミッション (例えば、770 root.games)を与えてもかまいません。 set-uid はセキュリティ上の問題が起きるのでしてはいけません (アタックする人は set-uid されたゲームを破ることができたら、そのファイルを他の実行ファイルで上書きし、ほかのプレイヤーがトロイの木馬を実行してしまうことになります。 set-gid されたゲームでは、アタッカーはあまり重要ではないゲームのデータだけにアクセスできるようになるだけで、ほかのプレイヤーのアカウントを手にいれることができるとしても、そこから更にかなりの労力を費すことになるでしょう)。

一部のパッケージ、例えば fortune cookie プログラムでは、データファイルやその他の静的な情報を読み込み不可でインストールし、提供される set-id されたプログラムによってのみアクセスできるように、上流の開発者が設定しています。 このようなことを Debian パッケージでやるべきではありません。 なんとなれば誰でも .deb ファイルをダウンロードしてきて中身を読むことができますから、読み込み不可のファイルを使っても無意味なためです。 また、読み込み不可のファイルを作らないことは set-id されたプログラムをたくさん作る必要がなくなることを意味しますし、引いてはセキュリティホールのリスクを減らすことにもなります。

FHS で規定されているように、ゲームのバイナリは /usr/games にインストールしてください。X ウィンドウシステムを使うゲームもここに入れてください。ゲームのマニュアル (X 用、X 不使用の両方とも) は /usr/share/man/man6 にインストールしてください。

文書 マニュアル(man ページ)

マニュアルは nroff 形式で /usr/share/man の適切な場所にインストールするべきです。また、セクションは 1 から 9 までのみをつかうべきです (詳しくは FHS 参照)。 フォーマット済みの 'cat' 形式のマニュアルをインストールしてはいけません。

各プログラム、ユーティリティ、機能はそれに関連するマニュアルページを同じパッケージに含めるべきです。 すべての設定ファイルもそれに関連するマニュアルページを含めることを推奨します。

特定のプログラム、ユーティリティ、関数や設定ファイルでマニュアルが存在せず、そのことが debian-bugs で bug として報告済みになっている場合、 対応するマニュアルページを マニュアルへのシンボリックリンクにしておいてもかまいません。 このシンボリックリンクは以下のようにして debian/rules で作成することができます。 ln -s ../man7/undocumented.7.gz \ debian/tmp/usr/share/man/man[1-9]/the_requested_manpage.[1-9].gz このマニュアルページにはマニュアルの欠如はバグとして既に報告されていると明記されています。言い換えれば上記のように処理していいのは本当にバグとしての報告が既になされている場合のみです (自分で報告しておく、という処理でもかまいません)。 適切なマニュアルが収録されるまではバグ報告を閉じないでください。

上流の作者にマニュアルがないとの苦情を転送し、Debian バグトラッキングシステムでは 『転送済み』という処理にしてもかまいません。 GNU プロジェクトではマニュアルがないことは通常バグではないとしていますが、私たちはバグとみなします。 彼らがバグではないと連絡してきた場合では、何も処理せずに Debian バグトラッキングシステム上では『未解決』のままにしておいてください。

マニュアルは gzip -9で圧縮してインストールしなければいけません。

一つのマニュアルページを複数の名前で参照する必要がある場合は、 .so 機能を使うよりもシンボリックリンクを使う方が望ましいやり方です。 ただ、上流のソースが .so を使っている場合、それをあえてシンボリックリンクへ変更する必要はありません。 それが余程簡単でないかぎり行わないでください。 マニュアルのディレクトリではハードリンクを作成すべきではありません。 また、.so 命令の中に絶対パスのファイル名を書くべきではありません。 マニュアルの .so 命令ではファイルはマニュアルツリーの起点 (通常は /usr/share/man です) からの相対参照とすべきです。

Info 形式の文書

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

パッケージは Info システムの dir ファイルを更新するために postinst スクリプト中で install-info を呼び出すべきです。 install-info --quiet --section Development Development \ /usr/share/info/foobar.info

あなたのプログラムの場所を示すためにセクションを指定するのは良いことです。 それには --section オプションを使用してください。 どのセクションにするかは、自分のシステムの /usr/share/info/dir を見て最もふさわしいものを選んでください。 適当なものが見付からない場合は新しいセクションを作成してください。 --sectionオプションは 2 つの引数を取ることに注意してください。 最初の引数は存在しているセクションと一致させる正規表現 (大文字小文字は区別しません) で、もう一つは最初の引数に一致するセクションがないときに作成する、新しいセクション名として使います。

prerm スクリプト中では、以下のようにしてエントリを削除するべきです。 install-info --quiet --remove /usr/share/info/foobar.info

install-info が info ファイル中に説明部のエントリ ポイントを見つけられない場合、エントリポイントを付け足さなければなりません。 この件の詳細は を参考にしてください。

追加文書

パッケージに付属しているそれ以外の文書はパッケージメンテナの裁量でインストールするかどうかを決めて下さい。 テキスト形式の文書は /usr/share/doc/package (package はパッケージの名称です) にインストールし、小さなものでない限り gzip -9 で圧縮しておいてください。

対象とするパッケージを使うほとんどのユーザが必要としないような多量の文書を含むようなパッケージは、そのような文書を収録した独立のパッケージを作成して、そのような文書を必要としないか、インストールしたくないユーザがマシンのディスクスペースを消費しなくてもいいようにしておくべきです。

バイナリパッケージ中の /usr/share/doc/package にソースパッケージに付いている各種のテキスト文書 (README や changelog など) を入れるのは通常よい考えです。 ただ、まぁ当り前のことですが、パッケージの作成やインストール方法について書かれたものを含める必要はありません。

システム管理者が /usr/share/doc 中のファイルを消してもプログラムが動かなくなることがないよう、 このディレクトリ以下のファイルをプログラムから参照するようにしてはいけません。 プログラムから参照されるが、同時に単独のドキュメントとしても役に立つようなファイルは /usr/share/<package>/ 以下にインストールして、/usr/share/doc/<package>/ へシンボリックリンクを張ってください。

文書の管理

以前の Debian リリースでは添付文書類は /usr/doc/package ディレクトリに収録されていました。 現在使われている /usr/share/doc/package ディレクトリへのスムーズな移行のために、各パッケージは /usr/doc/package から新しい文書の位置 /usr/share/doc/package へのシンボリックリンクを このシンボリックリンクはいずれは削除されるでしょうが、全パッケージの移行が完了してポリシーの変更がなされるまでは互換性のために置かなければいけません。 管理しなければいけません。このシンボリックリンクはパッケージをインストールしたときに作成しなければなりませんが、 dpkg の問題のために単にパッケージにそのリンクを含めておくことはできません。 妥当な方法は、パッケージの postinst スクリプトに以下を含めておくことです。 if [ "$1" = "configure" ]; then if [ -d /usr/doc -a ! -e /usr/doc/#PACKAGE# \ -a -d /usr/share/doc/#PACKAGE# ]; then ln -sf ../share/doc/#PACKAGE# /usr/doc/#PACKAGE# fi fi そして以下をパッケージの prerm に入れてください。 if [ \( "$1" = "upgrade" -o "$1" = "remove" \) \ -a -L /usr/doc/#PACKAGE# ]; then rm -f /usr/doc/#PACKAGE# fi

好ましい文書形式

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

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

原則の解説:ここで重要なことは、HTML 形式の文書は 一部 のパッケージには収録されていますが、現時点ではまだ main のバイナリパッケージ全部に収録されているわけではないということです。

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

PostScript のような他の形式は自分の好みで提供してください。

著作権関連情報

各パッケージには、著作権と配布条件のライセンス文書が元のままの形式で /usr/share/doc/<package-name>/copyright に収録されていなければいけません。 このファイルは圧縮されていたり、シンボリックリンクであったりしてはいけません 訳注:本節後半の GPL ほかの項参照

また、著作権情報ファイル中には元となった上流のソースをどこから手に入れたかを記載しなければなりません。 また、元のソースから Debian パッケージを作成するためにどのような変更を行なったかを簡潔に書いておくべきです。 またパッケージの原作者の名前とパッケージ作成に関与した Debian メンテナの名前を載せるべきです。

debian/copyrightと同じファイルが /usr/share/doc/パッケージ名/copyright にインストールされるファイルのコピーは debian/copyright に収録しておくべきです。

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

パッケージがカリフォルニア大学バークレイ校の BSD ライセンス、 Artistic Licence、GNU の GPL、GNU の LGPL に基づいて配布されている場合には、おのおの /usr/share/common-licenses/BSD、 /usr/share/common-licenses/Artistic、 /usr/share/common-licenses/GPL、 /usr/share/common-licenses/LGPL の各ファイルを参照するように

ディレクトリ名が『ライセンス (license)』であって『著作権 (copyright)』ではない理由を簡単に説明します。以前は /usr/doc/copyright に全パッケージの著作権情報 と上記 4 つ (GPL、LGPL、Artistic と BSD) の汎用ライセンスが収録されていました。 これが、現在は個別の著作権情報は共用のディレクトリには置かなくなった、という経緯のためです。 この移行の結果、/usr/doc/copyright はとりあえずほとんど空に近い状態になり、ライセンスのみが置かれていますので、"copyright" から "licenses" に名称を変更しました。

ディレクトリ名称が 『共用ライセンス (common-licenses)』 であって単に 『ライセンス (licenses)』ではないのは、単に "licenses" としておいた場合には「ほげふがライセンスがライセンスディレクトリに収録されていない」というバグレポートを受け取る羽目になることがほとんど確実だからです。 ここに置かれるのはライセンス全部、という訳ではなく少数のよく使われているもののみです。 /usr/share/doc/common-licenses でもいいのですが、ちょっと長すぎるのと、GPL は結局のところ『ライセンス』であって文書ではないからです。

してください。

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

設定例など

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

Changelog ファイル

Debian 由来のものでないパッケージには、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.gzlynx -dump -nolist で作成すべきです。上流の changelog ファイルがここで書いている命名規則に沿っていない場合での、ファイル名を変更する、あるいはシンボリックリンクを使うなどの処置はパッケージ開発者の裁量に任せます。

これらすべてのファイルは、はじめは小さくとも時間と共に大きくなるため、 gzip -9 を使って圧縮してインストールすべきです。

上流の開発者と Debian メンテナが同一人物であるため Debian changelog と元々の changelog が一つの changelog となっている場合は、 changelog は /usr/share/doc/package/changelog.gz; にインストールしてください。上流に別の原作者がいるけれども元々の changelog がない場合にも、Debian の changelog は changelog.Debian.gz のままにしてください。