Tại sao các thay đổi đối với / etc / hosts có hiệu lực ngay lập tức?


18

Thay đổi /etc/hoststập tin dường như có hiệu lực ngay lập tức. Tôi tò mò về việc thực hiện. Phép thuật nào được sử dụng để đạt được tính năng này?

  1. Hỏi Ubuntu: Sau khi sửa đổi / etc / hosts, dịch vụ nào cần được khởi động lại?
  2. Hỗ trợ NetApp: Cách tập tin / etc / hosts hoạt động

5
Chỉ cần lưu ý về tốc độ, tệp máy chủ thường rất nhỏ, hiếm khi trên vài KB. Nó hầu như nhỏ hơn thư viện đã biên dịch được sử dụng để đọc tệp. Một tập tin nhỏ được sử dụng thường xuyên sẽ thường được lưu trong bộ nhớ cache. Vì vậy, ngay cả khi tệp được đọc cho mọi yêu cầu, chi phí để thực hiện sẽ rất nhỏ (tức là: rất nhanh).
Philip Couling

2
Liên quan đến unix.stackexchange.com/questions / 388875 / đối với nhận xét của Philip :)
Jeff Schaller

Câu trả lời:


27

Phép thuật đang mở /etc/hoststập tin và đọc nó:

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

Các getaddrinfo(3)chức năng, đó là chỉ tên giải quyết tiêu chuẩn giao diện, sẽ chỉ cần mở và đọc /etc/hostsmỗi lần nó được gọi là để giải quyết một hostname.

Các ứng dụng phức tạp hơn không sử dụng tiêu chuẩn getaddrinfo(3), nhưng vẫn bằng cách nào đó thêm /etc/hostsvào hỗn hợp (ví dụ: dnsmasqmáy chủ DNS) có thể đang sử dụng inotify(7)để theo dõi các thay đổi đối với các /etc/hoststệp và chỉ đọc lại nếu cần.

Trình duyệt và các ứng dụng khác sẽ không làm điều đó. Họ sẽ mở và đọc /etc/hostsmỗi lần họ cần giải quyết tên máy chủ, ngay cả khi họ không sử dụng trực tiếp trình phân giải của libc, nhưng đang sao chép hoạt động của nó bằng các phương tiện khác.


1
Bạn có thể giải thích rõ hơn về những gì đoạn trích làm được không? Điều tôi quan tâm là làm thế nào các thay đổi được phản ánh ngay lập tức khi chạy mã (nên là một phần mạng trong HĐH phải không?).
rudwna

7
@rudwna: Ông có nghĩa là: "Mỗi khi cần tìm tên máy chủ, trình phân giải (một phần của thư viện C) sẽ mở / etc / hosts và đọc nó. Vì vậy, nếu nội dung tệp thay đổi giữa các lần đọc, lần đọc tiếp theo sẽ sử dụng nội dung mới ".
dirkt

3
@rudwna cũng vậy, liên quan đến "mã chạy", lý do bạn thấy thay đổi ngay lập tức là nhiều chương trình tiêu chuẩn không lưu địa chỉ bộ đệm (hoặc chúng có một số chiến lược bộ đệm thông minh lắng nghe cập nhật cho / etc / hosts). Chắc chắn có những chương trình sẽ KHÔNG thấy ngay những thay đổi đối với / etc / hosts và cần được khởi động lại. Nó hoàn toàn phụ thuộc vào bất cứ ai đã viết mã. Không có gì kỳ diệu về / etc / hosts chính nó.
SamYonnou

9

Tên giải quyết, trong số những thứ khác, được quản lý bởi /etc/nsswitch.conf. Đây là một đoạn trích:

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

Lưu ý các hostsdòng. Nó nói: "Khi giải quyết tên máy chủ, trước tiên hãy đọc /etc/hoststệp để tra cứu tên máy chủ, nếu không tìm thấy thì hãy chạy truy vấn DNS, nếu không tìm thấy thì hãy thử tên máy chủ được định cấu hình cục bộ".

Vì vậy, đây là lý do tại sao nó rất nhanh. Lưu ý rằng nó không phụ thuộc vào các dịch vụ mạng trên máy, vì vậy không có dịch vụ nào để khởi động lại hoặc tải lại.


1
Nhưng nó có thể sử dụng một phiên bản của bộ nhớ cache (giả sử, được phân tích cú pháp và trong bộ nhớ chính) /etc/hosts. Tại sao nó không sử dụng phiên bản lưu trữ?
Peter Mortensen

2
@PeterMortensen vì HĐH đã lưu trữ quyền truy cập tệp và thậm chí xử lý ghi chính xác.
Michael Borgwardt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.