/etc/hosts에 대한 변경 사항이 즉시 적용되는 이유는 무엇입니까?

/etc/hosts에 대한 변경 사항이 즉시 적용되는 이유는 무엇입니까?

파일에 대한 변경 사항이 /etc/hosts즉시 적용되는 것으로 나타납니다. 구현방법이 궁금합니다. 이 기능을 달성하기 위해 어떤 마법이 사용됩니까?

  1. Ubuntu에 문의하세요: /etc/hosts를 수정한 후 어떤 서비스를 다시 시작해야 합니까?
  2. NetApp 지원: /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하는 더 복잡한 애플리케이션 (예: dnsmasqDNS 서버)을 사용하여 파일 변경 사항을 inotify(7)모니터링 /etc/hosts하고 필요할 때만 다시 읽을 수 있습니다.

브라우저 및 기타 애플리케이션에서는 이 작업을 수행하지 않습니다. /etc/hostslibc의 파서를 직접 사용하지 않더라도 호스트 이름을 확인해야 할 때마다 열고 읽지 만 다른 방법으로 작동 방식을 복제합니다.

답변2

무엇보다도 이름 확인은 에 의해 관리됩니다 /etc/nsswitch.conf. 다음은 발췌 내용입니다:

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

이 줄에 주목하세요 hosts. "호스트 이름을 확인할 때 먼저 /etc/hosts파일을 읽어 호스트 이름을 찾으십시오. 찾을 수 없으면 DNS 쿼리를 실행하고, 찾을 수 없으면 로컬로 구성된 시스템 호스트 이름을 시도하십시오."

그렇기 때문에 너무 빠릅니다. 컴퓨터의 네트워크 서비스에 의존하지 않으므로 서비스를 다시 시작하거나 다시 로드할 필요가 없습니다.

관련 정보