/etc/hosts
ファイルへの変更はすぐに有効になるようです。実装に興味があります。この機能を実現するためにどのような魔法が使われていますか?
マジックは、_/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
_を開いて読み取りますが、他の方法でその動作を複製しています。
名前解決は、とりわけ/etc/nsswitch.conf
によって管理されます。以下は抜粋です。
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
(...)
hosts
行に注意してください。 「ホスト名を解決するときに、最初に/etc/hosts
ファイルを読み取ってホスト名を検索し、見つからない場合はDNSクエリを実行します。見つからない場合は、ローカルに構成されたシステムホスト名を試します」。
これがとても速い理由です。マシンのネットワークサービスに依存しないため、再起動または再ロードするサービスがないことに注意してください。