入り口に戻る

原文はこちら
原文の魚拓はこちら

dbus-broker(1) — Arch manual pages(日本語訳)

名前

dbus-broker - D-Bus メッセージ・ブローカーである。(D-Bus メッセージを仲介するアプリケーションである。)

書式

dbus-broker [ OPTIONS ]
dbus-broker --version
dbus-broker --help

説明

dbus-broker は、D-Bus メッセージ・バス仕様[1]の実装の1つである。各インスタンスは単一の、独立した(unique)メッセージ・バスを提供し、クライアントはこれに接続したり、これを通じてメッセージを送信したりすることができる。このブローカーは、D-Bus 仕様に基いて、メッセージの中継処理、アクセス制御、(シグナル等の)購読処理(subscription)、及びバスの制御を行う。

dbus-broker は「純粋な」(pure)実装であり、メッセージの中継処理しか実装していない。dbus-broker は自身を制御するプロセスを必要としており、このプロセスがバスの設定と全ての外部通信を実行する。dbus-broker-launch(1) は、そのようなコントローラーの1つであり、D-Bus の参考実装である dbus-daemon(1) との完全な互換性を持つよう狙って開発されている。メッセージ・バスを起動する方法については dbus-broker-launch(1) を見よ。

このマニュアル・ページは、dbus-broker とそのコントローラー(例えば dbus-broker-launch(1))との間のインターフェイスについても記述している。

オプション

以下のコマンド・ライン・オプションを使用することができる。ここに挙げられていないオプションを渡した場合、このブローカーは起動を拒否し、エラーで終了する。

-h, --help
使用方法を表示して直ちに終了する。
--version
ビルドのバージョン(build-version)を表示して直ちに終了する。
--audit
Linux の監査サブシステムへログを記録する機能を有効にする。監査機能がコンパイル時に組み込まれていなければ何も行わない。デフォルトでは無効である。
--controller=FD
指定された番号のファイル記述子を親プロセスから継承して制御用ソケットとして使用する。コントローラーの節を参照。このオプションの指定は必須である。
--log FD
指定された番号のファイル記述子を親プロセスから継承し、これを使ってシステム・ログにアクセスする。ログ収集の節を参照。デフォルトではログ収集は行わない。
--machine-id=ID
このブローカーがインターフェイス org.freedesktop.DBus を介して弘報することになるマシン ID を設定する。このオプションの指定は必須であり、通常は /etc/machine-id から得たものを使用する。
--max-bytes=BYTES
このブローカーにおいて各ユーザが割り当てを受けられるバイト数の最大値。デフォルトは 16 MiB。
--max-fds=FDS
このブローカーにて各ユーザが割り当てを受けられるファイル記述子の個数の最大値。デフォルトは 64。
--max-matches=MATCHES
このブローカーにて各ユーザが割り当てを受けられるマッチ規則の個数の最大値。デフォルトは 16k。
--max-objects=OBJECTS
このブローカーにて各ユーザが割り当てを受けられる資源(名前、ピア(peer)、未送信のリプライ(返答)など)の合計数の最大値。デフォルトは 16k。

コントローラー(controller)

dbus-broker の全てのインスタンスは、unix(7) ソケット1つを自身の親プロセスから引き継ぐ。このソケットはオプション --controller を使って必ず指定しなければならない。ブローカーはこのソケットを使って自身の親プロセス(あるいはこのソケットの反対側を所有する者、即ち「コントローラー」(The Controller))から制御コマンドを受け取る。このソケットは通常の D-Bus P2P 通信を用いる。このソケットで提供されるインターフェイスについては API の節で述べる。

初期状態では、ブローカーのインスタンスはアイドル状態である。別の言い方をすると、ブローカーを fork して exec した直後は、ブローカーの「管理すべきバス・ソケット」のリストは空であり、クライアントがブローカーに接続する術は無いということである。コントローラーは、コントローラー・インターフェイスを使って、待ち受けソケット(listener socket)を作成し、バス・ポリシーを指定し、アクティベート可能な名前を作成し、バス・イベントに対応しなければならない。

dbus-broker プロセスは、コマンド・ラインもしくはコントローラー・インターフェイスを通じて渡されたものを除き、外部の資源には一切アクセスしない。すなわち、このブローカーは、ファイル・システムへのアクセス、nss(5) の呼び出し、外部プロセスとの通信を一切行わない。それどころか、このブローカーは、コントローラーから渡されたソケット以外には、いかなる資源にもアクセスしない。これは実装によって保証されていることである。これは同時に、外部資源の獲得や外部通信が必要な場合、コントローラーがブローカーのためにそれらを全て実行する必要があるということをも意味する。

