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


18

/etc/hosts파일 변경 사항이 즉시 적용되는 것 같습니다. 구현이 궁금합니다. 이 기능을 달성하기 위해 어떤 마법이 사용됩니까?

  1. Ubuntu에게 물어보기 : / etc / hosts를 수정 한 후 어떤 서비스를 다시 시작해야합니까?
  2. NetApp 지원 : / etc / hosts 파일 작동 방식

5
호스트 파일의 속도에 대한 참고 사항은 일반적으로 아주 작으며 거의 ​​몇 KB를 넘지 않습니다. 파일을 읽는 데 사용 된 컴파일 된 라이브러리보다 작을 가능성이 큽니다. 정기적으로 사용되는 작은 파일은 종종 메모리에 캐시 된 상태로 유지됩니다. 따라서 모든 요청에 ​​대해 파일을 읽더라도 그렇게하기위한 오버 헤드는 최소화됩니다 (즉 : 매우 빠름).
Philip Couling

2
unix.stackexchange.com/questions/388875/… 를 Philip의 의견 과 관련 :)
Jeff Schaller

답변:


27

마술은 /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의 리졸버를 직접 사용하지 않지만 다른 방법으로 작업을 복제하는 경우에도 호스트 이름을 확인해야 할 때마다 열고 읽습니다 .


1
스 니펫의 기능에 대해 더 자세히 설명해 주시겠습니까? 내가 관심있는 것은 변경 사항이 코드 실행에 즉시 반영되는 방법입니다 (OS의 네트워크 부분이어야 함).
rudwna

7
@rudwna : "호스트 이름을 조회 할 때마다 리졸버 (C 라이브러리의 일부)가 / etc / hosts를 열고 읽습니다. 따라서 파일 내용이 읽기간에 변경되면 다음 읽기가 사용됩니다. 새로운 내용 ".
dirkt

3
@rudwna는 또한 "실행 코드"와 관련하여 변경 사항을 즉시 보게되는 이유는 많은 표준 프로그램이 주소를 캐시하지 않기 때문입니다 (또는 / etc / hosts에 대한 업데이트를 수신하는 지능적인 캐싱 전략을 가지고 있음). / etc / hosts에 대한 변경 사항을 즉시 보지 못하고 다시 시작해야하는 프로그램이 있습니다. 코드를 작성한 사람은 전적으로 사람에게 달려 있습니다. / etc / hosts 자체에는 마법이 없습니다.
SamYonnou

9

무엇보다도 이름 확인은에 의해 관리됩니다 /etc/nsswitch.conf. 발췌문은 다음과 같습니다.

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

hosts줄을 참고하십시오 . "호스트 이름을 확인할 때 /etc/hosts파일을 먼저 읽고 호스트 이름을 찾은 다음 찾지 못한 경우 DNS 쿼리를 실행 한 다음 로컬로 구성된 시스템 호스트 이름을 시도하십시오"라고 말합니다.

이것이 왜 그렇게 빠른지에 대한 이유입니다. 머신의 네트워크 서비스에 의존하지 않으므로 다시 시작하거나 다시로드 할 서비스가 없습니다.


1
하지만 캐시 된 (예를 들어, 메인 메모리에 구문 분석) 파일의 버전을 사용하십시오 /etc/hosts. 캐시 버전을 사용하지 않는 이유는 무엇입니까?
Peter Mortensen

2
OS가 이미 파일 액세스를 캐시하고 쓰기를 올바르게 처리하기 때문에 @PeterMortensen.
Michael Borgwardt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.