この節では、NIS マップの管理方法について説明します。
マップ情報は、ypcat、ypwhich、ypmatch コマンドを使っていつでも取得できます。以下の例では、mapname はマップの正式名とニックネーム(存在する場合)の両方を意味します。
マップのすべての値を表示するには、次のように入力してください。
% ypcat mapname
マップのキーと値 (存在する場合) の両方を表示するには、次のように入力してください。
% ypcat -k mapname
マップのすべてのニックネームを表示するには、以下のコマンドのどれかを入力してください。
% ypcat -x % ypwhich -x % ypmatch -x
使用可能なすべてのマップとマスターサーバーを表示するには、次のように入力してください。
% ypwhich -m
特定マップのマスターサーバーを表示するには、次のように入力してください。
% ypwhich -m mapname
キーをマップのエントリと比較するには、次のように入力してください。
% ypmatch key mapname
見つけたい項目がマップのキーでない場合は、次のように入力してください。
% ypcat mapname | grep item
item は、見つけたい情報です。他のドメインに関する情報を取得するには、これらのコマンドの -d domainname オプションを指定してください。
デフォルト以外のドメインの情報を要求するマシンが、そのドメインに対するバインドを持っていない場合は、このマシンは ypbind で /var/yp/binding/domainname/ypservers ファイルを参照して、そのドメインのサーバーリストを検索します。このファイルが存在しない場合は、ypbind は RPC 同報通信を送出してサーバーを検索します。この場合、検索先であるドメインのサーバーは、要求元マシンと同じサブネットに存在している必要があります。
選択されたマップのマスターサーバーを変更するには、まず新しい NIS マスターサーバー上にマップを作成しなければなりません。古いマスターサーバー名は既存のマップにキーと値のペアとして発生するので (このペアは makedbm で自動的に挿入される)、ypxfr でマップを新しいマスターサーバーにコピーしたり、コピーを新しいマスターサーバーに転送するだけでは不十分です。キーと新しいマスターサーバー名との対応づけをし直す必要があります。マップに ASCII ソースファイルが存在する場合は、このファイルを新しいマスターサーバーにコピーしてください。
sites.byname というサンプル NIS マップを作成し直す手順を以下に示します。
新しいマスターサーバーにスーパユーザーとしてログインし、次のように入力します。
newmaster# cd /var/yp
作成するマップを指定する前に、Makefile にこの新しいマップのエントリが必要です。ない場合は、最初に Makefile を編集します。
マップを更新または再作成するには、次のように入力します。
newmaster# make sites.byname
古いマスターサーバーが NIS サーバーとして残っている場合は、古いマスターサーバーにリモートログイン (rlogin) してから、Makefile を編集します。sites.byname を作成した Makefile 内のセクションをコメントアウトして、このセクションで sites.bynam が再び作成されないようにします。
sites.byname が ndbm ファイルとしてだけ存在している場合は、以下に示す makedbm で任意の NIS サーバーからコピーを取り出し、実行して sites.byname を新しいマスターサーバー上で作成し直します。
newmaster# cd /var/yp newmaster# ypcat -k sites.byname | makedbm - domain /sites.byname
新しいマスターサーバー上でマップが作成されたら、そのコピーをこのマスターサーバーのスレーブサーバーに送信します。ただしこの場合、yppush を使用しないでください。yppush を使用すると、スレーブサーバーは新しいマスターサーバーからではなく古いマスターサーバーから新しいコピーを取得します。このような動作を回避するには、一般にマップのコピーを新しいマスターサーバーから古いマスターサーバーに送り返すという方法が用いられます。この操作を行うには、古いマスターサーバーのスーパユーザーとなり、次のように入力します。
oldmaster# /usr/lib/netsvc/yp/ypxfr -h newmaster sites.byname
これで、yppush を使用できます。スレーブサーバーは、古いマスターサーバーをカレントマスターサーバーとして認識しているので、スレーブサーバーは、マップのカレントバージョンを古いマスターサーバーから取得しようとします。それから、スレーブサーバーは、新しいマスターサーバーがカレントマスターサーバーとして指定されている新しいマップを取得します。
この方法が失敗した場合は、各 NIS サーバーのルートとしてログインし、上記の ypxfr コマンドを実行してください。この方法は、面倒ですが必ず成功します。
NIS は、設定ファイルを正確に構文解析します。このため NIS 管理は容易になりますが、設定ファイルおよび構成ファイルにおける変更により、NIS の動作は影響を受けます。
ファイルには次のものがあります。
/var/yp/Makefile
/etc/resolv.conf
このファイルを追加または削除することで、DNS 転送が可能または不可になります。
$PWDIR/security/passwd.adjunct
このファイルを追加または削除することで、C2 セキュリティが可能または不可になります。($PWDIR
は、/var/yp/Makefile で定義されます。)
上記ファイルを更新するには、以下の手順に従ってください。
次のように入力して NIS サーバーを停止します。
# /etc/init.d/yp stop
必要に応じてファイルを変更します。
次のように入力して NIS サーバーを再起動します。
# /etc/init.d/yp start
NIS のマップまたはマップソースファイルを更新する場合は、NIS を停止および起動する必要はありません。
以下の点に注意してください。
NIS マスターサーバーからマップまたはソースファイルを削除しても、スレーブサーバー上の対応するマップまたはソースファイルは自動的には削除されません。スレーブサーバー上の対応するマップまたはソースファイルの削除は、NIS 管理者が手作業で行う必要があります。
新しいマップは、自動的には既存のスレーブサーバーに転送されません。新しいマップを既存のスレーブサーバーに転送するには、NIS 管理者がそのスレーブサーバーで ypxfr を実行してください。
/var/yp で提供されたデフォルトの Makefile を更新することにより、NIS 管理者のニーズを満たすことができます。(今後に備えて、必ずこのオリジナルの Makefile のコピーを保存しておいてください。) Makefile を使用すると、マップの追加または削除、および一部のディレクトリ名の変更ができます。
新しい NIS マップを追加するには、マップの ndbm ファイルのコピーをドメインに存在する各 NIS サーバーの /var/yp/domainname ディレクトリに転送する必要があります。この転送は通常、Makefile が自動的に行います。どの NIS サーバーがマップのマスターサーバーであるかを決定したら、マップを容易に作成し直せるようにマスターサーバーの Makefile を更新してください。異なる複数のサーバーを異なる複数のマップのマスターサーバーとして設定することも可能ですが、このようにするとたいていの場合、管理上の混乱を招きます。したがって、1 つのサーバーだけをすべてのマップのマスターサーバーとして設定することをお勧めします。
一般に、人間が判読可能なテキストファイルは、makedbm に対する入力として適したものにするために awk、sed、grep でフィルタリングされます。デフォルトの Makefile を参照してください。make コマンドの概要については、make(15) のマニュアルページを参照してください。
make が認識する従属性の作成方法を決定する際には、Makefile にすでに備わっているメカニズムを使用してください。make では従属ルール内の行の始まりにタブが存在するか否かが重要であり、タブが存在しないというだけでエントリが無効になることがあるので注意してください。
Makefile にエントリを追加するには、以下の作業を行ってください。
データベース名を all ルールに追加します。
time ルールを作成します。
データベースのルールを追加します。
たとえば、Makefile をオートマウンタ入力ファイルで動作させるには、auto_direct.time および auto_home.time マップを NIS データベースに追加してください。
NIS データベースにこれらのマップを追加するには、以下の手順に従ってください。
all という語で始まる行に、追加したいデータベース名 (1 つまたは複数) を追加します。
all: passwd group hosts ethers networks rpc services protocols ¥ netgroup bootparams aliases netid netmasks ¥ auto_direct auto_home auto_direct.time auto_home.time
エントリの順序は任意ですが、継続行の始まりの空白はスペースではなくタブにしてください。
Makefile の終わりに以下の行を追加します。
auto_direct: auto_direct.time auto_home: auto_home.time
ファイル中央に auto_direct.time エントリを追加します。
auto_direct.time: $(DIR)/auto_direct @(while read L; do echo $$L; done < $(DIR)/auto_direct $(CHKPIPE)) | ¥ (sed -e "/^#/d" -e "s/#.*$$//" -e "/^ *$$/d" $(CHKPIPE)) | ¥ $(MAKEDBM) - $(YPDBDIR)/$(DOM)/auto_direct; @touch auto_direct.time; @echo "updated auto_direct"; @if [ ! $(NOPUSH) ]; then $(YPPUSH) auto_direct; fi @if [ ! $(NOPUSH) ]; then echo "pushed auto_direct"; fi
CHKPIPE は、次のコマンドに結果を渡す (パイピングする) 前に、パイプ (|) の左側の動作が正しく行われたことを確認します。パイプの左側の動作が正しく行われなかった場合は、「NIS make terminated」というメッセージが表示されてプロセスは終了します。
NOPUSH は、Makefile が yppush を呼び出して新しいマップをスレーブサーバーに転送することを防止します。NOPUSH が設定されていない場合は、転送は自動的に行われます。
継続行の始まりにある while ループは、バックスラッシュで拡張された行を入力ファイルから削除するためのものです。sed スクリプトはコメント行および空行を削除し、makedbm に出力を渡します。
他のすべてのオートマウンタマップ (auto_home や他のデフォルトでないマップなど) でも、同じ手順が必要となります。
# make name
name は、作成するマップ名です。たとえば、auto_direct などです。
Makefile に特定データベースのマップを作成しない場合は、Makefile を以下のように編集してください。
all ルールからデータベース名を削除します。
削除するデータベースのデータベースルールを削除またはコメントアウトします。
time ルールを削除します。
たとえば、hosts データベースを削除するには、hosts: hosts.time エントリを削除します。
マスターサーバーとスレーブサーバーからマップを削除します。
Makefile の先頭で定義されている変数の設定値の変更は、等号 (=) の右側の値を変更するだけで行うことができます。たとえば、マップを作成するための入力として、/etc に存在するファイルではなく別のディレクトリに存在するファイル (たとえば、/var/etc/domainname など) を使用する場合は、DIR
値を DIR=/etc から DIR=/var/etc/domainname に変更してください。また、PWDIR 値を PWDIR=/etc から PWDIR=/var/etc/domainname に変更することもできます。
変数は次のとおりです。
DIR=
passwd と shadow を除くすべての NIS 入力ファイルが存在するディレクトリ。デフォルト値は /etc です。マスターサーバーの /etc ディレクトリのファイルを NIS 入力ファイルとして使用することは望ましくないので、この値は変更しなければなりません。
PWDIR
NIS 入力ファイル passwd と shadow が存在するディレクトリ。マスターサーバーの /etc ディレクトリのファイルを NIS 入力ファイルとして使用することは望ましくないので、この値は変更しなければなりません。
DOM
NISドメイン名。DOM のデフォルト値は、domainname コマンドで設定されます。大部分の NIS コマンドではカレントマシンのドメイン(カレントマシンの /etc/defaultdomain ファイルに設定されている)が使用されることに注意してください。
NIS のインストール終了後、頻繁に更新しなければならないマップとまったく更新する必要がないマップがあることに気づくかもしれません。たとえば、passwd.byname マップは、大企業のネットワークでは頻繁に更新されることがあります。一方、auto_master マップはまったくではないにしてもほとんど更新されません。
マップを更新する必要がある場合は、マップがデフォルトのマップか否かによって 2 つの更新手順のどちらかを使用できます。
この節では、さまざまな更新ツールの使用方法について説明します。実際上、これらの更新ツールは、システム起動後にデフォルトでないマップを追加する場合、または一群の NIS サーバーを変更する場合にだけ使用できます。
デフォルトのセットと共に提供されたマップを更新するには、以下の手順に従ってください。
マスターサーバーのルートになります。
必ずマスターサーバーだけの NIS マップを更新します。
更新するマップのソースファイルを編集します (このファイルが /etc に存在しているか、選択された他のディレクトリに存在しているかは問題ではありません)。
次のように入力します。
# cd /var/yp# make mapname
make コマンドは、対応するファイルに対して NIS 管理者が行った変更に従ってマップを更新します。make コマンドはまた、これらの変更を他のサーバーに反映します。
デフォルトでないマップを更新するには、以下の手順に従ってください。
対応するテキストファイルを作成または編集します。
新しいマップまたは更新されたマップを作成 (または再作成) します。マップ作成には 2 つの方法があります。
Makefile を使用する方法。デフォルトでないマップを作成するには、この方法を用います。Makefile にマップのエントリが存在する場合は、make name を実行するだけです (name は作成するマップ名)。Makefile にマップのエントリが存在しない場合は、「Makefile の更新と使用」を参照してエントリを作成をしてください。
/usr/sbin/makedbm プログラムを使用する方法。(このコマンドの詳細は、makedbm(1M) のマニュアルページで説明されています。)
入力ファイルが存在しない場合は、makedbm でマップを更新する方法は 2 つあります。
makedbm -u の出力先を一時ファイルに変更し、一時ファイルを更新し、更新済みの一時ファイルを使用します。
makedbm -u の出力を makedbm に渡されるパイプライン内で動作させます。分解されたマップを awk、sed、または cat で更新できる場合は、この方法を用います。
新しいマップを作成するには、入力として既存のテキストファイルを使用する方法、または入力として標準入力を使用する方法のどちらかを使用できます。
テキストファイル /var/yp/mymap.asc がマスターサーバー上のエディタまたはシェルスクリプトで作成されていると仮定します。この場合、このファイルから NIS マップを作成し、作成された NIS マップを homedomain サブディレクトリに入れるには、マスターサーバー上で次のように入力してください。
# cd /var/yp # makedbm mymap .asc homedomain/mymap
mymap マップは現在、マスターサーバーの homedomain ディレクトリに存在しています。この新しいマップをスレーブサーバーに転送するには、ypxfr を実行してください。
mymap にエントリを追加することは簡単です。最初に、対応するテキストファイルを更新せずに実際の dbm ファイルを更新すると、更新は反映されないので、テキストファイル /var/yp/mymap.asc を更新します。次に、上記のような makedbm を実行してください。
オリジナルのテキストファイルが存在しない場合は、キーボードから makedbm に次のように入力して NIS マップを作成してください (最後に Control-D と入力)。
ypmaster# cd /var/yp ypmaster# makedbm - homedomain/myma key1 value1 key2 value2 key3 value3 ypmaster#
後でマップを更新する必要がある場合は、makedbm でマップを取り出し、一時ファイルを作成できます。マップを分解し、一時ファイルを作成するには、次のように入力してください。
% cd /var/yp % makedbm -u homedomain/ mymap > mymap.temp
作成される一時ファイル mymap.temp には、1 行につき 1 つのエントリが存在します。このファイルは、任意のテキストエディタで必要に応じて編集できます。
マップを更新するには、次のように入力して、更新後の一時ファイル名を makedbm につけます。
% makedbm mymap.temp homedomain/mymap % rm mymap.temp
次に、ルートになり次のように入力してマップをスレーブサーバーに反映させます。
# yppush mymap
ここでは makedbm でマップを作成する方法について説明してきましたが、実際に行わなければならないほとんどすべての作業は、ypinit と Makefile で行うことができます。ただし、システム起動後にデフォルトでないマップをデータベースに追加したり一群の NIS サーバーを変更しない場合に限ります。
/var/yp の Makefile を使用しても他の手順を使用しても、正しく作成された dbm ファイルの新しいペアをマスターサーバー上の maps ディレクトリに入れなければなりません。
マップが更新されると、Makefile が yppush で新しいマップをスレーブサーバーに転送させます (ただし、NOPUSH
が Makefile に設定されていない場合)。転送させるための動作手順は次のとおりです。スレーブサーバー上の ypserv デーモンにマップ転送リクエストを送信します。ypserv デーモンが ypxfr プロセスを起動します。ypxfrd プロセスがマスターサーバー上の ypxfr デーモンに連絡します。いくつかの基本検査 (マップが実際に更新されていることの確認など) が行われます。マップが転送されると、スレーブサーバー上の ypxfrd が、転送が成功したことを yppush プロセスに通知します。
上記手順は、新しく作成されたマップがスレーブサーバー上に存在しない場合は動作しません。新しいマップを、スレーブサーバー上の ypxfr でスレーブサーバーに転送する必要があります。
マップ転送は失敗することがありますが、失敗した場合は ypxfr を使って手作業で新しいマップ情報を転送してください。ypxfr は、2 つの方法で使用できます。1 つはルートの crontab ファイルを定期的に使用する方法であり、もう 1 つはコマンド行から対話形式で使用する方法です。これらの方法については、以下で説明します。
マップの更新頻度は、マップによってそれぞれ異なります。たとえば、デフォルトのマップである protocols.byname やデフォルトでないマップの auto_master など一部のマップは何カ月も更新されないことがありますが、一方、passwd.byname など一部のマップは 1 日に数回更新されることがあります。crontab コマンドでマップ転送をスケジュールすると、個々のマップに対して特定の更新時間を設定できます。
マップに適切な頻度で ypxfr を定期的に実行するには、各スレーブサーバー上のルートの crontab ファイルに、該当する ypxfr エントリを入れる必要があります。ypxfr は、マスターサーバー上のコピーがローカルのコピーより新しい場合に限り、マスターサーバーと連絡をとり、マップを転送します。
デフォルトの -m オプションが指定されている rpc.yppasswdd をマスターサーバー上で実行すると、誰かが yp パスワードを変更するたびに、passwd デーモンが make を実行して passwd マップを作成し直します。
NIS 管理者は、各マップに対する crontab エントリを個々に作成するという方法ではなく、ルートの crontab コマンドでシェルスクリプトを実行してすべてのマップを定期的に更新するという方法を使用することもできます。マップ更新シェルスクリプトのサンプルは、/usr/lib/netsvc/yp ディレクトリに入っています。スクリプト名は、ypxfr_1perday、ypxfr_1perhour、ypxfr_2perday です。これらのシェルスクリプトを、更新または置換することによって、容易にサイト要件に適合させることができます。例 18-1 は、デフォルトの ypxfr_1perday シェルスクリプトを示しています。
#! /bin/sh # # ypxfr_1perday.sh - YP マップの検査・更新を毎日行う PATH=/bin:/usr/bin:/usr/lib/netsvc/yp:$PATH export PATH # set -xv ypxfr group.byname ypxfr group.bygid ypxfr protocols.byname ypxfr protocols.bynumber ypxfr networks.byname ypxfr networks.byaddr ypxfr services.byname ypxfr ypservers
このシェルスクリプトは、ルートの crontab が毎日実行されると、マップを 1 日に 1 回更新します。NIS 管理者は、1 週間に 1 回、1 ヶ月に 1回、または 1 時間に 1 回などといった頻度でマップを更新するスクリプトを使用することもできますが、マップを頻繁に更新すると性能が低下するので注意してください。
NIS ドメインに対して構成された各スレーブサーバー上で同じシェルスクリプトを root で実行してください。各サーバー上の実行時間を変更して、マスターサーバーが動作不能にならないようにしてください。
特定のスレーブサーバーからマップを転送する場合は、シェルスクリプトの ypxfr の -h machine オプションを使用してください。シェルスクリプトに記述するコマンドの構文は、次のとおりです。
/usr/lib/netsvc/yp/ypxfr -h machine [ -c ] mapname
machine は、転送するマップが存在するサーバー名です。mapname は、要求されたマップ名です。マシンを指定することなく -h オプションを指定すると、ypxfr はマスターサーバーからマップを取得しようとします。ypxfr 実行時に ypserv がローカルに実行されていない場合は、ypxfr がローカル ypserver にカレントマップリクエストの取消しを送信しないよう、-c フラグを使用してください。
-s domain オプションを使用すると、別のドメインからローカルドメインにマップを転送できます。これらのマップは、各ドメインにおいて同じでなければなりません。たとえば、2 つのドメインが同じ services.byname マップおよび services.byaddr マップを共有することがあります。また、より細かい制御を行うための rcp または rdist を使用してファイルを複数のドメインに転送することもできます。
2 番目の方法である ypxfr の起動とは、ypxfr をコマンドとして実行することです。一般に、ypxfr をコマンドとして実行するのは例外的状況においてだけです。たとえば、一時的に NIS サーバーを設定して試験環境を作成する場合や、他のサーバーと調和して動作不能になっていた NIS サーバーを迅速に取得しようとする場合などです。
ypxfr が試みた転送およびその転送結果は、ログファイルに記録されます。/var/yp/ypxfr.log というファイルが存在する場合は、転送結果はこのファイルに記録されます。このログファイルのサイズを制限する試みは行われません。このログファイルのサイズが無限に大きくなることを防止するには、ときどき次のように入力してこのログファイルを空にしてください。
# cd /var/yp # cp ypxfr.log ypxfr.log.old # cat /dev/null > /var/yp/ypxfr.log
これらのコマンドは、crontab で週間に 1 回実行させることができます。記録をオフにするには、ログファイルを削除してください。