◆ NetInfo

MacOS X ではユーザ・データベースなどは NetInfo を用いて管理されています. したがって, Multi-user mode では /etc/passwd などに書かれている情報は, すべて無視されてしまいます. これら NetInfo の情報は, /var/db/netinfo/ に保存されています.

◆ NetInfo の概要

NetInfo は NEXTSTEP で用いられている「ディレクトリ・サービス」ですので, NEXTSTEP (OPENSTEP) のユーザにはなじみが多いものですが, 他の UNIX ユーザは戸惑うことが多いと思います.
NetInfo は local database を葉に持つツリー構造を持つデータベースで, MacOS X 上では nibind コマンドにより, 上位のデータベースへ bind されています.
NetInfo データベースを参照する各コマンドは, local データベースから順にツリーを上にたどることにより, 必要なデータを探していきます. その際に, ツリーを下に下がることはしません.

◆ NetInfo の構成例[1]

ここでは, 2段にわたる NetInfo データベース・ツリーの構成例を考えてみます.
ここで利用するホストは3台 (host0, host1, host2) で, host0 上に "network" というタグのついたデータベースを用意し, これをルートドメインとします.
host1          host0            host2
  |              |                |
  +------- network  / ------------+
  |              |                |
local host1  local host0     locat host2
この図で "network /" とあるのは, データベースのタグ名が "network" で, このデータベースが root domain であることを表しています. また, "local host1" とあるのは, host1 上の local データベースを表します.
このとき, host1 でデータベースの検索が行われた場合には, host1/local が最初の検索対象となり, そこにエントリが見つからなければ, host2/network に検索対象が移動します. そこでもエントリが見つからなければ, データベースから "not found" という答えがかえされます.

◆ NetInfo の構成例[2]

より複雑に, 以下のような NetInfo データベース・ツリーの構成例を考えてみます.
ここで利用するホストは3台 (host0, host1, host2) で, host0 上に "network" というタグのついたデータベースを用意し, これをルートドメインとします. また, host2 上には, network データベースのクローンサーバを用意し, さらに host1 上に subnetwork というデータベースを用意して, 以下のような構成を行うことを考えます.
host1          host0            host2
  |              |                |
  +------- network  / ------- (network /)
  |                               |
subnetwork                        |
  |                               |
  +-------------+                 |
  |             |                 |
local host1  local host0     locat host2
この構成の場合, host1 での検索は, はじめに local データベースを検索した後, subnetwork へ検索対象が移動し, 最終的に network へ移動します.
一方, host2 での検索は local データベースの検索の後, network データベースへ検索が移動します.

◆ 上位データベースへのバインド

NetInfo では, 上位のデータベースを持つサーバは, 各データベースで上位データベースのタグ名を指定し, 起動時に broadcast でそのデータベースを持つサーバを探すことにより, データベースのバインドが行われます.
したがって, 上位データベースは broadcast domain 内に存在することが必要になりますから, 複数のサブネットにまたがって NetInfo domain を構築する場合には, 必要に応じてクローンサーバを置くことが必要になります.

◆ NetInfo の操作コマンド

上に書いた, 上位データベースの指定, データベースの内容の表示など, NetInfo の情報を操作するためには, NetInfoManager と呼ばれる, GUI インターフェースの操作パネルがありますが, MacOS X Public Beta の NetInfoManager には各種の BUG があり, NetInfoManager では netinfo を十分には操作できません.
そのため, nidomain , niutil , nidump , niload などのコマンドを利用して, NetInfo の情報を操作することになります.

◆ nibind

nibind は NetInfo を起動するコマンドで, /var/db/netinfo/ 以下にある NetInfo データベースにしたがって, netinfod というデータベースごとの daemon を起動します. これは, 起動時に DirectoryService から起動されます.
たとえば, local と network という2つのデータベースがあるときには, netinfod はそれぞれのデータベースに対応して2つのプロセスが起動されます. netinfod は RPC のプログラムなので, portmapper を経由することにより, netinfod のポートを知ることが出来ます. つまり, NetInfo を利用する際には portmapper は必須のプログラムとなります. しかし, portmapper が無制限のアクセスを許していると, セキュリティ上重大な問題を引き起こすことがあり得ますので, 注意が必要です. 現状で portmapper で tcpwrap が有効かどうかはわかりません.

◆ nidomain

新しく NetInfo データベースを作成したり, NetInfo データベースを削除したり, クローンサーバを構成したりするときに利用します.
nidomain -m network                   "network" データベースを作成する.
nidomain -d network                   "network" データベースを削除する.
nidomain -l                           データベースのリストを得る.
nidomain -c network master/network    master 上の tag データベースのクローンを作成する.

◆ niutil

niutil は NetInfo データベースを操作するときに利用する一般的なコマンドです.
local な NetInfo データベースの root node の一覧を見るには,
niutil -list . /
とします. ここで, "." は NetInfo データベースへの最初のエントリポイントを表します. "." のかわりに ".." とすると, その直上のデータベースを参照することになります.
"/" は, データベースの root node を表します. 上のコマンド実行すると,
1        users
7        groups
30       machines
34       networks
36       protocols
51       rpcs
80       services
142      aliases
151      mounts
152      printers
153      config
159      localconfig
といったリストを得ることが出来ます. そこで,
niutil -read . /
を実行すると,
trusted_network:
master: localhost/local
という結果を得ます. ここで, "trusted_network", "master" が "/" の property 言われる変数です.
niutil -list . /users
を実行すると,
2        unknown
3        nobody
4        root
5        daemon
6        www
という結果を得ることができ, これらを繰り返すことにより, NetInfo データベースの内容を参照することが出来ます.
また,
niutil -create      
niutil -destroy     
niutil -createprop  
niutil -appendprop  
niutil -mergeprop   
niutil -insertval   
niutil -destroyprop 
niutil -destroyval  
niutil -renameprop  
などのコマンドを利用すれば, データベースの内容や property を変更することが出来ます.

ここで, 注意が必要なことは, NetInfo データベースとして, ホストとタグの組 "localhost/local" を直接指定したいときには,

niutil -t -list localhost/local /users
のように "-t" オプションが必要です.

◆ nidump

nidump は NetIndo データベースの内容を raw format または, UNIX flat 形式で出力します.
# nidump passwd . /
unknown:*:-3:-3::0:0:Unknown User:/dev/null:/dev/null
nobody:*:-2:-2::0:0:Unprivileged User:/dev/null:/dev/null
root:*:0:0::0:0:System Administrator:/var/root:/bin/tcsh
daemon:*:1:1::0:0:System Services:/var/root:/dev/null
www:*:70:70::0:0:World Wide Web Server:/Library/WebServer:/dev/null
nidump に指定可能な format は aliases, bootptab, bootparams, ethers, exports, fstab, group, hosts, networks, passwd, printcap, protocols, resolv.conf, rpc, services, mountmaps に限られます. 逆に言えば, これらの情報を NetInfo を用いてクライアントに渡すことが可能です.

◆ niload

niload は NetInfo データベースに UNIX flat ファイル形式でデータを登録するためのコマンドです. 入力は標準入力から行われます.
ここで注意が必要なことは, 既に存在しているデータベースエントリを overwrite することは可能ですが, 削除することは出来ません. (本当かな?)
たとえば, ユーザ "XXXX" を削除する場合には,
niutil -t -destroy . /users/XXXX
を用います.

next


naito@math.nagoya-u.ac.jp
$Id: netinfo.html,v 1.5 2001-05-21 16:31:52+09 naito Exp $