%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 バージョン &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 (オプションとしての類)に相当しています。

[1] 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 アーカイヴ

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

Debian プロジェクトはフリーなオペレーティングシステムの構築を 目指して努力を重ねていますが、私たちが利用可能にしたい と思う全てのパッケージが私たちが言うところのフリー(詳しくは 以下の「Debian フリーソフトウェアガイドライン」をご覧下さい)である、 あるいは制限なしに輸出入ができるとは限りません。そこで、 Debian アーカイヴは mainnon-freecontribnon-US/main, non-US/non-free, と non-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ファイルのファイル名の一部であり、 制御フィールド情報に含まれます。

パッケージのメンテナ

全てのパッケージには一時に一人のメンテナが存在するようにすべ きです。この人物は、パッケージに含まれるソフトウェアのライセ ンスがそのパッケージが含まれるディストリビューションのポリシ ーに準拠していることに責任を持ちます。

メンテナは制御フィールドのMaintainer欄に、 そのパッケージの Debian メンテナの正しい名前と 利用可能な電子メールアドレスと共に指定されていなければなりません。 もしその人がいくつかのパッケージを管理している場合、 彼/彼女は彼らの名前と電子メールアドレスを異なる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を使うときは &045;&045;quietオプションを使いましょう。

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

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

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

必要な質問はすべてほとんどいつでもインストール後スクリプト に限られるべきです。そしてもしパッケージのインストールが 失敗して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ファイルを変 更しましょう。こうすることでユーザーによるパッケージの再構成 が可能となります。あなたがconfibureを行い、 Makefileを変更すれば、だれもそのあとでパッケー ジの再構成ができなくなってしまいます。そういったことはしない ようにして下さい。

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

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

debian/copyrightと同じファイルが /usr/share/doc/パッケージ名/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パッケージは、 mkdir -p /usr/local/lib/emacs/site-lisp || true postinst rmdir /usr/local/lib/emacs/site-lisp && \ rmdir /usr/local/lib/emacs || \ true prermに入れることになるでしょう。

あるパッケージ用にローカルな追加をするために /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 &045;&045;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

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

start, stop, restart, force-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 としてマークし、メン テナスクリプト(参照)の中で適切に扱 うことです。(ローカルシステムの管理者が、自分達のシステム にあわせたスクリプトの変更ができるようにするために重要です なことです。例えば、パッケージを削除すること無くサービスを 停止するとか、サービス開始時に特殊なコマンドラインオプショ ンを指定したりする場合です。さらに、パッケージのアップグレー ドに際してsの変更が失われないようにしなくてはなりません。)

実例

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 &045;&045;start &045;&045;quiet lpd echo "." 一つ以上のデーモンを起動するときは次のようにします: echo -n "Starting remote file system services:" echo -n " nfsd"; start-stop-daemon &045;&045;start &045;&045;quiet nfsd echo -n " mountd"; start-stop-daemon &045;&045;start &045;&045;quiet mountd echo -n " ugidd"; start-stop-daemon &045;&045;start &045;&045;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 ディストリビューションのプログラムは以下のガイドラインに 従わなければなりません。

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

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

Delete

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

Control+H

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

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

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

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

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

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

Linux コンソールは `<&045;&045;' は 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 はカーソルの下の文字を消すようにします。

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

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

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

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

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

環境変数

プログラムは妥当な結果を得るために特定の環境変数の設定に依存す るものであってはいけません。これはこのような環境変数はシステム 全体に影響を及ぼす /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 など) の方が実行時 の効率が上がるでしょうし、そういうときには自由にそのようなフ ラグを使ってもかまいません。的確な判断を行ってください。漠然 とした考えでフラグを設定しないでください。そうする理由がある ときのみに限ってください。どのコンパイルオプションが適切かに ついての上流の作者の考えを変更するのは自由です &045;&045; しばしば私たちの環境では適さないものが使われていますので。

ライブラリ

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

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

インストールされる共有ライブラリは以下のように strip されて いるべきです。 strip &045;&045;strip-unneeded <your-lib> (このオプション `&045;&045;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 Packaging Manual の指示に従うべきで、このライブラリを使う パッケージのための依存関係の詳細を記載した 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 &045;&045;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.dir, fonts.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/ilb/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' 形式のマニュアルをインストールしては いけません。

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

特定のプログラム、ユーティリティ、関数や設定ファイルでマニュア ルが存在せず、debuan-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/manです) からの相対参照とすべきです。

Info 形式の文書

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

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

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

prerm スクリプト中では、以下のようにしてエントリを削除するべきです。 install-info &045;&045;quiet &045;&045;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 のままにしてください。