如何确定或设置大小限制/etc/hosts
?它可以有几行?
如何确定或设置大小限制/etc/hosts
?它可以有几行?
Answers:
我认为行数没有大小限制。
在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进行了深入的研究。
/etc/hosts
格式并不常见。大多数Unix系统甚至都不在Internet上,即使有一台机器,它也不需要一个完整的主机表,只需要与之对话的少数机器即可。如果有很多机器的条目超过100个,我会感到惊讶。
如何确定/ etc / hosts的大小限制?
它是一个常规文件,因此该限制将与基础文件系统的限制相对应(该限制本身受其后的磁盘数量限制),减去该文件/
系统(可能是root())中任何其他文件使用的空间:
如何设置/ etc / hosts的大小限制?
由于它是手动编辑的文件,因此只能手动进行:
sed -i '100,$d' /etc/hosts
(删除第100行及更多行)。
大小限制仅在分配静态缓冲区时适用。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的答案)。但是,最后,您可以根据需要将其放大。但是请不要。
...我已经绞尽脑汁,一生中我都无法想到您会遇到任何尺寸限制问题的单一情况或情况/etc/hosts
-您会遇到严重的实际问题getaddrinfo()
对系统调用系列的性能影响很大,在决定是否发送DNS查询之前,所有系统调用都必须先查询文件,更不用说保持该大小的纯文本文件了。
我怀疑我们在这里是无法进行更高级别的交流。您正尝试使用巨大的/etc/hosts
文件解决什么问题?我几乎可以肯定,有比这更好的解决方案。
hosts
文件将广告/恶意软件/跟踪/黑名单列入黑名单。互联网上有精选的清单,我使用的是41k行,大小为1.1MB。
dnsmasq
-参见例如dnsgate(我没有尝试过)。
/etc/hosts
从hostsfile.org