%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

Richard Braakman dark@xs4all.nl

Philip Hands phil@hands.com

Julian GilbeyJ.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 ディストリビューションとして配布できないと判断されます。 一方、すべきであるまたは推奨されたガイドライン への不適合は通常はバグと見なされますが、ディストリビューションと して配布不適合とまではされません。してもよいまたは オプションとしてとなっているガイドラインは本当にオプションであり、ガイドラインに従うかどうかはメンテナの判断に任されています。

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

RFC 2119 参照。

このマニュアルでは、パッケージの作成、インストール、および削除の手順に関する技術的側面については扱いません。 その種の情報は Debian パッケージングマニュアルDebian システム管理者マニュアルに載っています。 このマニュアル中の脚注は単に説明のためのものであり、Debian ポリシーの一部ではないことに注意してください。

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

このマニュアルに載っている情報の多くは、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 には非常に数多くの(2600 個以上の) パッケージが含まれますので、取り扱いを簡略化するためパッケージは セクションプライオリティ によって分類されています。

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

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

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

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

このマニュアルで示されている全てのポリシー要求に適合しているべきです。

contrib セクション

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

「contrib」に含められるようなパッケージの例としては

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

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

non-free セクション

「non-free」には DFSG に準拠していないパッケージが収録されます。

「non-free」に収録された全てのパッケージは国境を越えて電子的に配布可能でなければいけません。

non-us サーバ

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

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

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

全てのパッケージは、その著作権や配布ライセンスの無修正のコピーを含める形で配布されなければなりません。

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

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

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

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

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

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

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

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

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

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

サブセクション

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

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

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

プライオリティ

それぞれのパッケージにはあるプライオリティ (優先度) 評価をもつべきです。これはパッケージの control 情報 に含まれています。この情報は 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 オプションを使いましょう。

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

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

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

必要な質問はすべてほとんどいつでも post-installation スクリプトからに限られるべきです。 そしてもしパッケージのインストールが失敗して postinstabort-upgradeabort-remove、あるいは abort-deconfigure を引数として呼ばれたときには不必要な質問をしないよう、条件式によってくくられているべきです。

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

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

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

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

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

ソースパッケージの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にリストアップされています。

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

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

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

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

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

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

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

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

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

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

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 を使うように移植されるべきです。

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

インストールされるファイルやディレクトリの配置はすべて Linux File system Hierarchy Standard (FHS) に従わなければなりません。 この文書の最新版は本マニュアルと一緒に配布されていますし、 にもあります。

Debian ディストリビューションで現在配布しているのは、草稿段階にある FHS 2.1 です。 これは、現在リリースされているバージョン 2.0 から次期リリース予定のバージョン 2.1 の間で、 いくつかの重要な箇所が変更されているためです。

以下の標準に対する質問はdebian-develに送るか、 もしくは FHS の責任者である Daniel Quinlan quinlan@pathname.com に問い合わせて下さい。

サイト毎のプログラム

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

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

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

/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 project で共通的に割り当てられ、すべての 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' に割り当てられています。

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

リンクの取り扱い

/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 とすればネームサーバの設定の再読み込みを行うことができます。

#!/bin/sh # # Original version by Robert Leslie # <rob@mars.org>, edited by iwj and cs test -x /usr/sbin/named || exit 0 case "$1" in start) echo -n "Starting domain name service: named" start-stop-daemon --start --quiet --exec /usr/sbin/named 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 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

あなたの/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.txt または手近のミラーサイトに置かれています。また、この 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.txt または手近のミラーサイトの、現在の 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 クライアントが私たちの設定が同じ 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 ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) CFLAGS += -g endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL += -s endif

