Giới hạn kích thước / etc / hosts là gì?


44

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?


64
... Tôi nghĩ rằng tại thời điểm này điều này trở thành một mối lo ngại thực sự chứ không phải là sự tò mò về học thuật mà bạn đã vượt qua điểm sẽ khôn ngoan hơn khi thiết lập một máy chủ DNS riêng về hiệu suất và khả năng bảo trì.
Shadur

5
Tôi ngạc nhiên khi bạn hỏi. Tại sao bạn mong đợi một số giới hạn kích thước có ý nghĩa chính xác và cứng trên các tệp cấu hình?
Stilenkevitch Basile

3
@BasileStarynkevitch Tôi đã hỏi vì tệp máy chủ ~ 2 MB không hoạt động trên bộ định tuyến của tôi, nhưng vấn đề là tôi đã không thở dài dnsmasq để đọc lại tệp máy chủ.
Lão máu

2
@Geremia tập tin máy chủ của tôi là 500M, hơn 15.000 mục, không có vấn đề. Luôn luôn là tốt nhất để xác định nguyên nhân gốc rễ của vấn đề của bạn và giải quyết nó trước tiên
bsd

3
Bạn đang sử dụng tệp máy chủ của mình để chặn địa chỉ IP? Nếu vậy bạn nên sử dụng iptables với ipset. Chỉ sử dụng iptables sẽ gây ra một cú hích hiệu suất lớn, tuy nhiên với ipset, một danh sách gần 500.000 ips có tác động không đáng kể.
gian mạng

Câu trả lời:


57

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).


21

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 BUFSIZký 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.


Trước DNS, tôi không nghĩ việc chuyển đổi bảng máy chủ Internet đầy đủ sang /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.
Barmar

13

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 ( )):

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (với kích thước khối 4KiB mặc định)
  • xfs: 500 TiB

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).


3
Đúng về nguyên tắc, nhưng giới hạn hệ thống tệp (ví dụ terabyte) thực tế phần lớn không liên quan.
Stilenkevitch Basile

11

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, *hostenthọ các hàm lưu trữ một con trỏ tệp đến dòng hiện tại trong tệp. sethostentmở tệp và đặt vị trí con trỏ tệp. gethostentlấ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.


2
Sử dụng glibc và linux, điều này không đơn giản lắm. Nếu bạn gọi gethostbyname và hệ thống được thiết lập tương ứng (mặc định trên nhiều hệ thống) thì nó sẽ thay vì đọc / etc / host gọi nscd. Tôi không biết nếu nscd sẽ chỉ lưu cache trong tệp hoặc cố gắng lưu toàn bộ bộ đệm. Trong trường hợp sau, bạn sẽ có giới hạn ram cho kích thước tệp (giả sử rằng cấu hình nscd cho phép nhiều mục đó)
PlasmaHH

1
Phiên bản 4.3BSD có ở đây . Nó hỗ trợ phiên bản băm dbm của / etc / hosts. IIRC, dbm áp đặt một số giới hạn kích thước có thể khiến các nỗ lực tạo db bị băm không thành công.
Đánh dấu Plotnick

2

... 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/hoststậ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.


8
Một số người sử dụng hoststệ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.
Bert

Có lẽ sẽ tốt hơn cho hiệu suất sử dụng dnsmasqcho điều đó - xem ví dụ dnsgate (mà tôi chưa thử).
Revierpost

Của tôi có 1,7 MB với 57k dòng. Bạn có thể lấy /etc/hoststệp khổng lồ của mình từ hostsfile.org
bay

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.