Mengapa perubahan pada / etc / hosts segera berlaku?

18

Perubahan ke /etc/hostsfile tampaknya segera berlaku. Saya ingin tahu tentang implementasinya. Sihir apa yang digunakan untuk mencapai fitur ini?

  1. Tanya Ubuntu: Setelah memodifikasi / etc / hosts, layanan mana yang perlu direstart?
  2. Dukungan NetApp: Cara kerja file / etc / hosts
rudwna
sumber
5
Hanya catatan tentang kecepatan file host biasanya kecil, jarang di atas beberapa KB. Kemungkinan besar lebih kecil dari pustaka yang dikompilasi yang digunakan untuk membaca file. File kecil yang sering digunakan secara teratur akan tetap tersimpan dalam memori. Jadi, bahkan jika file itu dibaca untuk setiap permintaan, overhead untuk melakukannya akan minimal (yaitu: sangat cepat).
Philip Couling
2
Menghubungkan unix.stackexchange.com/questions/388875/... dengan komentar Philip :)
Jeff Schaller

Jawaban:

27

Keajaiban membuka /etc/hostsfile dan membacanya:

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

The getaddrinfo(3)fungsi, yang merupakan satu-satunya nama menyelesaikan standar antarmuka, hanya akan membuka dan membaca /etc/hostssetiap kali dipanggil untuk menyelesaikan nama host.

Aplikasi yang lebih canggih yang tidak menggunakan standar getaddrinfo(3), tetapi masih entah bagaimana menambah /etc/hostscampuran (misalnya dnsmasqserver DNS) mungkin digunakan inotify(7)untuk memantau perubahan pada /etc/hostsfile dan membaca kembali hanya jika diperlukan.

Browser dan aplikasi semacam itu tidak akan melakukan itu. Mereka akan membuka dan membaca /etc/hostssetiap kali mereka perlu menyelesaikan nama host, bahkan jika mereka tidak menggunakan resolib libc secara langsung, tetapi mereplikasi kerjanya dengan cara lain.

mosvy
sumber
1
Bisakah Anda menguraikan lebih lanjut tentang apa yang potongannya lakukan? Yang saya tertarik adalah bagaimana perubahan itu langsung tercermin dalam menjalankan kode (harus menjadi bagian jaringan di OS kan?).
rudwna
7
@rudwna: Maksudnya: "Setiap kali nama host perlu dilihat, resolver (bagian dari pustaka C) membuka / etc / hosts dan membacanya. Jadi jika isi file berubah di antara read, read selanjutnya akan menggunakan isi baru ".
dirkt
3
@rudwna juga, berkenaan dengan "menjalankan kode", alasan Anda melihat perubahan segera adalah bahwa banyak program standar tidak menembolokkan alamat (atau mereka memiliki beberapa strategi caching cerdas yang mendengarkan pembaruan ke / etc / hosts). Tentunya ada program di luar sana yang TIDAK akan segera melihat perubahan pada / etc / hosts dan perlu di-restart. Semuanya tergantung pada siapa pun yang menulis kode. Tidak ada yang ajaib tentang / etc / hosts itu sendiri.
SamYonnou
9

Resolusi nama, antara lain, dikelola oleh /etc/nsswitch.conf. Berikut ini kutipannya:

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

Perhatikan hosts barisnya. Bunyinya: "Ketika menyelesaikan nama host, pertama-tama baca /etc/hostsfile untuk mencari nama host, jika tidak ditemukan kemudian jalankan permintaan DNS, jika tidak ditemukan kemudian coba sistem nama host yang dikonfigurasi secara lokal".

Jadi, inilah mengapa sangat cepat. Perhatikan bahwa itu tidak tergantung pada layanan jaringan pada mesin, jadi tidak ada layanan untuk memulai ulang atau memuat ulang.

dr01
sumber
1
Tapi itu bisa menggunakan versi file yang di-cache (katakan, diurai dan di memori utama) /etc/hosts. Mengapa tidak menggunakan versi cache?
Peter Mortensen
2
@PeterMortensen karena OS sudah melakukan cache akses file, dan bahkan menangani penulisan dengan benar.
Michael Borgwardt