コンパイルオプションに最も適したものを選ぶのはメンテナの判断に任せています。 ある種のバイナリ (たとえば計算量の多いプログラム) にはそれなりのフラグ (-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 です。 (soname は共有ライブラリの共有オブジェクト名です。 これはプログラムの作成時とダイナミックリンカがプログラムを実行する際に一致させなければならないもので、通常はライブラリのメジャーバージョン番号です)

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

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

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

同じソースツリーから複数の共有ライブラリをを構築する場合、 それらをまとめて一つの共有ライブラリパッケージにすることができます。 そのときにはこの集合ライブラリの複数のバージョンをインストールした場合にファイル名の衝突が起きないように、 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 スクリプト中にも見られます) 。echo -n の動作は規定されてはいますが、 規定への準拠は POSIX では必須ではないため、ここで明示的に追加します。 また、噂では 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 がパッケージをアップグレードする際に毎回ファイルを上書きするかどうか問い合わせてくるようになり、頭を掻きむしることになります。

設定ファイルの共用

conflict していると宣言しているパッケージ間以外では、同じ名前のファイルを conffile として指定することは許されていません。

メンテナスクリプトは、それ自身が収録されたパッケージを含む いかなるパッケージの 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- または postinst スクリプト等で割り当てられた 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 でもこの処理が行われています。

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へ設定した場所へのシンボリックリンクでも良いでしょう。

メール配送エージェント (MTA)

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

FHS に記載の通り、メールスプールは /var/spool/mail であり、メールを送るインターフェースプログラムは /usr/sbin/sendmail です。メールスプールは基本システムの 一部で、 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 プログラムは FHS に規定されているとおり /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 ウィンドウシステムのメジャー リリースの際にここに書かれていることは多分大きく変更されます。

これは通常期待されることより強い条件です。これにより、例えば vim-tty のようなパッケージは standard プライオリティに 上げるならパッケージング可能になります。また、mtools の X クライアントは別のパッケージに分離でき、そのパッケージを optional とできます。

これは xlib6g と xfree86-common を standard から optional プライオリティに移すための布石です。もし Xlib に依存するパッケージのすべてが standard から optional 以下のプライオリティに移せるなら (Xlib にリンクしないものは standard に残します) 上記の移行が行えるからです。但し、 これはパッケージメンテナとアーカイヴメンテナの考えるべきことで、 policy の管轄ではありません。

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

原則の解説: 仮想パッケージリストにある xserver 仮想パッケージの使用法に関する現在の試行を実装し、ポリシーとしての実際の条項を提供します。 端的に言って、ディスプレイと入力ハードウェアに直接、または別のサブシステム経由 (GGI 等) でインターフェースする X サーバは xserver 仮想パッケージを提供すべきです。 注意次の X ウィンドウシステムのメジャーリリースの際にここに書かれていることは多分大きく変更されます。

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 レジストリ名でフォントを収録してはいけません。

アプリケーションデフォルトファイルは /usr/X11R6/lib/X11/app-defaults/ にインストールしなければいけません。

注意: これは近々変更予定です

これらは conffile であるとの属性を設定したり、そのほか設定ファイルとしての扱いを行うべきではありません。 プログラムの X リソースの設定は、/etc/X11/Xresources/ にパッケージと同じ名前のファイルを用意することによって行えます。 このファイルは conffile として登録しなければいけません。 重要 /etc/X11/Xresources/ ディレクトリにファ イルをインストールするパッケージは xbase (<<3.3.2.3a-2); へのコンフリクトを宣言し てください。これがなされていないと、パッケージのインストールの際に既存のシステム管理者の設定した /etc/X11/Xresources の中のファイルを壊す可能性があります。

原則の解説: /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 など)を入れるのは通常よい考えです。 ただ、まぁ当り前のことですが、パッケージの作成やインストール方法について書かれたものを含める必要はありません。

文書の管理

以前の 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 形式のものを /usr/share/doc/package、 およびそのサブディレクトリにインストールしてください。

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

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

著作権関連情報

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

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

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

原則の解説: 元が HTML 形式だからといって、上流の changelog を参照するのに二カ所を見なければならないようにすべきではありません。

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

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