MacOS Sierraで/etc/resolver/が変更される原因は何ですか?

MacOS Sierraで/etc/resolver/が変更される原因は何ですか?

特定のドメインに対してデフォルトではないDNSリゾルバを使用したいのですが、最初のアイデアは単にローカルdnsmasqを使用することです。 MacOSのバージョンを探している間、次のような単純な1行でドメイン名を/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

次に、端末で実行できる簡単な1行コードを作成して、友​​達と共有したいと思いました。

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(終了のみ)、以前にエコーされた変更が適用されます。これのメカニズムは何ですか?

答え1

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

sudo vim仕事に使うべきです。通常のユーザーとして実行しても効果はありません。私の理論は、/etc/resolverディレクトリ内のファイルではなくディレクトリへの変更を監視し、ディレクトリへの変更を見つけたら、その中のすべてを再ロードすることです。 Vimは、デフォルトで編集中のファイルと同じディレクトリにあるスワップファイルを作成します。これはディレクトリへの変更であり、オブザーバによって検出されます。だから私がするとき:

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

スワップファイルの作成が無効になると、-nファイルの変更は適用されなくなります。

答え2

既存のファイルの変更は、/etc/resolverフォルダ内のファイルが作成または削除されたときにのみ認識されません。

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

status = notify_monitor_file(notify_token, resolver_directory_path, 0);

この機能の目的は、inodeパスにモニタを設定することです。したがって、そのディレクトリのファイルが変更されinodeたときにのみ通知を受け取ります/etc/resolverinode

UNIXでは、ディレクトリは、ディレクトリの内容を一覧表示するテーブルの内容を含むファイルと同じです。したがって、ファイルを追加または削除するたびにテーブルが更新され、それに応じて更新され、inode通知がトリガーされます。ディレクトリ内のファイルを編集する場合、inodeそのディレクトリはまったく触れません。

しかし、/etc/resolvermacOSではまったく使用しないでください。以前のバージョンとの互換性のためにのみ維持されます。代わりに、ツールを使用してアクセスできる動的リポジトリにDNSエントリを作成する必要がありますscutil。確認してくださいこのトピックに対する私の答え

答え3

コンピュータを再起動するか、ネットワークデバイスのDNS設定を強制的に更新するまで、scutil --dns予想されるDNSエントリを再インポートすることはできません。

networksetup -setdnsservers Wi-fi 8.8.8.8

この修正/ハッキングの詳細についてはこちらをご覧ください。https://josephharding.github.io/tutorials/2018/06/28/mac-resolver-refresh.html

関連情報