ログ収集

コマンド・ライン・オプション「--log」を使ってログ収集用の FD (ファイル記述子)を指定した場合、ブローカーはこの FD を通じて情報を記録することになる。利用できるログは2種類存在する。

1.
指定した FD が unix(7) SOCK_STREAM ソケットである場合、情報は人間にも読みやすい、行を単位とするデータで記録される。
2.
指定した FD が unix(7) SOCK_DGRAM ソケットである場合、情報は、鍵/値の対を単位とする註釈付きデータ・ブロックで記録される。この形式は、systemd-journal で使用される形式と互換性がある(但し systemd に依存しているわけではない)。この鍵/値の対を単位とするログ・データは、ストリームに基く(訳註:行を単位とする)ログ・データよりもはるかに詳細である。個別の鍵を用いて多くのメタデータが提供されるため、記録されたデータの正確な追跡や解釈が可能である。

ブローカーには、データを記録する際の厳格な決まりがある。ブローカーは、起動時と終了時に1つづつ、自身の設定と環境に関する情報の入ったメッセージを記録する。実行中には、ブローカーは予期せぬ状況が起きた場合にしかログを取らない。すなわち、ブローカーが実行時にログを取ったメッセージは全て、不具合のあるクライアントが引き起こしたものである。システムが適切に設定されていれば、実行時のログ・メッセージは一切発生しない。

ブローカーがログを取るのは次の場合である。

1.
起動時と終了時、ブローカーは、自身のコントローラー、自身の環境、及び自身の設定に関するメタデータの入った短いメッセージを1つ記録する。
2.
クライアント・リクエストがポリシーによって拒否される度にメッセージを1つ記録する。このメッセージには、影響を受けるクライアントとポリシーに関する情報も含まれる。
3.
クライアントが自身に割り当てられた資源量を超過する度にメッセージを1つ記録する。このメッセージには、同クライアントの情報が含まれる。

API

ブローカーは、以下に挙げる各ノードにおいて、それぞれ下記のインターフェイスを実装する。コントローラーはいつでもこれらのインターフェイスを呼び出すことができる。コントローラーの接続は信頼できるものと見做される。資源の勘定やアクセス制御は行わない。

コントローラー自身も、ブローカーが使用するインターフェイスを実装する必要がある。コントローラー側のインターフェイスの一覧は後の節で述べる。

