Solaris ネーミングの管理

第 20 章 FNS の手引き

この章では、FNS の概要、設定と構成の手順に関する簡単な説明、およびプログラミングの例を示します。熟練の管理者であれば、この章を読むだけで必要なことがすべてわかります。

詳細は、パート V「FNS の管理」の他の章を参照してください。FNS の初期設定と構成の詳細は、『Solaris ネーミングの設定と構成』を参照してください。

フェデレーテッド・ネーミング・サービス (FNS)

フェデレーテッド・ネーミング・サービス (FNS) は、ネーミングとディレクトリ操作のための 1 つの単純なインタフェースのもとに、複数のネームサービスをフェデレートする方法を提供します。FNS によってリンクできるネームサービスには、NIS+、NIS、ファイルベース、DNS、および X.500/LDAP があります。

XFN (X/Open Federated Naming)

FNS がサポートするプログラミングインタフェースとそのポリシーは、XFN (X/Open Federated Naming) に述べられています。

FNS を使用する理由

FNS は、次の点で有用です。

複合名と複合コンテキスト

FNS の基本概念として、複合名と複合コンテキストがあります。

複合名

複合名とは、複数のネーミングシステムで使用される名前のことをいいます。

複合名は、複数の構成要素の順序付きリストからなります。各構成要素は、単一のネーミングシステムの名前空間からとられた名前です。各構成要素の構文は、個々のネーミングシステムにより異なります。FNS は、複数のネーミングシステムからとられた名前を使用して複合名を作成するときの構文を定義します。複合名は、スラッシュ (/) を構成要素区切り文字として使用して、左から右へ作成されます。

たとえば、複合名 .../doc.com/site/bldg-5.alameda は、...doc.comsitebldg-5.alameda という 4 つの構成要素から構成されます。

コンテキスト

コンテキストは、次の操作を行います。

コンテキストには、一連の名前とリファレンスの割り当てが含まれます。各リファレンスには、通信の終端またはアドレスのリストが含まれます。フェデレーテッド・ネーミング・システムは、別のネーミングシステムのコンテキストで割り当て中の、あるネーミングシステムのコンテキストによって形成されます。複合名の解釈処理は、その名前全体が解釈処理されるまで、あるネーミングシステム内のコンテキストから、次のネーミングシステム内のコンテキストへと進みます。

属性

名前付きオブジェクトには、属性を適用できます。属性はオプションです。名前付きオブジェクトには、属性を付けないことも、1 つまたは複数の属性を付けることもできます。

各属性は、一意の属性識別子、属性構文、ゼロまたはいくつかの属性値の集合を持ちます。

XFN は、既存の名前付きオブジェクトに関連付けられた属性値を確認、変更するための基本属性インタフェースを定義します。これらのオブジェクトは、コンテキストまたは他の任意のタイプのオブジェクトにできます。コンテキストには、コンテキストによる合成名の構文解析方法を記述する構文属性が関連付けられます。

拡張属性インタフェースには、特定の属性を検索する操作と、オブジェクトとその関連属性を作成する操作があります。

エンタープライズネームサービス

エンタープライズレベルのネームサービスは、あるエンタープライズ内のオブジェクトに名前を付けるために使用されます。FNS は現在、次の 3 つのレベルのネームサービスをサポートしています。

NIS+

NIS+ は、Solaris 7 リリース環境で推奨されるエンタープライズ規模の情報サービスです。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

NIS は、Solaris 環境でのエンタープライズ規模の情報サービスです。各エンタープライズは 1 つの NIS ドメインにあたります。1 つの NIS ドメインに対応する 1 つの FNS 組識単位があります。

NIS のもとで、FNS のコンテキストと属性データは NIS マップに格納されます。これらのマップは、NIS サーバー上の /var/yp/domainname ディレクトリに格納されます。NIS では、スーパーユーザーは、FNS コマンドを使用して、FNS マップ内の情報を処理できます。

SKI が実行されている場合に NIS クライアントが FNS でコンテキストを更新する

一定の条件が満たされれば、NIS クライアント (マシン、プロセス、またはユーザー) はすべて、fncreate_fsfncreate_printer などの FNS コマンドを使用して、クライアント独自のコンテキストを更新できます。これにより、NIS クライアントは、FNS コマンドを使用して、Printer Administrator、CDE カレンダマネージャ、admintool などのアプリケーションを更新できます。

スーパーユーザー以外のユーザーが、FNS コマンドを使用して独自のコンテキストを更新するには、次の条件が必要です。


注 -

SKI は 64 ビットモードをサポートしていません。したがって NIS クライアントは 64 ビットモードでのコンテクストの更新は行うことができません。


ファイルベース

「ファイル」とは、通常、マシンの /etc ディレクトリにあるネーミングファイルを指します。これらのマシンベースファイルには、UNIX のユーザーとパスワード情報、ホスト情報、メール別名などが入っています。これらのファイルは、自動マウントマップなどの Solaris 特定のデータもサポートしています。

