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?
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?
Câu trả lời:
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.
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.
/etc/hosts. Tại sao nó không sử dụng phiên bản lưu trữ?