node /org/bus1/DBus/Broker {
interface org.bus1.DBus.Broker {

#ユーザ ID が @uid のユーザで、アクティベート可能な名前 @name を新たに作成する。

#この名前をコントローラーは @path で公開することになる。

#この経路(@path)は「/org/bus1/DBus/Name/%」という型に合うものでなければならない。

method AddName(o path, s name, u uid) -> ()

#このバスに待ち受けソケット(listener socket)を1つ追加する。

#この待ち受けソケットはすでに待ち受けモード(listening mode)になっていなければならず、@socket で指定しなければならない。

#この呼び出しが返ると直ちに、このソケットにて、届いたクライアントの接続要求に対する処理が始まる。

#このリスナーは、コントローラーが @path で公開する。

#この経路(@path)は「/org/bus1/DBus/Listener/%」という型に合うものでなければならない。

#このソケットを通じて接続するクライント全てに対するポリシーは @policy で指定する。

#詳細は org.bus1.DBus.Listener.SetPolicy() を見よ。

method AddListener(o path, h socket, v policy) -> ()

#このシグナルは、org.freedesktop.DBus.UpdateActivationEnvironment() メソッドの実行を求めるクライアント・リクエストによって引き起こされる。

signal SetActivationEnvironment(a{ss} environment)
}
}
node /org/bus1/DBus/Listener/% {
interface org.bus1.DBus.Listener {

#このリスナー(待ち受けソケット)を解放する。

#このリスナーはブローカーによって直ちに削除され、以後、このリスナーで接続を受け付けることはなくなる。

#このリスナーを通して接続しているクライアントは全て強制的に接続を切断される。

method Release() -> ()

#この待ち受けソケットに対するポリシーを @policy に変更する。

#ポリシーの構文は、今はまだ変更される可能性があるものであり、不安定である。

method SetPolicy(v policy) -> ()
}
}
node /org/bus1/DBus/Name/% {
interface org.bus1.DBus.Name {

#この「アクティベート可能な名前」を解放する。

#この名前は、このメソッドの直接の効果としてブローカーによって直ちに削除される。

#クライントは依然としてこの名前を有効に獲得することができるけれども、この名前ではアクティベーション機能は利用できなくなる。

method Release() -> ()

#この名前の「アクティベーションの状態」をリセットする。

#未処理のアクティベーション・リクエストは取り消される。

#このメソッドの呼び出しの際には続き番号を渡す必要がある。

#この続き番号は、この名前に関する最後のアクティベーション・イベントで受信したものでなければならない。

#別の続き番号を用いた呼び出しは、何も通知せずに無視され、無効なものと見做される。

#org.bus1.DBus.Name.Error の文字列も指定する。

#この文字列は、アクティベーションがリセットされた理由に関するヒントを表す。

#エラーの文字列の一覧は以下に記載する。

method Reset(t serial, s error) -> ()

#アクティベーションのリクエストが失敗した。このエラーと同時に起きる非アクティベーションのリクエストがすでに進行中である。

error org.bus1.DBus.Name.Error.DestructiveTransaction

#アクティベーションのリクエストが失敗した。不明なユニットである。

error org.bus1.DBus.Name.Error.UnknownUnit

#アクティベーションのリクエストに失敗した。ユニットがマスクされている。(訳註:〜.service という経路が /dev/null へのシンボリックリンクになっている状態。)

error org.bus1.DBus.Name.Error.MaskedUnit

#アクティベーションのリクエストに失敗した。ユニットが不正(invalid)である。

error org.bus1.DBus.Name.Error.InvalidUnit

#ユニットのアクティベーション・ジョブは成功したが、その後で同ユニットが蹉跌した。

error org.bus1.DBus.Name.Error.UnitFailure

#起動ジョブの形式は有効(valid)であったが、同ジョブはアクティベーションの途中で蹉跌した。

error org.bus1.DBus.Name.Error.StartupFailure

#起動ジョブの形式は有効(valid)であったが、同ジョブはアクティベーションの途中でスキップ(skip)された。

error org.bus1.DBus.Name.Error.StartupSkipped

#アクティベーションのリクエストが取り消され、バス名は解放された。

error org.bus1.DBus.Name.Error.NameReleased

#このシグナルは、クライアントがこの名前のアクティベーションを要求する度に送信される。

#重複するアクティベーション・リクエストは、ブローカーによって1つに纏められる。

#コントローラーは、Reset() メソッドを使って未処理のリクエストを取り消すことができる。

#ブローカーは、このイベントと一緒に続き番号を送信する。

#この続き番号は、アクティベーション・リクエストを表しており、Reset() のようなメソッドで同アクティベーション・リクエストに対処する際に使用しなければならないものである。

#この続き番号は、全てのイベントで異なっており(unique)、再利用されることはない。

#続き番号 0 は、決して送信されず、不正な値(invalid)と見做される。

signal Activate(t serial)
}
}

コントローラー自身も、以下に挙げるノードにおいて、下記のインターフェイスを実装する必要がある。このインターフェイスは、D-Bus 仕様で定義されているドライバ・インターフェイスの一部を実装するために、ブローカーによって呼び出される。

ブローカーが実行する全てのメソッド・コールは常にまるまる非同期であることに注意。すなわち、どれだけリクエストの処理に時間が掛かっても、ブローカーは依然として問題なく動作している状態であり、同者はさらなるリクエストをコントローラーへ送信することすら可能であるということである。

コントローラーは、このようなメソッド・コールをブロッキング(blocking)する形で実装してもよい。しかしながら、(どのような手段によるにせよ)ブロッキングを伴い且つブローカーへと戻っていくような再帰的な呼び出しを実行しないようにするのは、コントローラーの責任である。

node /org/bus1/DBus/Controller {
interface org.bus1.DBus.Controller {

#この関数は、org.freedesktop.DBus.ReloadConfig() メソッドの実行を求めるクライアント・リクエストの1つ1つに対して呼び出される。

method ReloadConfig() -> ()
}
}

関連項目

dbus-broker-launch(1) dbus-daemon(1)

注意

[1]
D-Bus 仕様: https://dbus.freedesktop.org/doc/dbus-specification.html

Package information:

Package name:
core/dbus-broker
Version:
37-3
Upstream:
https://github.com/bus1/dbus-broker/wiki
Licenses:
Apache-2.0
Manuals:
/listing/core/dbus-broker/

入り口に戻る