ファイルベースのネーミングシステムでは、FNS コンテキストと属性データはファイルに格納されます。これらの FNS ファイルは、マシンの /var/fn ディレクトリに格納されます。(/var/fn ディレクトリを各マシンに置く必要はありません。このディレクトリは、NFS ファイルサーバーからエクスポートされます。)

ファイルネーミングシステムでは、FNS コマンドを使用して FNS ファイルの情報を処理します。

グローバルネームサービス

FNS は、DNS と X.500 による NIS+ と NIS のフェデレートもサポートします。つまり、エンタープライズレベルの名前空間をグローバル名前空間に接続し、エンタープライズオブジェクトをグローバルな有効範囲でアクセス可能にできるということです。

FNS は現在、次のグローバルネームサービスをサポートしています。

FNS ネーミングポリシー

FNS は、ネーミングポリシーを定義して、ユーザーとアプリケーションが共有名前空間に依存し、それを使用できるようにします。

エンタープライズ内には、組識単位、サイト、ホスト、ユーザー、ファイルとサービスごとの名前空間があり orgunitsitehostuserfs (ファイルシステムを示す)、および 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 の割り当ては、基本となるネームサービスによって決まります。

組識単位名に対応して命名されるオブジェクトのタイプは、userhostservicefssite です。次に例を示します。

サイト名

サイト名は、必要に応じて作成されます。サイト名に対応して指定されるオブジェクトのタイプは、userhostservicefs です。次に例を示します。

ユーザー名

ユーザー名は、NIS+ の対応する passwd テーブル、NIS の passwd マップ、またはファイルの /etc/passwd ファイルにある名前に対応します。ユーザーのファイルコンテキストは、そのユーザーの passwd エントリから獲得されます。

ユーザー名に対応して指定されるオブジェクトのタイプは、servicefs です。次に例を示します。

ホスト名

ホスト名は、NIS+ の対応する hosts、NIS の hosts マップ、またはファイルの /etc/hosts ファイルにある名前に対応します。ホストのファイルコンテキストは、ホストによってエクスポートされるファイルシステムに対応します。

ホスト名に対応して指定されるオブジェクトのタイプは、servicefs です。次に例を示します。

サービス名

サービス名は、サービスアプリケーションに対応し、それによって決定されます。サービスコンテキストは、組識、ユーザー、ホスト、またはサイトコンテキストに対応して指定する必要があります。次に例を示します。

ファイル名

ファイルシステム名は、ファイル名に対応します。次に例を示します。

開始前に必要な処置

各自のネームサービスで FNS を開始するには、fncreate コマンドを実行します。

fncreate コマンドは、FNS コンテキストが作成されるネームサービス (NIS+、NIS、ファイルベースなど) を認識します。特定のネームサービスを指定するには、下記の 「デフォルト以外のネームサービスの指定」で説明する、fnselect コマンドを実行する必要があります。

デフォルト以外のネームサービスの指定

デフォルトでは次のようになります。

fnselect コマンドを使用すると、デフォルト以外のターゲットネームサービスを明確に指定することもできます。たとえば、次のコマンドは、ターゲットネームサービスに NIS を選択します。


# fnselect nis

FNS 名前空間の作成

デフォルトポリシー、または fnselect によって明示的にネームサービスを指定したら、次のコマンドを使用して、FNS 名前空間を作成できます。


# fncreate -t org org//

このコマンドは、対応するネームサービス内のユーザーとホストに必要なすべてのコンテキストを作成します。

NIS+ についての考慮事項

各自のエンタープライズレベルの基本ネームサービスが NIS+ の場合は、次の点を考慮に入れてください。

NIS+ のドメインとサブドメイン

上記のコマンド構文は、ルート NIS+ ドメインの FNS 名前空間を作成します。ルート以外のドメインを指定するには、次のように、2 つのスラッシュの間にドメイン名を追加します。


# fncreate -t org org/sales.doc.com./

完全指定の sales.doc.com. の最後のドットに注意してください。

空間とパフォーマンスの考慮事項

fncreate コマンドは、ctx_dir ディレクトリに NIS+ のテーブルとディレクトリを作成します。ctx_dir ディレクトリオブジェクトは、ドメインの NIS+ の groups_dirorg_dir ディレクトリオブジェクトと同じレベルにあります。

NIS+ のセキュリティ要件

fncreate などの FNS コマンドを実行するユーザーは、必要な NIS+ 資格を持つことが前提とされます。

環境変数 NIS_GROUP は、fncreate によって作成された NIS+ オブジェクトのグループ所有者を指定します。NIS+ オブジェクトの管理を容易にするために、NIS_GROUP には、そのドメインの FNS 管理を担当する NIS+ グループ名を設定してから、fncreate などの FNS コマンドを実行する必要があります。

デフォルトのアクセス制御権を含む NIS+ 関連属性は、コンテキストの作成後、NIS+ の管理ツールやインタフェースを使用して変更できます。FNS 複合名に対応する NIS+ オブジェクト名は、後で説明する fnlookup および fnlist によって獲得できます。

