파일에 대한 변경 사항이 /etc/hosts
즉시 적용되는 것으로 나타납니다. 구현방법이 궁금합니다. 이 기능을 달성하기 위해 어떤 마법이 사용됩니까?
답변1
/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
기능 getaddrinfo(3)
, 즉오직/etc/hosts
표준 이름 확인 인터페이스는 호스트 이름을 확인하기 위해 호출이 이루어질 때마다 열리고 읽혀집니다.
표준을 사용하지 않지만 getaddrinfo(3)
어떤 방식으로든 혼합에 추가 /etc/hosts
하는 더 복잡한 애플리케이션 (예: dnsmasq
DNS 서버)을 사용하여 파일 변경 사항을 inotify(7)
모니터링 /etc/hosts
하고 필요할 때만 다시 읽을 수 있습니다.
브라우저 및 기타 애플리케이션에서는 이 작업을 수행하지 않습니다. /etc/hosts
libc의 파서를 직접 사용하지 않더라도 호스트 이름을 확인해야 할 때마다 열고 읽지 만 다른 방법으로 작동 방식을 복제합니다.
답변2
무엇보다도 이름 확인은 에 의해 관리됩니다 /etc/nsswitch.conf
. 다음은 발췌 내용입니다:
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
(...)
이 줄에 주목하세요 hosts
. "호스트 이름을 확인할 때 먼저 /etc/hosts
파일을 읽어 호스트 이름을 찾으십시오. 찾을 수 없으면 DNS 쿼리를 실행하고, 찾을 수 없으면 로컬로 구성된 시스템 호스트 이름을 시도하십시오."
그렇기 때문에 너무 빠릅니다. 컴퓨터의 네트워크 서비스에 의존하지 않으므로 서비스를 다시 시작하거나 다시 로드할 필요가 없습니다.