Zmiany w /etc/hosts
pliku wydają się obowiązywać natychmiast. Jestem ciekawa implementacji. Jaką magię stosuje się, aby osiągnąć tę funkcję?
Zmiany w /etc/hosts
pliku wydają się obowiązywać natychmiast. Jestem ciekawa implementacji. Jaką magię stosuje się, aby osiągnąć tę funkcję?
Odpowiedzi:
Magia polega na otwarciu /etc/hosts
pliku 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/hosts
każ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/hosts
do miksu (np. dnsmasq
Serwer DNS), mogą być używane inotify(7)
do monitorowania zmian w /etc/hosts
plikach i ponownego odczytu tylko w razie potrzeby.
Przeglądarki i inne takie aplikacje tego nie zrobią. Będą się otwierać i czytać za /etc/hosts
każ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.
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/hosts
plik, 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.
/etc/hosts
. Dlaczego nie używa wersji z pamięci podręcznej?