NIS についての考慮事項

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 名前空間にアクセスできます。

FNS 名前空間の表示

名前空間を設定したら、次のコマンドを使用して表示できます。

コンテキストの内容の表示

次の fnlist コマンドは、name のコンテキスト名とリファレンスの割り当てを表示します。


fnlist [-lvA] [name]
表 20-2 fnlist コマンドのオプション

オプション 

説明 

name

複合名。name のコンテキストでの名前の割り当てを表示する

-v

詳細。割り当ての詳細を表示する 

-l

指定のコンテキストで割り当てられた名前の割り当ても表示する 

-A

fnlist で、権限のあるサーバーからの情報を強制的に獲得する。NIS と NIS+ で、このサーバーはドメインのマスターサーバーになる。-A オプションは、基本ネームサービスがファイルベースの場合、無効である

次に例を示します。

初期コンテキストの名前をリスト表示する場合


% fnlist

現在の組識単位内のユーザーすべての詳細をリスト表示する場合


% fnlist -v user

ユーザー pugservice コンテキストの内容をリスト表示する場合


% fnlist user/pug/service

権限のあるサーバーからの名前と割り当てをリスト表示する場合


% fnlist -l -A

複合名の割り当ての表示

fnlookup コマンドは、指定の複合名の割り当てを表示します。


fnlookup [-vAL] [name]
表 20-3 fnlookup コマンドのオプション

オプション 

説明 

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

詳細は、「属性の処理」を参照してください。

FNS 情報の検索

fnsearch コマンドは、属性が所定の検索基準を満たす複合名以下で割り当てられたオブジェクト名を表示し、必要に応じてその属性とリファレンスを表示します。

たとえば、realname という属性を持つユーザーとその属性をリスト表示するには、次のコマンドを実行します。


% fnsearch user realname

値が Ravi Chattha の属性 realname を持つユーザーをリスト表示するには、次のコマンドを実行します。


% fnsearch user "realname == 'Ravi Chattha'" 

fnsearch コマンドは、共通のブール型演算子を使用します。上記の例では、二重引用符と一重引用符、2 つの等号の使用に注意してください。

名前空間の更新

名前空間を設定したら、次のコマンドを使用して、要素の追加、削除、および変更できます。

FNS 管理特権

FNS システム管理は、基本となるネームサービスによって異なります。

ユーザーが各自のサブコンテキストを変更できるかどうかは、基本となるネームサービスによって異なります。

複合名へのリファレンスの割り当て

fnbind コマンドは、既存のリファレンス (名前) を新しい複合名に割り当てるために使用されます。


fnbind -r [-s][-v][-L] name [-O|-U]  newname reftype addrtype  [-c|-x] address
表 20-4 fnbind コマンドのオプション

オプション 

説明 

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@altaironc_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
表 20-5 fncreate コマンドのオプション

オプション 

説明 

-t context

context タイプのコンテキストを作成する。context タイプは、orghostnamehostusernameuserservicefssitensidgeneric

-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

ファイルコンテキストの作成

表 20-6 fncreate_fs コマンドのオプション

オプション 

説明 

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
表 20-7 fncreate_printer コマンドのオプション

オプション 

説明 

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 コマンドは、プリンタ colorcolor/inkjetcolor/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 コマンドは、空のコンテキストを削除するために使用されます。

たとえば、ユーザー patelservice コンテキストを削除するには、次のコマンドを実行します。


# fndestroy user/patel/service

属性の処理

fnattr コマンドは、名前に関連する属性の追加、削除、または変更に使用できます。変更は一度に 1 つずつ行うことも、同じコマンド内で何回かバッチ処理することもできます。

表 20-8 fnattr コマンドのオプション

オプション 

説明 

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/

どちらの例でも、最後にスラッシュが必要であることに注意してください。

FNS コンテキストのコピーと変換

fncopy コマンドは、FNS のコンテキストと属性を新しい FNS コンテキストにコピー、または変換するために使用できます。

-i および -o オプションを使用すると、あるエンタープライズレベルのネームサービスに基く FNS コンテキストを、異なるネームサービスに基くコンテキストにコピーできます。たとえば、NIS の上部で実行される FNS インストール環境があって、NIS サービスを NIS+ にアップグレードする場合、fncopy を使用すると、NIS+ を使って新しいコンテキストを作成できます。

次の点に注意してください。

表 20-9 fncopy コマンドのオプション

オプション 

説明 

-i oldservice

エンタープライズレベルの古い (入力) 基本ネームサービス。たとえば、-i nis は、古いサービスが NIS であることを指定する。指定できる値は、filesnisnisplus

-o newservice

エンタープライズレベルの新しい (出力) ネームサービス。たとえば、-o nisplus は、新しいサービスが NIS+ であることを指定する。指定できる値は、filesnisnisplus

-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);
 }