Làm cách nào để xác định hoặc đặt giới hạn kích thước /etc/hosts
? Nó có thể có bao nhiêu dòng?
Làm cách nào để xác định hoặc đặt giới hạn kích thước /etc/hosts
? Nó có thể có bao nhiêu dòng?
Câu trả lời:
Các hiệu ứng tiên tiến bao gồm độ phân giải tên máy chủ chậm (trừ khi HĐH bằng cách nào đó chuyển đổi danh sách tuyến tính thành cấu trúc tìm kiếm nhanh hơn?) Và khả năng tương tác đáng ngạc nhiên với tabviệc hoàn thành shell trước khi đạt được bất kỳ kích thước tệp có ý nghĩa nào.
Ví dụ! Nếu một nơi đặt 500.000 mục lưu trữ/etc/hosts
# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts
đối với khoa học, việc tabhoàn thành tên máy chủ mặc định trong ZSH mất khoảng ~ 25 giây trên hệ thống của tôi để trả về lời nhắc hoàn thành (được cấp, đây là trên máy tính xách tay từ năm 2008 với đĩa 5400 RPM, nhưng vẫn còn).
Tôi không nghĩ rằng nó có giới hạn kích thước về số lượng dòng.
Trước DNS (được đưa vào sử dụng năm 1985), tệp này được dùng làm phương tiện duy nhất để thực hiện tra cứu tên máy chủ, vì vậy tôi cho rằng điều này có nghĩa là tệp có thể có hàng ngàn hoặc ít nhất hàng trăm mục nhập vào có thể hỗ trợ các nút Internet trước năm 1985 được kết nối tốt nhất.
Dưới đây là một ví dụ từ năm 1985 (định dạng đã thay đổi phần nào): http://jim.rees.org/apollo-archive/hosts.txt Tệp này có 1680 dòng trong đó 1325 là dòng máy chủ. 355 dòng còn lại để trống, bình luận, mạng hoặc cổng 1 .
Giới hạn thực sự duy nhất mà tôi có thể tìm thấy là trên một số hệ thống, các dòng riêng lẻ được giới hạn dưới ít BUFSIZ
ký tự (1024 trên máy OpenBSD của tôi).
Nếu bạn có nhiều hơn một vài mục /etc/hosts
, bạn nên xem xét việc thiết lập một máy chủ tên địa phương, nhưng đó là ý kiến cá nhân của tôi.
1 Cảm ơn Jeff Schaller vì đã đào cái này lên.
/etc/hosts
định dạng là điều phổ biến . Hầu hết các hệ thống Unix thậm chí không có trên Internet và ngay cả khi có một máy, nó không cần một bảng máy chủ hoàn chỉnh, chỉ một số ít các máy cần thiết để nói chuyện. Tôi sẽ ngạc nhiên nếu có nhiều máy với hơn 100 mục.
Làm cách nào để xác định giới hạn kích thước của / etc / hosts?
Đây là một tệp thông thường, do đó giới hạn sẽ tương ứng với các giới hạn của hệ thống tệp cơ bản (sẽ bị giới hạn bởi số lượng đĩa phía sau nó), trừ đi không gian được sử dụng bởi bất kỳ tệp nào khác trong cùng /
hệ thống tệp (có thể là root ( )):
Làm cách nào tôi có thể đặt giới hạn kích thước của / etc / hosts?
Vì đó là tệp được chỉnh sửa thủ công, chỉ bằng tay:
sed -i '100,$d' /etc/hosts
(để loại bỏ các dòng 100 và hơn thế nữa).
Giới hạn kích thước chỉ áp dụng khi phân bổ bộ đệm tĩnh. gethostbyname(3)
, phân tích cú pháp các mục trong /etc/hosts
, không phân bổ bộ đệm tĩnh - và không bao giờ có. Bản phát hành năm 1983 của thuật toán BSD 4.3 cho thấy một tệp mở, trong khi dòng phân tích, mẫu tệp đóng:
sethostent(0);
while (p = gethostent()) {
if (strcmp(p->h_name, name) == 0)
break;
for (cp = p->h_aliases; *cp != 0; cp++)
if (strcmp(*cp, name) == 0)
goto found;
}
found:
endhostent();
Thực hiện hiện đại giữ lại di sản này trong tất cả các yếu tố cần thiết.
Dù sao, bên trong, *hostent
họ các hàm lưu trữ một con trỏ tệp đến dòng hiện tại trong tệp. sethostent
mở tệp và đặt vị trí con trỏ tệp. gethostent
lấy dữ liệu và tiến con trỏ. endhostent
đóng con trỏ tập tin. Thư viện GNU C cung cấp một tài liệu tham khảo kỹ lưỡng về các chức năng này.
Như bạn có thể đoán từ việc triển khai, các mục xuất hiện trước đó trong tệp sẽ giải quyết nhanh hơn. Nếu tập tin máy chủ của bạn là rất lớn, điều này đi vào chơi.
Vì vậy, cho dù tệp lớn đến đâu, HĐH sẽ tiêu thụ nó. Cuối cùng, mặc dù, bạn sẽ đạt giới hạn hệ thống tập tin (theo câu trả lời của Jeff Schaller ). Bạn cũng có giới hạn kích thước dòng tối đa (theo câu trả lời của Kusalananda ). Nhưng, cuối cùng, bạn có thể làm cho nó lớn như bạn muốn. Nhưng làm ơn, đừng.
... Tôi đã thử thách trí não của mình và trong suốt cuộc đời tôi, tôi không thể nghĩ đến một tình huống hay hoàn cảnh nào mà bạn gặp phải bất kỳ vấn đề giới hạn kích thước nào /etc/hosts
- bạn sẽ gặp phải những vấn đề thực tế như nghiêm trọng hiệu năng đánh vào nhóm getaddrinfo()
các cuộc gọi hệ thống mà tất cả phải tham khảo tệp trước khi quyết định có gửi truy vấn DNS hay không, không nói gì về vấn đề duy trì tệp văn bản phẳng có kích thước đó.
Tôi nghi ngờ rằng những gì chúng ta có ở đây là một thất bại để giao tiếp ở cấp độ cao hơn. Vấn đề gì bạn đang cố gắng giải quyết với một /etc/hosts
tập tin khổng lồ ? Tôi gần như chắc chắn rằng có một giải pháp tốt hơn thế này.
hosts
tệp để liệt kê quảng cáo / phần mềm độc hại / theo dõi / v.v. Có các danh sách giám tuyển trên internet, danh sách tôi sử dụng là 41k dòng và kích thước 1,1 MB.
dnsmasq
cho điều đó - xem ví dụ dnsgate (mà tôi chưa thử).
/etc/hosts
tệp khổng lồ của mình từ hostsfile.org