この章では、FNS の概要、設定と構成の手順に関する簡単な説明、およびプログラミングの例を示します。熟練の管理者であれば、この章を読むだけで必要なことがすべてわかります。
詳細は、パート V「FNS の管理」の他の章を参照してください。FNS の初期設定と構成の詳細は、『Solaris ネーミングの設定と構成』を参照してください。
フェデレーテッド・ネーミング・サービス (FNS) は、ネーミングとディレクトリ操作のための 1 つの単純なインタフェースのもとに、複数のネームサービスをフェデレートする方法を提供します。FNS によってリンクできるネームサービスには、NIS+、NIS、ファイルベース、DNS、および X.500/LDAP があります。
FNS がサポートするプログラミングインタフェースとそのポリシーは、XFN (X/Open Federated Naming) に述べられています。
FNS は、次の点で有用です。
単一の一貫したネーミングおよびディレクトリインタフェースがクライアントに対して用意されている。これを使用してネーミングおよびディレクトリサービスにアクセスできる。したがって、新しいネーミングおよびディレクトリサービスを追加しても、アプリケーションや既存のサービスに変更を加える必要はない
名前を一貫した方法で作成できる。FNS は、異なる複数のネーミングシステムから一貫した名前を作成する方法を定義する。これにより、アプリケーションは、これらの異なる複数のネーミングシステム内のオブジェクトを一定の方法でアドレス指定できる
共有コンテキストと共有名の使用によって、一貫したネーミングを行うことができる。異なる複数のアプリケーションでこれらの共有名と共有コンテキストを使用すると、作業を重複して行う必要がなくなる
FNS の基本概念として、複合名と複合コンテキストがあります。
複合名とは、複数のネーミングシステムで使用される名前のことをいいます。
複合名は、複数の構成要素の順序付きリストからなります。各構成要素は、単一のネーミングシステムの名前空間からとられた名前です。各構成要素の構文は、個々のネーミングシステムにより異なります。FNS は、複数のネーミングシステムからとられた名前を使用して複合名を作成するときの構文を定義します。複合名は、スラッシュ (/) を構成要素区切り文字として使用して、左から右へ作成されます。
たとえば、複合名 .../doc.com/site/bldg-5.alameda は、...、doc.com、site、bldg-5.alameda という 4 つの構成要素から構成されます。
コンテキストは、次の操作を行います。
名前をオブジェクトに関連付ける (割り当てる)
名前をオブジェクトとして解釈処理する
割り当てを削除する
名前を表示する
名前を変更する
名前付きオブジェクトに属性を関連付ける
名前付きオブジェクトに関連付けられた属性を取り出して更新する
属性を使用してオブジェクトを検索する
コンテキストには、一連の名前とリファレンスの割り当てが含まれます。各リファレンスには、通信の終端またはアドレスのリストが含まれます。フェデレーテッド・ネーミング・システムは、別のネーミングシステムのコンテキストで割り当て中の、あるネーミングシステムのコンテキストによって形成されます。複合名の解釈処理は、その名前全体が解釈処理されるまで、あるネーミングシステム内のコンテキストから、次のネーミングシステム内のコンテキストへと進みます。
名前付きオブジェクトには、属性を適用できます。属性はオプションです。名前付きオブジェクトには、属性を付けないことも、1 つまたは複数の属性を付けることもできます。
各属性は、一意の属性識別子、属性構文、ゼロまたはいくつかの属性値の集合を持ちます。
XFN は、既存の名前付きオブジェクトに関連付けられた属性値を確認、変更するための基本属性インタフェースを定義します。これらのオブジェクトは、コンテキストまたは他の任意のタイプのオブジェクトにできます。コンテキストには、コンテキストによる合成名の構文解析方法を記述する構文属性が関連付けられます。
拡張属性インタフェースには、特定の属性を検索する操作と、オブジェクトとその関連属性を作成する操作があります。
エンタープライズレベルのネームサービスは、あるエンタープライズ内のオブジェクトに名前を付けるために使用されます。FNS は現在、次の 3 つのレベルのネームサービスをサポートしています。
NIS+ は、Solaris 8 リリース環境で推奨されるエンタープライズ規模の情報サービスです。FNS の組識単位は、NIS+ のドメインとサブドメインに対応します。各ドメインとサブドメインごとに 1 つの orgunit コンテキストがあります。
NIS+ のもとで、FNS のコンテキストと属性データは、NIS+ テーブルに格納されます。これらのテーブルは、ctx_dir という名前の NIS+ ディレクトリオブジェクトに格納されます。各 NIS+ ドメインとサブドメインごとに 1 つの ctx_dir ディレクトリオブジェクトがあり、ドメインの groups_dir および org_dir の各ディレクトリオブジェクトと同じレベルにあります。したがって、ディレクトリオブジェクト ctx_dir.sales.doc.com. には、sales.doc.com. ドメインの FNS コンテキストと属性データを格納する FNS テーブルが含まれます。
NIS+ のもとでは、FNS と NIS+ のコマンドを使用して、FNS テーブル内の情報を処理します。これらのテーブルを直接編集したり、UNIX コマンドを使用して処理したりしないでください。
NIS は、Solaris 環境でのエンタープライズ規模の情報サービスです。各エンタープライズは 1 つの NIS ドメインにあたります。1 つの NIS ドメインに対応する 1 つの FNS 組識単位があります。
NIS のもとで、FNS のコンテキストと属性データは NIS マップに格納されます。これらのマップは、NIS サーバー上の /var/yp/domainname ディレクトリに格納されます。NIS では、スーパーユーザーは、FNS コマンドを使用して、FNS マップ内の情報を処理できます。
一定の条件が満たされれば、NIS クライアント (マシン、プロセス、またはユーザー) はすべて、fncreate_fs、fncreate_printer などの FNS コマンドを使用して、クライアント独自のコンテキストを更新できます。これにより、NIS クライアントは、FNS コマンドを使用して、Printer Administrator、CDE カレンダマネージャ、admintool などのアプリケーションを更新できます。
スーパーユーザー以外のユーザーが、FNS コマンドを使用して独自のコンテキストを更新するには、次の条件が必要です。
NIS マスターサーバー上で SKI (Secure Key_management Infrastructure) が使用可能
fnsypd デーモンが、NIS マスターサーバー上で実行されている。このデーモンは、スーパーユーザー特権を持つユーザーが開始する
クライアントユーザーまたはマシンは、独自のコンテキストの更新だけできる
クライアントは、要求された更新を実行するための権限を持っている
SKI は 64 ビットモードをサポートしていません。したがって NIS クライアントは 64 ビットモードでのコンテクストの更新は行うことができません。
「ファイル」とは、通常、マシンの /etc ディレクトリにあるネーミングファイルを指します。これらのマシンベースファイルには、UNIX のユーザーとパスワード情報、ホスト情報、メール別名などが入っています。これらのファイルは、自動マウントマップなどの Solaris 特定のデータもサポートしています。
ファイルベースのネーミングシステムでは、FNS コンテキストと属性データはファイルに格納されます。これらの FNS ファイルは、マシンの /var/fn ディレクトリに格納されます。(/var/fn ディレクトリを各マシンに置く必要はありません。このディレクトリは、NFS ファイルサーバーからエクスポートされます。)
ファイルネーミングシステムでは、FNS コマンドを使用して FNS ファイルの情報を処理します。
FNS は、DNS と X.500 による NIS+ と NIS のフェデレートもサポートします。つまり、エンタープライズレベルの名前空間をグローバル名前空間に接続し、エンタープライズオブジェクトをグローバルな有効範囲でアクセス可能にできるということです。
FNS は現在、次のグローバルネームサービスをサポートしています。
DNS
X.500 (DAP または LDAP を経由)
FNS は、ネーミングポリシーを定義して、ユーザーとアプリケーションが共有名前空間に依存し、それを使用できるようにします。
エンタープライズ内には、組識単位、サイト、ホスト、ユーザー、ファイルとサービスごとの名前空間があり orgunit、site、host、user、fs (ファイルシステムを示す)、および service という名前で呼ばれます。これらの名前空間は、各名前の前に下線 (_) を付けることもできます。たとえば、host と _host は同じものと見なされます。
表 20-1 は、エンタープライズレベルの名前空間に関する FNS ポリシーを要約しています。
表 20-1 FNS ポリシーの要約
コンテキストタイプ |
従属コンテキスト |
親コンテキスト |
---|---|---|
orgunit _orgunit |
site user host fs service |
enterprise root |
site _site |
user host fs service |
enterprise root orgunit |
user _user |
service fs |
enterprise root orgunit |
host _host |
service fs |
enterprise root orgunit |
service _service |
プリンタなどのアプリケーション |
enterprise root orgunit site user host |
fs _fs (ファイルシステム) |
(なし) |
enterprise root orgunit site user host |
FNS orgunit の割り当ては、基本となるネームサービスによって決まります。
NIS+ では、組識単位は NIS+ のドメインまたはサブドメインに対応する。たとえば、NIS+ のルートドメインが doc.com. で、doc.com. のサブドメインが sales だとした場合、FNS 名の org/sales.doc.com. と org/sales は、どちらも NIS+ ドメイン sales.doc.com. に対応する組識単位を指す。(sales.doc.com. の最後のドットは、完全指定 NIS+ 名に必要であることに注意)
NIS では、組識単位は NIS ドメインであり、必ず FNS 名 org// または org/domainname によって識別される。ここで、domainname は、doc.com. などの完全指定ドメイン名を示す。NIS の組識単位名には階層はない
ファイルベースのネーミングシステムで、組識単位は、必ず FNS 名 org// によって識別されるシステムである
組識単位名に対応して命名されるオブジェクトのタイプは、user、host、service、fs、site です。次に例を示します。
org/sales/site/conference1.bldg-6 は、組識単位 sales に関連するサイトの 6 号ビルにある会議室 conference1 を指定する。この例では、org/sales が sales.doc.com. に対応する場合、このオブジェクトを org/sales.doc.com./site/conference1.bldg-6 と指定することもできる (sales.doc.com. の最後のドットに注意)
org/finance/user/mjones は、組識単位 finance のユーザー mjones を指定する
org/finance/host/inmail は、組識単位 finance に属するマシン inmail を指定する
org/accounts.finance/fs/pub/reports/FY92-124 は、組識単位 accounts.finance に属するファイル pub/reports/FY92-124 を指定する
org/accounts.finance/service/calendar は、組識単位 accounts.finance のカレンダサービスを指定する。これは、組識単位のミーティングのスケジュールを管理する
サイト名は、必要に応じて作成されます。サイト名に対応して指定されるオブジェクトのタイプは、user、host、service、fs です。次に例を示します。
site/alameda/user/mjones は、サイト alameda にあるユーザー mjones を指定する
site/alameda/host/sirius は、サイト alameda にあるマシン sirius を指定する
site/alameda/service/printer/Sparc-2 は、サイト alameda にあるプリンタ Sparc-2 を指定する
site/alameda/fs/usr/dist は、サイト alameda で使用可能なファイルディレクトリ usr/dist を指定する
ユーザー名は、NIS+ の対応する passwd テーブル、NIS の passwd マップ、またはファイルの /etc/passwd ファイルにある名前に対応します。ユーザーのファイルコンテキストは、そのユーザーの passwd エントリから獲得されます。
ユーザー名に対応して指定されるオブジェクトのタイプは、service と fs です。次に例を示します。
user/chou/service/fax は、ユーザー chou のファックスサービスを指定する
user/esperanza/fs/projects/conf96.doc は、ユーザー esperanza のファイルシステムの projects サブディレクトリにあるファイル、conf96.doc を指定する
ホスト名は、NIS+ の対応する hosts、NIS の hosts マップ、またはファイルの /etc/hosts ファイルにある名前に対応します。ホストのファイルコンテキストは、ホストによってエクスポートされるファイルシステムに対応します。
ホスト名に対応して指定されるオブジェクトのタイプは、service と fs です。次に例を示します。
host/smtp-1/service/mailbox は、マシン smtp-1 に関連するメールボックスサービスを指定する
host/deneb/fs/etc/.cshrc は、ホスト deneb 上の /etc ディレクトリにあるファイル .cshrc を指定する
サービス名は、サービスアプリケーションに対応し、それによって決定されます。サービスコンテキストは、組識、ユーザー、ホスト、またはサイトコンテキストに対応して指定する必要があります。次に例を示します。
host/deneb/service/printer は、マシン deneb に関連するプリンタサービスを指定する
host/deneb/service/printer/Sparc-2 は、マシン deneb に関連するプリンタを指定する
user/charlie/service/calendar は、ユーザー charlie のカレンダサービスを指定する
site/conf_pine.bldg-7.alameda/service/calendar は、Alameda サイトの 7 号ビルにある conf_pine 会議室のカレンダサービスを指定する
ファイルシステム名は、ファイル名に対応します。次に例を示します。
user/prasad/fs/projects/96draft.doc は、ユーザー prasad の projects ディレクトリにあるファイル 96draft.doc を指定する
各自のネームサービスで FNS を開始するには、fncreate コマンドを実行します。
fncreate コマンドは、FNS コンテキストが作成されるネームサービス (NIS+、NIS、ファイルベースなど) を認識します。特定のネームサービスを指定するには、下記の 「デフォルト以外のネームサービスの指定」で説明する、fnselect コマンドを実行する必要があります。
デフォルトでは次のようになります。
fncreate を NIS+ クライアントまたはサーバーであるマシン上で実行すると、FNS 名前空間が NIS+ に設定されます。FNS NIS+ マスターサーバーとして別のマシンを指定する必要がある場合は、『Solaris ネーミングの設定と構成』を参照してください。
マシンが NIS クライアントの場合、名前空間は NIS で設定されます。
マシンが上記のどちらでもない場合、名前空間はマシンで /var/fn ディレクトリに設定されます。基本となるネームサービスがファイルベースの場合、各マシンで fncreate を実行することによって /var/fn を作成する点は共通です。ただし、一方のマシンで /var/fn を作成し、NFS によってそれをエクスポートして、別のクライアントによってマウントできます。
fnselect コマンドを使用すると、デフォルト以外のターゲットネームサービスを明確に指定することもできます。たとえば、次のコマンドは、ターゲットネームサービスに NIS を選択します。
# fnselect nis |
デフォルトポリシー、または fnselect によって明示的にネームサービスを指定したら、次のコマンドを使用して、FNS 名前空間を作成できます。
# fncreate -t org org// |
このコマンドは、対応するネームサービス内のユーザーとホストに必要なすべてのコンテキストを作成します。
各自のエンタープライズレベルの基本ネームサービスが NIS+ の場合は、次の点を考慮に入れてください。
上記のコマンド構文は、ルート NIS+ ドメインの FNS 名前空間を作成します。ルート以外のドメインを指定するには、次のように、2 つのスラッシュの間にドメイン名を追加します。
# fncreate -t org org/sales.doc.com./ |
完全指定の sales.doc.com. の最後のドットに注意してください。
fncreate コマンドは、ctx_dir ディレクトリに NIS+ のテーブルとディレクトリを作成します。ctx_dir ディレクトリオブジェクトは、ドメインの NIS+ の groups_dir と org_dir ディレクトリオブジェクトと同じレベルにあります。
大きなドメインでは、NIS+ サーバー上で必要な追加スペースが多く、大きなインストール環境では、FNS と標準 NIS+ の各テーブルに個別のサーバーを使用することによって、パフォーマンスを改善できる場合があります。FNS と NIS+ に個別のサーバーを使用する方法については、『Solaris ネーミングの設定と構成』を参照してください。
大きいドメイン、または重要なドメインでは、FNS サービスを複製する必要があります。FNS サービスの複製方法については、『Solaris ネーミングの設定と構成』を参照してください。
fncreate などの FNS コマンドを実行するユーザーは、必要な NIS+ 資格を持つことが前提とされます。
環境変数 NIS_GROUP
は、fncreate によって作成された NIS+ オブジェクトのグループ所有者を指定します。NIS+ オブジェクトの管理を容易にするために、NIS_GROUP
には、そのドメインの FNS 管理を担当する NIS+ グループ名を設定してから、fncreate などの FNS コマンドを実行する必要があります。
デフォルトのアクセス制御権を含む NIS+ 関連属性は、コンテキストの作成後、NIS+ の管理ツールやインタフェースを使用して変更できます。FNS 複合名に対応する NIS+ オブジェクト名は、後で説明する fnlookup および fnlist によって獲得できます。
fncreate コマンドは、FNS マップの NIS マスターサーバーとして機能する NIS システム上のスーパーユーザーが実行してください。
FNS によって使用される NIS マップは、/var/yp/domainname に保存されています。
FNS NIS マスターサーバー上のスーパーユーザーだけが、FNS コマンドを使用して FNS 情報を変更できます。
fncreate に -t org オプションを付けて FNS 名前空間を作成する場合は、/var が存在するファイルシステムを所有するマシン上のスーパーユーザーが、コマンドを実行してください。FNS が使用するファイルは、/var/fn ディレクトリに格納されています。
ユーザーのコンテキストを作成すれば、ユーザーは、各自の UNIX 資格に基いて、各自のコンテキストを変更できます。
ファイルシステム /var/fn は、エクスポートすることにより、別のシステムでマウントして、FNS 名前空間にアクセスできます。
名前空間を設定したら、次のコマンドを使用して表示できます。
fnlist - コンテキストの内容を表示 (「コンテキストの内容の表示」を参照)
fnlookup - 複合名の割り当てを表示 ( 「複合名の割り当ての表示」を参照)
fnattr - 複合名の属性を表示 (「複合名の属性の表示」を参照)
次の fnlist コマンドは、name のコンテキスト名とリファレンスの割り当てを表示します。
fnlist [-lvA] [name] |
オプション |
説明 |
---|---|
name |
複合名。name のコンテキストでの名前の割り当てを表示する |
-v |
詳細。割り当ての詳細を表示する |
-l |
指定のコンテキストで割り当てられた名前の割り当ても表示する |
-A |
fnlist で、権限のあるサーバーからの情報を強制的に獲得する。NIS と NIS+ で、このサーバーはドメインのマスターサーバーになる。-A オプションは、基本ネームサービスがファイルベースの場合、無効である |
次に例を示します。
初期コンテキストの名前をリスト表示する場合
% fnlist |
現在の組識単位内のユーザーすべての詳細をリスト表示する場合
% fnlist -v user |
ユーザー pug の service コンテキストの内容をリスト表示する場合
% fnlist user/pug/service |
権限のあるサーバーからの名前と割り当てをリスト表示する場合
% fnlist -l -A |
fnlookup コマンドは、指定の複合名の割り当てを表示します。
fnlookup [-vAL] [name] |
オプション |
説明 |
---|---|
name |
コンテキスト名。name の割り当てと XFN リンクを表示する |
-v |
詳細。割り当てをより詳しく表示する |
-L |
名前に割り当てられている XFN リンクを表示する |
-A |
fnlist で、権限のあるサーバーからの情報を強制的に獲得する。NIS と NIS+ で、これは、ドメインのマスターサーバーになる。-A オプションは、基本ネームサービスがファイルベースの場合、無効である |
たとえば、user/ana/service/printer の割り当てを表示するには、次のコマンドを実行します。
# fnlookup user/ana/service/printer |
fnattr コマンドは、指定の複合名の属性を表示、更新します。
たとえば、ユーザー ada に関連する属性を検索するには、次のコマンドを実行します。
# fnattr user/ada |
プリンタ laser-9 に関連する属性を検索するには、次のコマンドを実行します。
# fnattr thisorgunit/service/printer/laser-9 |
詳細は、「属性の処理」を参照してください。
fnsearch コマンドは、属性が所定の検索基準を満たす複合名以下で割り当てられたオブジェクト名を表示し、必要に応じてその属性とリファレンスを表示します。
たとえば、realname という属性を持つユーザーとその属性をリスト表示するには、次のコマンドを実行します。
% fnsearch user realname |
値が Ravi Chattha の属性 realname を持つユーザーをリスト表示するには、次のコマンドを実行します。
% fnsearch user "realname == 'Ravi Chattha'" |
fnsearch コマンドは、共通のブール型演算子を使用します。上記の例では、二重引用符と一重引用符、2 つの等号の使用に注意してください。
名前空間を設定したら、次のコマンドを使用して、要素の追加、削除、および変更できます。
fnbind - 複合名に新しいリファレンスを割り当てる (「複合名へのリファレンスの割り当て」を参照)
fnunbind - 割り当てを削除する (「割り当ての削除」を参照)
fncreate - 新しい組識、ユーザー、ホスト、サイト、サービスコンテキストを作成する (「新しいコンテキストの作成」を参照)
fncreate_fs - 新しいファイルシステムコンテキストを作成する (「ファイルコンテキストの作成」を参照)
fncreate_printer - 新しいプリンタコンテキストを作成する (「プリンタコンテキストの作成」を参照)
fndestroy - コンテキストを削除する (「コンテキストの削除」を参照)
fnattr - 属性を表示、作成、変更、削除する (「属性の処理」を参照)
fncopy - あるネームサービスから別のネームサービスへ FNS コンテキストと属性をコピーする (「FNS コンテキストのコピーと変換」を参照)
FNS システム管理は、基本となるネームサービスによって異なります。
「NIS+」では、FNS システム管理タスクは、その権限を持つユーザーだけが実行できます。システム管理特権を付与する通常の方法では、NIS+ グループを作成し、そのドメインに必要な特権をそのグループに割り当てます。これにより、そのグループのメンバーはすべて、システム管理機能を実行できるようになります。
「ファイルベース」のネーミングシステムでは、FNS 管理タスクは、/var/fn ディレクトリへの root アクセス権を持つユーザーが実行しなければなりません。
ユーザーが各自のサブコンテキストを変更できるかどうかは、基本となるネームサービスによって異なります。
「NIS+」では、ユーザーのコンテキストと関連サブコンテキストは、ユーザーが所有します。NIS+ ポリシーでログインした場合、適切な資格と特権を持つユーザーは、fncreate、fnbind、fnunbind などのコマンドを使用して、各自のコンテキストを変更できます。
「NIS」では、ユーザーはどの FNS データも変更できません。NIS マスターサーバーへの root アクセス権を持つユーザーだけが、FNS データを変更できます。
「ファイルベース」のネーミングシステムでは、ユーザーは独自のコンテキストを所有します。標準の UNIX アクセス制御が FNS ファイルに適用されます。
fnbind コマンドは、既存のリファレンス (名前) を新しい複合名に割り当てるために使用されます。
fnbind -r [-s][-v][-L] name [-O|-U] newname reftype addrtype [-c|-x] address |
オプション |
説明 |
---|---|
name |
既存の複合名 |
newname |
新しい割り当ての複合名 |
addrtype |
使用するアドレスのタイプ。onc_cal_str のようにアプリケーション特定 |
address |
使用するアドレスの内容。たとえば、tsvi@altair |
reftype |
使用するリファレンスのタイプ。one_calendar のようにアプリケーション特定 |
-s |
すでに割り当てられている場合でも、newname に割り当てられる。これは、以前の newname の割り当てを置き換える。-s を指定しないと、newname がまだ割り当てられていない場合、fnbind は失敗する |
-v |
newname に割り当てられるリファレンスを表示する |
-L |
oldname を使用して XFN リンクを作成し、それを newname に割り当てる |
-r |
コマンド行引数によって作成されたリファレンスに newname を割り当てる |
-c |
入力された形式で address の内容を格納する。XDR コードは使用しない |
-x |
address を XDR コードに変換しないで、16 進文字列に変換する |
-O |
識別子の形式は FN_ID_ISO_OID_STRING。これは、ASN.1 のドットで区切った整数リスト文字列である |
-U |
識別子の形式は FN_ID_DCE_UUID。これは、文字列形式の DCE UUID である |
次に例を示します。
ユーザー jamal にカレンダ割り当てを追加する場合
# fnbind -r user/jamal/service/calendar onc_calendar onc_cal_str jamal@cygnus |
org//service/Sparc-4 の既存の割り当てを、org//service/printer の割り当てによって置換する場合
# fnbind -s org//service/printer org//service/Sparc-4 |
site/bldg-5/service/printer のリファレンスを user/ando/service/printer にコピーする場合
# fnbind site/bldg-5/service/printer user/ando/service/printer |
シンボリックリンクを使用して、site/bldg-5/service/printer のリファレンスを user/ando/service/printer に割り当てる場合
# fnbind -L site/bldg-5/service/printer user/ando/service/printer |
staff@altair が onc_cal タイプのリファレンスであり、かつタイプ onc_cal_str のアドレスである場合、thisens/service/calendar の名前をアドレス staff@altair に割り当てる場合
# fnbind -r thisens/service/calendar onc_calendar onc_cal_str staff@altair |
コマンド行 address によって作成されたリファレンスとして newname を割り当てる場合
# fnbind -r [-sv] newname [-O|-U] reftype {[-O|-U] addrtype [-c|-x] address} |
fnunbind コマンドは、割り当てを削除するために使用されます。
たとえば、user/jsmith/service/calendar の割り当てを削除するには、次のコマンドを実行します。
# fnunbind user/jsmith/service/calendar |
fncreate コマンドは、コンテキストを作成するために使用されます。
fncreate -t context [-f file] [-o] [-r reference] [-s] [-v] [-D] name |
オプション |
説明 |
---|---|
-t context |
context タイプのコンテキストを作成する。context タイプは、org、hostname、host、username、user、service、fs、site、nsid、generic |
-f file |
入力ファイルを使用して、コンテキストを作成するユーザーとホストを一覧表示する |
-r reference |
リファレンスのタイプ。-r reference オプションは、-t generic とともにしか使用できない |
name |
複合名 |
-o |
name によって識別されるコンテキストだけを作成する |
-s |
既存の割り当てすべてを上書き (置換) する。-s を使用しないと、名前がすでに割り当てられている場合、fncreate は失敗する |
-D |
各コンテキストの作成時に、そのコンテキストと、対応するテーブル、ディレクトリ、ファイルに関する情報を表示する |
-v |
詳細。各テキストの表示時にその情報を表示する |
次に例を示します。
ルート組識のコンテキストとサブコンテキストを作成する場合
# fncreate -t org org// |
ホスト deneb のコンテキストとサブコンテキストを作成する場合
# fncreate -t host host/deneb |
コンテキスト、サービス、ファイルサブコンテキストを作成して、ユーザー sisulu のカレンダ割り当てを追加する場合
# fncreate -t user user/sisulu # fnbind -r user/sisulu onc_calendar onc_cal_str sisulu@deneb |
sales 組識のサイトコンテキストを作成する場合
# fncreate -t site org/sales/site/ |
サイトコンテキストは、ドットで区切られた右から左へという順番の名前によって、階層名前空間をサポートします。これにより、地理上のカバレージ関係によってサイトを区分化できます。たとえば、サイトコンテキスト alameda とサイトサブコンテキスト bldg-6.alameda を作成するには、次のコマンドを実行します。
# fncreate -t site org/sales/site/alameda # fncreate -t site org/sales/site/bldg-6.alameda |
fncreate_fs コマンドは、コマンド行から入力された割り当て記述によって、組識とサイトのファイルコンテキストを作成します。
fncreate_fs [-r] [-v] name [options] [mount] |
fncreate_fs コマンドは、入力ファイルから提供された割り当ての記述によって、組識とサイトのファイルコンテキストを作成します。
fncreate_fs [-r] [-v] -f file name |
オプション |
説明 |
---|---|
name |
ファイルコンテキスト名 |
options |
マウントオプション |
mount |
マウント位置 |
-f file |
入力ファイル |
-v |
詳細。作成中のコンテキストに関する情報を表示 |
-r |
コンテキスト name の割り当てを、入力で指定された割り当てによって置換する |
次に例を示します。
FNS サーバー server4 の /export/data パスに割り当てられた sales 組識に関して、ファイルシステムコンテキスト data を作成する場合
# fncreate_fs org/sales/fs/data server4:/export/data |
2 つの異なるサーバーにマウントされた buyers および buyers/orders という名前の sales 組識に関して、ファイルシステムコンテキストの階層を作成する場合
# fncreate_fs org/sales/fs/buyers server2:/export/buyers # fncreate_fs org/sales/fs/buyers/orders server3:/export/orders |
input_a という名前の入力ファイルによって指定されたサーバーとパスに割り当てられた sales 組識に関して、leads という名前のファイルシステムコンテキストを作成する場合
# fncreate_fs -f input_a org/sales/fs/leads |
(入力ファイル形式については、fncreate_fs(1M) のマニュアルページを参照してください。)
fncreate_printer コマンドは、組識、ユーザー、ホスト、サイトの各コンテキストのプリンタコンテキストを作成します。プリンタコンテキストは、対応する複合名のサービスコンテキストのもとで作成されます。
fncreate_printer [-vs] name printer [prntaddr] |
fncreate_printer [-vs] [-f [file]] name |
オプション |
説明 |
---|---|
name |
プリンタの組識、ホスト、ユーザー、またはサイトの名前 |
printer |
プリンタ名 |
prntaddr |
プリンタアドレス。<addresstype>=<address> という形式をとる |
-f file |
指定の ファイル を、作成するプリンタリストへの入力として使用。入力ファイルは /etc/printers.conf ファイルの形式をとる。プリンタ名 も -f ファイル も指定されていない場合、fncreate_printer は、fncreate_printer がデフォルト入力ファイルとして実行されるマシン上の /etc/printer.conf ファイルを使用する |
-s |
既存のアドレスを、同じアドレスタイプによって置換する |
-v |
詳細。割り当ての詳細を表示する |
次に例を示します。
fncreate_printer が実行されるマシンの /etc/printers.conf ファイルに示されたプリンタに基いて sales 組識のプリンタを作成する場合
# fncreate_printer -s org/sales/ |
マシン altair が、プリンタ Sparc-5 のサーバーであると想定します。ユーザー nguyen に対して、実際に Sparc-5 プリンタである invoices という名前のプリンタを作成する場合、次のように入力します。
# fncreate_printer user/nguyen invoices bsdaddr=altair,Sparc-5 |
プリンタを階層構造で構成することもできます。たとえば、fncreate_printer コマンドは、プリンタ color、color/inkjet、color/Sparc のプリンタコンテキストを作成できます。コンテキストは次のようになります。
org/doc.com/service/printer/color org/doc.com/service/printer/color/inkjet org/doc.com/service/printer/color/Sparc |
上記のコンテキストを作成するには、次のコマンドを実行します。
# fncreate_printer org/doc.com color bsdaddr=colorful,color # fncreate_printer org/doc.com color/inkjet bsdaddr=colorjet,inkjet # fncreate_printer org/doc.com color/Sparc bsdaddr=colorprt,Sparc |
fndestroy コマンドは、空のコンテキストを削除するために使用されます。
たとえば、ユーザー patel の service コンテキストを削除するには、次のコマンドを実行します。
# fndestroy user/patel/service |
fnattr コマンドは、名前に関連する属性の追加、削除、または変更に使用できます。変更は一度に 1 つずつ行うことも、同じコマンド内で何回かバッチ処理することもできます。
fnattr [-l] name
name の属性をリスト表示
fnattr name -a-s -U -O attrib values
属性の追加
fnattr name -m -O -U attrib oldvalue newvalue
属性の変更
fnattr name -d -O | -U [values attrib]
属性の削除
オプション |
説明 |
---|---|
name |
複合名 |
attrib |
属性の識別子 |
values |
1 つまたは複数の属性値 |
oldvalue |
新しい値によって置換される属性値 |
newvalue |
古い値を置換する属性値 |
-a |
属性の追加 |
-d |
属性の削除 |
-l |
属性のリスト表示 |
-m |
属性の変更 |
-s |
指定された属性の新しい値によって、すべての古い属性値を置換する |
-O |
識別子の形式は FN_ID_ISO_OID_STRING。これは、ASN.1 のドットで区切られた整数リスト文字列である |
-U |
識別子の形式は FN_ID_DCE_UUID。これは、文字列形式での DCE UUID である |
次に例を示します。
ユーザー名 rosa に関連する属性すべてを表示する場合
# fnattr user/rosa |
ユーザー uri に関連する size 属性を表示する場合
# fnattr user/uri/ size |
devlin という名前のユーザーについて、値が small の属性 shoesize を追加するには、hatsize 属性を削除して、dresssize 属性の値を 12 から 8 に変更します。
# fnattr user/devlin -a shoesize small -d hatsize -m dresssize 12 8 |
NIS+ または NIS は、DNS や X.500 などのグローバルネームサービスにフェデレートできます。
NIS+ または NIS の名前空間を DNS または X.500 のもとでフェデレートするには、まず NIS+ 階層または NIS ドメインのルートリファレンスを獲得する必要があります。
グローバルネームサービスでは、ルートリファレンスは、「次のネーミングシステムリファレンス」として知られています。これは、このリファレンスが、DNS ドメインまたは X.500 エントリの下にある次のネーミングシステムを指すためです。NIS+ または NIS をグローバルネームサービスによってフェデレートするには、そのグローバルサービスに、ルートリファレンス情報を追加します。
ルートリファレンス情報をグローバルサービスに追加すると、各自の NIS+ 階層または NIS ドメインの外部のクライアントは、その NIS+ 階層または NIS ドメインのコンテキストにアクセスして、操作を実行できます。外部 NIS+ クライアントは、未認証 NIS+ クライアントとしてその階層にアクセスします。
次に例を示します。
NIS+ が、DNS ドメイン doc.com. の下でフェデレートされる場合は、次のコマンドを使用して NIS+ エンタープライズのルートをリスト表示できます。
# fnlist .../doc.com/ |
NIS+ が、X.500 エントリ /c=us/o=doc の下でフェデレートされる場合は、次のコマンドを使用して NIS+ エンタープライズのルートをリスト表示できます。
# fnlist .../c=us/o=doc/ |
どちらの例でも、最後にスラッシュが必要であることに注意してください。
fncopy コマンドは、FNS のコンテキストと属性を新しい FNS コンテキストにコピー、または変換するために使用できます。
-i および -o オプションを使用すると、あるエンタープライズレベルのネームサービスに基く FNS コンテキストを、異なるネームサービスに基くコンテキストにコピーできます。たとえば、NIS の上部で実行される FNS インストール環境があって、NIS サービスを NIS+ にアップグレードする場合、fncopy を使用すると、NIS+ を使って新しいコンテキストを作成できます。
次の点に注意してください。
古いコンテキストをコピー中の新しい FNS コンテキストが、そのターゲットネームサービスにすでに存在する場合は、新しいコンテキストと割り当てだけがコピーされる。これらのコンテキストは上書きも変更もされない
fncopy は、リンクに従わないが、名前に割り当てられた FNS リンクを、新しいコンテキストの名前空間にコピーする
オプション |
説明 |
---|---|
-i oldservice |
エンタープライズレベルの古い (入力) 基本ネームサービス。たとえば、-i nis は、古いサービスが NIS であることを指定する。指定できる値は、files、nis、nisplus |
-o newservice |
エンタープライズレベルの新しい (出力) ネームサービス。たとえば、-o nisplus は、新しいサービスが NIS+ であることを指定する。指定できる値は、files、nis、nisplus |
-f filename |
コピーされる FNS コンテキストのリストが入っているテキストファイル。-i および -o オプションを指定しない場合、コンテキストは、グローバル名を使用する識別子でなければならない |
oldcontext |
コピーされるコンテキスト名 |
newcontext |
作成先またはコピー先のコンテキスト名 |
たとえば、doc.com プリンタコンテキスト (およびサブコンテキスト) と割り当てを orgunit/east/doc.com にコピーするには、次のコマンドを実行します。
# fncopy .../doc.com/service/printer .../doc.com/orgunit/east/service/printer |
ファイル user_list に指定された NIS FNS ユーザーのコンテキストを、orgunit west/doc.com の NIS+ FNS ユーザーのコンテキストにコピーするには、次のコマンドを実行します。
# fncopy -i nis -o nisplus -f /etc/user_list thisorgunit/user org/doc.com/user |
この節のプログラミング例は、次の操作を実行するための XFN API の使用法を示しています。
次の例は、コンテキストをリスト表示するための XFN 操作を示しています。
#include <stdio.h> #include <xfn/xfn.h> #include <string.h> #include <stdlib.h> /* このルーチンは与えられたコンテキスト (ctx_name) の下で 割り当てられた名前のリストを返す。 ctx_name の例としては "user"、"thisorgunit/service"、 host/alto/service、user/jsmit/service/calendar などがある */ typedef struct fns_listing { char *name; struct fns_listing *next; } fns_listing; fns_listing * fns_list_names(const char *ctx_name) { FN_status_t *status; FN_ctx_t *initial_context; FN_composite_name_t *context_name; FN_namelist_t *name_list; FN_string_t *name; unsigned int stat; fns_listing *head = 0, *current, *prev; int no_names = 0; status = fn_status_create(); /* 初期コンテキストの獲得 */ initial_context = fn_ctx_handle_from_initial(0, status); if (!fn_status_is_success(status)) { fprintf(stderr, "Unable to obtain intial context¥n"); return (0); } context_name = fn_composite_name_from_str((unsigned char *) ctx_name); /* FNS によるリスト名の呼び出し */ name_list = fn_ctx_list_names(initial_context, context_name, status); if (!fn_status_is_success(status)) { fprintf(stderr, "Unable to list names¥n"); return (0); } /* 名前を個々に呼び出す */ while (name = fn_namelist_next(name_list, status)) { no_names++; current = (fns_listing *) malloc(sizeof(fns_listing)); current->name = (char *) malloc(strlen((char *) fn_string_str(name, &stat)) + 1); strcpy(current->name, (char *) fn_string_str(name, &stat)); current->next = 0; if (head) { prev->next = current; prev = current; } else { head = current; prev = current; } fn_string_destroy(name); } fn_namelist_destroy(name_list); fn_status_destroy(status); fn_ctx_destroy(initial_context); return (head); |
次の例は、バインディングの作成方法を示しています。
#include <stdio.h> #include <xfn/xfn.h> #include <string.h> /* このルーチンは "name" によって提供される名前を用いて バインディングを作成する。提供される名前のリファレンスのタイプは "reference_type" で、アドレスのタイプは "address_type"である。 関数の使用例として fns_create_bindings( "user/jsmith/service/calendar"、 "onc_calendar"、 "onc_cal_str"、 "jsmith&calserver"); がある */ int fns_create_bindings( char *name, char *reference_type, char *address_type, char *data) { int return_status; FN_composite_name_t *binding_name; FN_identifier_t ref_id, addr_id; FN_status_t *status; FN_ref_t *reference; FN_ref_addr_t *address; FN_ctx_t *initial_context; /* 初期コンテキストの獲得 */ status = fn_status_create(); initial_context = fn_ctx_handle_from_initial(0, status); /* エラーメッセージの状態のチェック */ if ((return_status = fn_status_code(status)) != FN_SUCCESS) { fprintf(stderr, "Unable to obtain the initial context¥n"); return (return_status); } /* プリンタ名に付ける複合名の獲得 */ binding_name = fn_composite_name_from_str((unsigned char *) name); /* アドレスのコンストラクト */ addr_id.format = FN_ID_STRING; addr_id.length = strlen(address_type); addr_id.contents = (void *) address_type; address = fn_ref_addr_create(&addr_id, strlen(data), (const void *) data); /* リファレンスのコンストラクト */ ref_id.format = FN_ID_STRING; ref_id.length = strlen(reference_type); ref_id.contents = (void *) reference_type; reference = fn_ref_create(&ref_id); /* リファレンスにアドレスを追加する */ fn_ref_append_addr(reference, address); /* 割り当ての作成 */ fn_ctx_bind(initial_context, binding_name, reference, 0, status); /* エラー状態をチェックして返す */ return_status = fn_status_code(status); fn_composite_name_destroy(binding_name); fn_ref_addr_destroy(address); fn_ref_destroy(reference); fn_ctx_destroy(initial_context); return (return_status); } |
次の例は、オブジェクト属性をリスト表示して処理する方法を示しています。
次の例は、オブジェクト属性をリスト表示する方法を示しています。
#include <stdio.h> #include <xfn/xfn.h> /* このルーチンは名前付きオブジェクトに関連付けられたすべての属性を 標準出力に出力する。関数の使用例として fns_attr_list("user/jsmith"); や fns_attr_list("thisorgunit/service/printer/color"); がある */ void fns_attr_list(const char *name) { FN_composite_name_t *name_comp; const FN_identifier_t *identifier; FN_attribute_t *attribute; const FN_attrvalue_t *values; char *id, *val; FN_multigetlist_t *attrset; void *ip; FN_status_t *status; FN_ctx_t *initial_context; name_comp = fn_composite_name_from_str((unsigned char *) name); status = fn_status_create(); /* 初期コンテキストの獲得 */ initial_context = fn_ctx_handle_from_initial(0, status); if (!fn_status_is_success(status)) { fprintf(stderr, "Unable to obtain intial context¥n"); return; } /* 全属性の獲得 */ attrset = fn_attr_multi_get(initial_context, name_comp, 0, 0, status); if (!fn_status_is_success(status)) { fprintf(stderr, "Unable to obtain attributes¥n"); return; } /* 全属性の表示 */ while (attribute = fn_multigetlist_next(attrset, status)) { identifier = fn_attribute_identifier(attribute); switch(identifier->format) { case FN_ID_STRING: id = (char *) malloc(identifier->length + 1); memcpy(id, identifier->contents, identifier->length); id[identifier->length] = '¥0'; printf("Attribute Identifier: %s", id); free(id); break; default: printf("Attribute of non-string format¥n¥n"); continue; } for (values = fn_attribute_first(attribute, &ip); values != NULL; values = fn_attribute_next(attribute, &ip)) { val = (char *) malloc(values->length + 1); memcpy(val, values->contents, values->length); val[values->length] = '¥0'; printf("Value: %s", val); free(val); } fn_attribute_destroy(attribute); printf("¥n"); } fn_multigetlist_destroy(attrset); fn_ctx_destroy(initial_context); fn_status_destroy(status); fn_composite_name_destroy(name_comp); } |
次の例は、オブジェクト属性の追加、削除、変更を示しています。
#include <stdio.h> #include <xfn/xfn.h> /* このルーチンは名前付きオブジェクトに関連付けられた属性を変更する。 変更としては、 FN_ATTR_OP_ADD FN_ATTR_OP_ADD_EXCLUSIVE FN_ATTR_OP_REMOVE FN_ATTR_OP_ADD_VALUES FN_ATTR_OP_REMOVE_VALUES が有効である。この関数は属性値が文字列であることを前提とする。 関数の使用例として、以下に "James Smith" という値を持つ識別子 "realname" の属性を、ユーザーオブジェクト "user/jsmith" に追加する。 fns_attr_modify( "user/jsmith", "realname", "James Smith", FN_ATTR_OP_ADD); 次の関数は識別子 "location" の属性をプリンタオブジェクト "thisorgunit/service/printer/color" から削除する。 fns_attr_modify( "thisorgunit/service/printer/color", "location", NULL, FN_ATTR_OP_REMOVE); */ static const char *attr_id_syntax = "fn_attr_syntax_ascii"; void fns_attr_modify(const char *name, const char *attr_id, const char *attr_value, unsigned int operation) { FN_composite_name_t *name_comp; FN_identifier_t identifier, syntax; FN_attrvalue_t *values; FN_attribute_t *attribute; FN_status_t *status; FN_ctx_t *initial_context; name_comp = fn_composite_name_from_str((unsigned char *) name); status = fn_status_create(); /* 初期コンテキストの獲得 */ initial_context = fn_ctx_handle_from_initial(0, status); if (!fn_status_is_success(status)) { fprintf(stderr, "Unable to obtain intial context¥n"); return; } /* 追加する属性の作成 */ /* 最初に識別子 */ identifier.format = FN_ID_STRING; identifier.length = strlen(attr_id); identifier.contents = (void *) strdup(attr_id); /* 次に構文 */ syntax.format = FN_ID_STRING; syntax.length = strlen(attr_id_syntax); syntax.contents = (void *) strdup(attr_id_syntax); /* 次に属性値 */ if (attr_value) { values = (FN_attrvalue_t *) malloc(sizeof(FN_attrvalue_t)); values->length = strlen(attr_value); values->contents = (void *) strdup(attr_value); } else values = NULL; /* 次に属性の作成 */ attribute = fn_attribute_create(&identifier, &syntax); /*次に属性値の追加 */ if (values) fn_attribute_add(attribute, values, 0); /* XFN オペレーションの実行 */ fn_attr_modify(initial_context, name_comp, operation, attribute, 0, status); if (!fn_status_is_success(status)) fprintf(stderr, "Unable to perform attribute operation¥n"); fn_ctx_destroy(initial_context); fn_status_destroy(status); fn_composite_name_destroy(name_comp); fn_attibute_destroy(attribute); free(identifier.contents); free(syntax.contents); if (values) { free(values->contents); free(values); ] ] |
次の例は、特定の属性識別子と値によって、コンテキスト内のオブジェクトを検索する方法を示しています。
#include <stdio.h> #include <xfn/xfn.h> #include <string.h> #include <stdlib.h> /* このルーチンは、指定された属性識別子と値を持つコンテキスト内の オブジェクトを検索します。 */ typedef struct fns_search_results { char *name; struct fns_search_results *next; } fns_search_results; static const char *attr_id_syntax = "fn_attr_syntax_ascii"; fns_search_results * fns_attr_search(const char *name, const char *attr_id, const char *attr_value) { FN_status_t *status; FN_ctx_t *initial_context; FN_composite_name_t *context_name; FN_searchlist_t *search_list; FN_string_t *search_name; FN_attribute_t *attribute; FN_attrset_t *attrset; FN_identifier_t identifier, syntax; FN_attrvalue_t *values; unsigned stat; fns_search_results *head = 0, *current, *prev; int no_names = 0; context_name = fn_composite_name_from_str((unsigned char *) name); status = fn_status_create(); initial_context = fn_ctx_handle_from_initial(0, status); if (!fn_status_is_success(status)) { fprintf(stderr, "Unable to obtain intial context¥n"); return (0); } /* 検索する属性を持つ attrset のコンストラクト */ /* 最初に識別子 */ identifier.format = FN_ID_STRING; identifier.length = strlen(attr_id); identifier.contents = (void *) strdup(attr_id); /* 次に構文 */ syntax.format = FN_ID_STRING; syntax.length = strlen(attr_id_syntax); syntax.contents = (void *) strdup(attr_id_syntax); /* 次に属性値 */ values = (FN_attrvalue_t *) malloc(sizeof(FN_attrvalue_t)); values->length = strlen(attr_value); values->contents = (void *) strdup(attr_value); /* 次に属性の作成 */ attribute = fn_attribute_create(&identifier, &syntax); /* 次に属性値の作成 */ fn_attribute_add(attribute, values, 0); /* 次に attrset の作成と属性の追加 */ attrset = fn_attrset_create(); fn_attrset_add(attrset, attribute, 0); search_list = prelim_fn_attr_search(initial_context, context_name, attrset, 0, 0, status); if (!fn_status_is_success(status)) { fprintf(stderr, "Unable to list names¥n"); return (0); } while (search_name = prelim_fn_searchlist_next(search_list, 0, 0, status)) { no_names++; current = (fns_search_results *) malloc(sizeof(fns_search_results)); current->name = (char *) malloc(strlen((char *) fn_string_str(search_name, &stat)) + 1); strcpy(current->name, (char *) fn_string_str(search_name, &stat)); current->next = 0; if (head) { prev->next = current; prev = current; } else { head = current; prev = current; } fn_string_destroy(search_name); } fn_searchlist_destroy(search_list); fn_status_destroy(status); fn_ctx_destroy(initial_context); fn_attrset_destroy(attrset); fn_attribute_destroy(attribute); free(identifier.contents); free(syntax.contents); free(values->contents); free(values); return (head); } |