MacOSXは "localhost"を認識しないのか?

Last described 14-Jan-2002

1. 効能書き

 MacOSXで、以下の現象にお悩みの方は、このページを読めば解決するかもしれません。
  1. "localhost" のホスト名解決に失敗する(異常に遅い)。
  2. "/etc/hosts" ファイルによる設定を使いたい。
  3. インターネットにアクセスしていないのに、ダイアルアップルータが勝手に電話をかける。
  4. NetInfo Managerの反応が異常に遅い(ハングアップする)。
  5. DHCPを使う設定にすると、ネットワークの調子がおかしい。
※本編は、MacOSX 10.1.x を対象に記述したものです。 10.2.x では上記のような問題はありません。

2. 症状の確認

 Terminalを起動して、コマンドラインから以下のようにpingしてみて下さい。 下記と同等の現象が発生するようであれば、多分このページに記載していることと原因は同じです。 また、"/etc/host"ファイルをお使いの方が、ホスト名を置き換えてチェックしてみても同様のはずです。
[localhost:~] terra% ping localhost
ping: unknown host localhost
[localhost:~] terra% 

もしくは、数十秒待たされてから、正常に続行する。 ※ダイアルアップルータに自動接続を設定している場合は、このタイミングで電話をかける。 PING localhost (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.217 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0.235 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=255 time=0.224 ms ^C ←キーボードから [control]+[C]を入力して停止させる --- localhost ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.217/0.225/0.235 ms [localhost:~] terra%

3. MacOSXにおけるホスト名解決の仕組み

 さて、原因について言及する前に、MacOSXのホスト名解決の仕組みを簡単に説明しておきます。
 ホスト名解決の原理は、「ホスト名とネット・ワークアドレスの対応情報」をどこかで保有しておき、 必要に応じてこれらの情報を検索/参照するだけですが、これらの対応情報をどのような形式で、 どのコンピュータに持たせ、どう検索/参照するかにより様々な方式が存在する訳です。 MacOSXには"/etc/hosts"ファイルやDNSによる方法以外にも下表のような方式が存在し、 これらを組み合わせてホスト名解決を行います。
方式 対応情報の保有機 lookupdのAgent
/etc/hostsファイル 自機 FFAgent
NetInfoデータベース
(/machines)
自機 or サーバ(他機) NIAgent
DNS サーバ(他機) or 自機 DNSAgent
NIS YPAgent
LDAP LDAPAgent
 MacOSXでは、lookupdという特殊なデーモンがこれらの方式を組み合せて実行します。 各方式の実行順序や組み合せ方は、NetInfoデータベース(/locations)に定義されており lookupdはこの定義に基づいて動作します。 各方式毎にAgentと呼ばれるモジュールが対応しているので、 定義書式でもこれらのAgent名を指定して記述します。
 ちなみに、ダイアルアップルータが勝手に電話をかけるのは、プロバイダのDNSサーバにアクセスするためです。 ですから、DNSより先にhostsファイルやNetInfoデータベースでホスト名解決できれば症状は治まりますし、 ダイアルアップルータがDNS機能を有しているのであれば、そちらでホスト名解決をさせても症状は治まります。

※NetInfoデータベース(/locations)以外にも、/etcディレクトリ以下のファイルでも定義可能。

4. うそのような・・原因

 上記症状が起きるのは、どうやらFFAgentやNIAgentを実行していないのが直接の原因のようです。 無論、肝心な「ホスト名とネット・ワークアドレスの対応情報」が定義されていないという可能性もある訳ですが、 さすがに"localhost"ぐらいはデフォルトで定義されているのが実情のようです。

 さて、なぜFFAgentやNIAgentを実行しないのかその理由についてですが、先に述べた各方式(Agent)の 実行順序や組み合せ方がどこにも記述されていないことに起因しているようです。 うそのような話ですが、私の実機で確認する限りではそうなのです。 以下に確認した状態を示します。
NetInfo Managerでの表示(1)

[localhost:~] terra% nidump -r locations . ¶    # ←定義情報を何も表示せずに終了
[localhost:~] terra% 
※私の場合、MacOSX 10.0.4から10.1にバージョンアップした段階で発症しました。 ですから確認したのも10.1以降のことになります。
※MacOSX 10.2.x をクリーンインストールした状態でも、`nidump -r locations .` による実行結果は同じでした。 しかし、10.2.x では何の問題も発生していませんし、何もしなくても /etc/hosts ファイル等もそのまま使えます。 10.2.x 付属の lookupd のデフォルト動作では、全ての Agent が有効になっていると判断するのが妥当のようです。

5. 治療の方向

 ということで、NetInfoデータベースに各Agentの実行順序や組み合せ方を定義すれば良いことは判りました。 結果を先に示しますが、私の場合は以下のような状態になります。 治療方法は幾つかありますが、このようになることを目標に作業を進めれば良いでしょう。
NetInfo Managerでの表示(2)
[localhost:~] terra% nidump -r locations . ¶    # ←当然、治療後には定義情報が表示される
{
  "name" = ( "locations" );
  CHILDREN = (
    {
      "LookupOrder" = ( "CacheAgent", "NIAgent" );
      "name" = ( "lookupd" );
      CHILDREN = (
        {
          "LookupOrder" = ( "CacheAgent", "NIAgent", "DNSAgent", "NILAgent" );
                            # ↑/etc/hostsを使う場合は、"FFAgent"もこのリストに加える
          "name" = ( "hosts" );
          "ValidateCache" = ( "NO" );
        }
      )
    }
  )
}
[localhost:~] terra% 
※Agentは、3.で述べたものに加え、CacheAgentとNILAgentの合計7つが存在する。

6. 治療手段、それが問題

 さて問題は、どうやってNetInfoデータベースに定義情報を書き込むか、です。
 "NetInfo Manager"(/Applications/Utilities/NetInfo Manager)を使うなら、 GUIで簡単にNetInfoデータベースの編集ができるはずです。 しかし、気をつけなければならないのは、"localhost"も検索できないような状態で "NetInfo Manager"を起動してしまうとハングアップした様になるということです。 NetInfoデータベースを参照する時に"localhost"を検索するのが理由のようですが、 なんとも間抜けな話です。
 上記のような問題を避けてNetInfoデータベースに定義情報を書き込むには、以下のような方法があります。 ものぐさな私は、当然のごとく方法 iii.で切り抜けていたりします。(^_^;
  1. niutil, niload, nicl等のコマンドを駆使して、NetInfoデータベースを操作する。 →例
  2. NetInfoデータベースの代りに、"/etc/lookupd/hosts"ファイルを記述する。 このまま使用してもOKだが、この隙に"NetInfo Manager"を起動して定義情報を書き込む。
  3. DHCPを利用している場合は、DNSサーバに接続可能な状況を作り "localhost"の名前解決を DNSサーバに実行させる。この隙に "NetInfo Manager"を起動して定義情報を書き込む。

7. そもそも、ことの起こりは・・

 MacOSX 10.0.4から10.1にバージョンアップした段階で、"localhost"を IPアドレスに変換する動作(ホスト名解決)が、異常に遅くなるという現象が発生しました。 その後、10.1→10.1.1→10.1.2とアップデートしても同様です。
 ただし、この問題はDHCPサーバ/ルータを利用する時にのみ発生するようですので、 10.1以上の利用者全員に起きる問題とは限らないと思っています。 しかも、上述した様にDNSサーバが解決してくれる状況では、症状に気付きにくいと言うおまけ付きですしネ。

8. 参考文献

 NetInfoやlookupdについて書くのが面倒なので、manや他の資料を参考にして下さい。
[HOME] > [INDEX]

Appendix

◆「hostsファイル」中の "localhost"定義を確認する方法

[localhost:~] terra% cat /etc/hosts ¶
##
# Host Database
...
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost        # ←この行があればOK
255.255.255.255 broadcasthost

◆「NetInfoデータベース」中の "localhost"定義を確認する方法

[localhost:~] terra% nidump hosts . ¶
127.0.0.1       localhost        # ←この行があればOK
255.255.255.255 broadcasthost
255.255.255.255 -DHCP-


◆ niclコマンドにより、lookupdの動作定義を行う方法

[localhost:~] terra% sudo nicl . create /locations/lookupd/hosts    ※次の行へ続く
                       LookupOrder CacheAgent NIAgent DNSAgent NILAgent ¶
Password:    # ←管理者用パスワードを入力

# 必要であれば、更に以下のコマンドを打ち込んでおく。 [localhost:~] terra% sudo nicl . create /locations/lookupd/hosts ValidateCache NO ¶ [localhost:~] terra% sudo nicl . create /locations/lookupd LookupOrder CacheAgent NIAgent ¶
# "/etc/hosts"ファイルを主に使うのであれば、最初のコマンドにFFAgentを加えておく。
[localhost:~] terra% sudo nicl . create /locations/lookupd/hosts    ※次の行へ続く
                       LookupOrder CacheAgent FFAgent NIAgent DNSAgent NILAgent ¶

[HOME] > [INDEX]
(c) Kazufumi Terada, 2001-2002