web-dev-qa-db-ja.com

/ etc / hostsへの変更がすぐに有効になるのはなぜですか?

/etc/hostsファイルへの変更はすぐに有効になるようです。実装に興味があります。この機能を実現するためにどのような魔法が使われていますか?

  1. buntuに質問:/ etc/hostsを変更した後、どのサービスを再起動する必要がありますか?
  2. ネットアップサポート:/ etc/hostsファイルの仕組み
18
rudwna

マジックは、_/etc/hosts_ファイルを開いて読み取ることです。

_strace -e trace=file wget -O /dev/null http://www.google.com http://www.facebook.com http://unix.stackexchange.com 2>&1 | grep hosts
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 5
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4
_

only標準の名前解決インターフェイスであるgetaddrinfo(3)関数は、ホスト名を解決するために呼び出されるたびに_/etc/hosts_を開いて読み取るだけです。

標準getaddrinfo(3)を使用していないが、何らかの方法で_/etc/hosts_をミックスに追加しているより高度なアプリケーション(例:dnsmasq DNSサーバー)はinotify(7)を使用している可能性があります_/etc/hosts_ファイルへの変更を監視し、必要な場合にのみ再読み取りします。

ブラウザや他のそのようなアプリケーションはそれをしません。 libcのリゾルバーを直接使用していなくても、ホスト名を解決する必要があるたびに_/etc/hosts_を開いて読み取りますが、他の方法でその動作を複製しています。

27
mosvy

名前解決は、とりわけ/etc/nsswitch.confによって管理されます。以下は抜粋です。

passwd:     files sss
shadow:     files sss
group:      files sss
hosts:      files dns myhostname
(...) 

hosts行に注意してください。 「ホスト名を解決するときに、最初に/etc/hostsファイルを読み取ってホスト名を検索し、見つからない場合はDNSクエリを実行します。見つからない場合は、ローカルに構成されたシステムホスト名を試します」。

これがとても速い理由です。マシンのネットワークサービスに依存しないため、再起動または再ロードするサービスがないことに注意してください。

9
dr_