/ etc / hosts的大小限制是多少?


44

如何确定或设置大小限制/etc/hosts?它可以有几行?


64
...我认为,在这成为实际问题而不是出于学术好奇心的时候,您已经远远超过了在性能和可维护性方面建立私有DNS服务器的明智之地。
Shadur

5
我很惊讶你在问。您为什么期望配置文件有一些精确而困难的有意义的大小限制?
巴西尔·斯塔林凯维奇

3
@BasileStarynkevitch我之所以问,是因为〜2 MB的主机文件无法在我的路由器上工作,但是问题是我没有叹息dnsmasq来重新读取主机文件。
Geremia

2
@ Geremia我的主机文件是500M,15,000多个条目,没有问题。始终最好先确定问题的根本原因并加以解决
bsd

3
您是否正在使用主机文件来阻止IP地址?如果是这样,您应该将iptables与ipset一起使用。单独使用iptables会对性能造成重大影响,但是使用ipset时,将近500,000 ips的列表影响可忽略不计。
cybernard '17

Answers:


57

问题的影响包括较慢的主机名解析(除非操作系统以某种方式将线性列表转换为搜索速度更快的结构?),tab以及在达到任何有意义的文件大小之前,很可能与shell 完成功能进行令人惊讶的交互。

例如!如果将500,000个主机条目放入/etc/hosts

# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts

出于科学tab考虑,ZSH中默认的主机名完成在我的系统上大约需要25秒才能返回完成提示(当然,这是从2008年起使用5400 RPM磁盘的笔记本电脑,但仍然如此)。


21

我认为行数没有大小限制。

在DNS(于1985年投入使用)之前,此文件是进行主机名查找的唯一方法,因此我认为这意味着该文件应能够包含数千个或至少数百个条目。能够支持连接最紧密的1985年前的Internet节点。

这是1985年的示例(格式有所更改):http : //jim.rees.org/apollo-archive/hosts.txt 该文件有1680行,其中1325行是主机行。其余355行为空白,注释,网络或网关1

我能找到的唯一真正的限制是,在某些系统上,每限制为少于BUFSIZ字符(在我的OpenBSD机器上为1024)。

如果您在中有几个条目/etc/hosts,则应该考虑设置本地名称服务器,但这是我个人的看法。


1 感谢Jeff Schaller进行了深入的研究。


在使用DNS之前,我认为将整个Internet主机表转换为/etc/hosts格式并不常见。大多数Unix系统甚至都不在Internet上,即使有一台机器,它也不需要一个完整的主机表,只需要与之对话的少数机器即可。如果有很多机器的条目超过100个,我会感到惊讶。
Barmar

13

如何确定/ etc / hosts的大小限制?

它是一个常规文件,因此该限制将与基础文件系统的限制相对应(该限制本身受其后的磁盘数量限制),减去该文件/系统(可能是root())中任何其他文件使用的空间:

  • ext2 / 3:2 TiB
  • ext4:16 TiB(默认4KiB块大小)
  • xfs:500 TiB

如何设置/ etc / hosts的大小限制?

由于它是手动编辑的文件,因此只能手动进行:

sed -i '100,$d' /etc/hosts

(删除第100行及更多行)。


3
原则上是正确的,但是文件系统限制(例如TB)实际上几乎没有关系。
巴西尔·斯塔林凯维奇

11

大小限制仅在分配静态缓冲区时适用。gethostbyname(3),它解析中的条目/etc/hosts,不会分配静态缓冲区-永远不会分配。最初的1983年BSD 4.3算法版本显示了一个打开文件,同时解析行,关闭文件的模式:

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

现代实现在所有要素中都保留了这一传统。

无论如何,在内部,*hostent函数家族将文件指针存储到文件中的当前行。sethostent打开文件并设置文件指针位置。gethostent获取数据并前进指针。endhostent关闭文件指针。GNU C库提供有关这些功能的详尽参考

您可能会从实现中猜到,文件中较早出现的条目解析速度更快。如果您的主机文件很大,那么它就起作用了。

因此,无论文件多大,操作系统都会消耗掉它。最终,尽管如此,您将达到文件系统限制(根据Jeff Schaller的回答)。您还具有最大的行大小限制(根据Kusalananda的答案)。但是,最后,您可以根据需要将其放大。但是请不要。


2
不幸的是,使用glibc和linux并不是那么简单。如果调用gethostbyname并相应地设置了系统(在许多系统上为默认设置),则它将代替读取/ etc / host调用nscd。我不知道nscd是仅缓存文件中的匹配还是尝试将其整体缓存。在后一种情况下,您将对文件大小有一个ram限制(假设nscd配置允许这么多的条目)
PlasmaHH

1
4.3BSD版本在这里。它支持/ etc / hosts的dbm哈希版本。在IIRC中,dbm施加了一些大小限制,这可能导致创建散列db的尝试失败。
Mark Plotnick

2

...我已经绞尽脑汁,一生中​​我都无法想到您会遇到任何尺寸限制问题的单一情况或情况/etc/hosts-您会遇到严重的实际问题getaddrinfo()对系统调用系列的性能影响很大,在决定是否发送DNS查询之前,所有系统调用都必须先查询文件,更不用说保持该大小的纯文本文件了。

我怀疑我们在这里是无法进行更高级别的交流。您正尝试使用巨大的/etc/hosts文件解决什么问题?我几乎可以肯定,有比这更好的解决方案。


8
有些人使用hosts文件将广告/恶意软件/跟踪/黑名单列入黑名单。互联网上有精选的清单,我使用的是41k行,大小为1.1MB。
Bert

这样做可能会更好地提高性能dnsmasq-参见例如dnsgate(我没有尝试过)。
reinierpost

我的有1.7MB和57,000行。您可以/etc/hostshostsfile.org
聚苯乙烯泡沫塑料

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.