Dlaczego zmiany w / etc / hosts zaczynają obowiązywać natychmiast?


18

Zmiany w /etc/hostspliku wydają się obowiązywać natychmiast. Jestem ciekawa implementacji. Jaką magię stosuje się, aby osiągnąć tę funkcję?

  1. Zapytaj Ubuntu: Po modyfikacji / etc / hosts, którą usługę należy zrestartować?
  2. Obsługa NetApp: Jak działa plik / etc / hosts

5
Tylko uwaga na temat prędkości pliku hosts jest zazwyczaj niewielki, rzadko powyżej kilku KB. Najprawdopodobniej jest mniejszy niż skompilowana biblioteka używana do odczytu pliku. Mały regularnie używany plik często pozostaje w pamięci podręcznej. Zatem nawet gdyby plik był czytany przy każdym żądaniu, narzut związany z tym byłby minimalny (tj. Bardzo szybki).
Philip Couling,

2
Powiązanie unix.stackexchange.com/questions/388875/... z komentarzem Philipa :)
Jeff Schaller

Odpowiedzi:


27

Magia polega na otwarciu /etc/hostspliku i jego odczytaniu:

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)Funkcja, która jest tylko nazwa rozwiązywania standardowy interfejs, po prostu otworzyć i przeczytać /etc/hostskażdym razem, gdy jest powołany, aby rozwiązać nazwę hosta.

Bardziej wyrafinowane aplikacje, które nie używają standardu getaddrinfo(3), ale wciąż w jakiś sposób dodają /etc/hostsdo miksu (np. dnsmasqSerwer DNS), mogą być używane inotify(7)do monitorowania zmian w /etc/hostsplikach i ponownego odczytu tylko w razie potrzeby.

Przeglądarki i inne takie aplikacje tego nie zrobią. Będą się otwierać i czytać za /etc/hostskażdym razem, gdy będą musieli rozwiązać nazwę hosta, nawet jeśli nie korzystają bezpośrednio z resolvera libc, ale replikują jego działanie w inny sposób.


1
Czy możesz bardziej szczegółowo opisać, co robi ten fragment kodu? Interesuje mnie to, jak zmiany są natychmiast odzwierciedlane w uruchomionym kodzie (czy powinien być częścią sieci w systemie operacyjnym, prawda?).
rudwna

7
@rudwna: Ma na myśli: „Za każdym razem, gdy trzeba wyszukać nazwę hosta, resolver (część biblioteki C) otwiera / etc / hosts i odczytuje. Więc jeśli zawartość pliku zmieni się między odczytami, użyje następnego odczytu nowa zawartość ".
bezpośrednio

3
@ rudwna również, jeśli chodzi o „uruchamianie kodu”, powodem, dla którego natychmiast widzisz zmiany, jest to, że wiele standardowych programów nie buforuje adresów (lub mają inteligentną strategię buforowania, która nasłuchuje aktualizacji / etc / hosts). Z pewnością istnieją programy, które NIE zobaczą natychmiast zmian w / etc / hosts i trzeba je zrestartować. To zależy wyłącznie od tego, kto napisał kod. W samym pliku / etc / hosts nie ma nic magicznego.
SamYonnou,

9

Rozpoznawaniem nazw, między innymi, zarządza /etc/nsswitch.conf. Oto fragment:

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

Zanotuj hosts linię. Mówi: „Podczas rozwiązywania nazwy hosta najpierw przeczytaj /etc/hostsplik, aby wyszukać nazwę hosta, jeśli nie zostanie znaleziony, a następnie uruchom zapytanie DNS, jeśli nie zostanie znaleziony, wypróbuj lokalnie skonfigurowaną nazwę hosta systemu”.

Oto dlaczego jest tak szybki. Pamiętaj, że nie zależy to od usług sieciowych na komputerze, więc nie ma usługi do ponownego uruchomienia lub ponownego załadowania.


1
Ale może użyć buforowanej (powiedzmy, przeanalizowanej i w głównej pamięci) wersji pliku /etc/hosts. Dlaczego nie używa wersji z pamięci podręcznej?
Peter Mortensen

2
@PeterMortensen, ponieważ system operacyjny już buforuje dostęp do plików, a nawet poprawnie zapisuje.
Michael Borgwardt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.