web-dev-qa-db-ja.com

MacOS Sierra上の/ etc / resolver /の変更が気付かれる原因

特定のドメインにデフォルト以外のDNSリゾルバーを使用したかったのですが、最初のアイデアは、単にローカルのdnsmasqを使用することでした。 MacOSのバージョンを探しているときに、/etc/resolver/example.comにドメイン名を含むファイルを作成するだけで同じことができることがわかりました。

nameserver 8.8.8.8

すべて良好で、期待どおりに機能し、解決策は機能し、scutil --dnsは次のことを確認します。

resolver #8
  domain   : example.com
  nameserver[0] : 8.8.8.8
  flags    : Request A records
  reach    : Reachable

次に、私はこれを友人と共有したいと思いました。彼の端末で実行できるシンプルなワンライナーを作成することです。

Sudo mkdir -p /etc/resolver/ && echo "nameserver 8.8.8.9" | Sudo tee /etc/resolver/example.net

繰り返しますが、scutil --dnsは次のことを確認します。

resolver #10
  domain   : example.net
  nameserver[0] : 8.8.8.9
  flags    : Request A records
  reach    : Reachable

その後、タイプミスに気付いたので、アドレスを8.8.8.8に修正して、もう一度行を実行しました。

Sudo mkdir -p /etc/resolver/ && echo "nameserver 8.8.8.8" | Sudo tee /etc/resolver/example.net

しかし、それは何の効果もないようでした:

resolver #10
  domain   : example.net
  nameserver[0] : 8.8.8.9
  flags    : Request A records
  reach    : Reachable

ファイルの内容を確認したところ、すべて問題ないように見えました。

$ cat /etc/resolver/example.net 
nameserver 8.8.8.8

次に、vimでファイルを開き、8.8.4.4に変更しました。

resolver #10
  domain   : example.net
  nameserver[0] : 8.8.4.4
  flags    : Request A records
  reach    : Reachable

何度か確認しましたが、アドレスをファイルにエコーしても変更は効果がありませんが、vimで開くだけで十分で、何も変更せず(終了するだけ)、以前はエコーされた変更が適用されます。この背後にあるメカニズムは何ですか?

7
Dusan Bajic

[それ]はvimで開くだけで十分で、何も変更せず(単に終了するだけ)、以前にエコーされた変更が適用されます。

Sudo vimが機能します。通常のユーザーで実行しても効果はありません。私の理論は、何を見ても/etc/resolverはディレクトリへの変更を監視し、ディレクトリ内のファイルへの変更は監視しません。ディレクトリへの変更を検出すると、はディレクトリ内のすべてを再ロードします。 Vimは、デフォルトでは編集中のファイルと同じディレクトリにスワップファイルを作成します。これはディレクトリへの変更であり、ウォッチャーによってピックアップされます。だから、私がしたとき:

Sudo vim -n /etc/resolver/example.net

どこ -nスワップファイルの作成を無効にします。ファイルへの変更はピックアップされなくなりました。

4
muru

/etc/resolver内の既存のファイルへの変更は通知されず、そのフォルダでファイルが作成または削除されたときにのみ通知されます。

このフォルダを監視するのは、IPMonitorconfigdプラグインです。
ソースコードから:

status = notify_monitor_file(notify_token, resolver_directory_path, 0);

そして、この関数は、パスのinodeにモニターを設定します。そのため、/etc/resolverinodeが変更された場合にのみ通知が送信され、そのディレクトリ内のファイルのinodeが変更された場合は送信されません。

UNIXでは、ディレクトリは、その内容がディレクトリの内容をリストするテーブルであるファイルのようなものです。したがって、ファイルを追加または削除すると、このテーブルが更新されるため、inodeも更新され、通知がトリガーされます。ディレクトリ内のファイルを編集する場合、ディレクトリのinodeは一切変更されません。

ただし、macOSでは/etc/resolverを使用しないでください。下位互換性のためにのみ残されています。代わりに、scutilツールを使用してアクセスできるダイナミックストアにDNSエントリを作成する必要があります。ぜひチェックしてください このトピックに関する私の返信

0
Mecki

コンピューターを再起動するか、ネットワークデバイスのDNS設定を強制的に更新するまで、次のようにscutil --dnsで期待どおりのDNSエントリを返すことができませんでした。

networksetup -setdnsservers Wi-fi 8.8.8.8

この修正/ハックの詳細をここに書き留めます: https://josephharding.github.io/tutorials/2018/06/28/mac-resolver-refresh.html

0
joe