Thay đổi /etc/hosts
tậ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/hosts
tậ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/hosts
tậ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/hosts
mỗ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/hosts
vào hỗn hợp (ví dụ: dnsmasq
máy chủ DNS) có thể đang sử dụng inotify(7)
để theo dõi các thay đổi đối với các /etc/hosts
tệ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/hosts
mỗ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 hosts
dòng. Nó nói: "Khi giải quyết tên máy chủ, trước tiên hãy đọc /etc/hosts
tệ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ữ?