我正在尝试编写一个网站拦截器,我发现的最简单的事情是将行放在 /etc/hosts 的末尾。如果我不想阻止 100 万个网站重定向到本地主机,这会减慢互联网浏览或正常操作系统操作的速度。
答案1
与任何其他平面文件数据库相同。
这其实是一个普遍现象。
该问题是文件格式所固有的,并且同样适用于/etc/passwd
、/etc/group
、/etc/shells
。/etc/phones
、、、、以及其他。/etc/ttys
这些文件没有索引也没有排序,因此任何查找都必须是顺序扫描,可能是整个文件。查找不存在的条目/etc/services
/etc/fstab
/etc/hosts
必须读取文件的每条记录。插入和删除必须读取和写文件的每条记录。
BSD 将用户帐户数据库从这种平面文件格式转换为 Berkeley DB 是有原因的(/etc/pwd.db
并且/etc/spwd.db
)是有原因的,就是这样。伯克利数据库是索引,并且查找不是从文件开头开始顺序扫描。这是之一DNS 出现的原因(平面文件访问方法是HOSTS.TXT
问题的一个原因;在整个网络中复制此文件是另一个原因)。
这就是电子邮件系统涉及 CDB、Berkeley DB 和其他格式的数据库的原因,用于设置域列表和虚拟用户帐户等内容。相反,您的 C 库几乎肯定不提供使用其他数据库格式来代替/etc/hosts
.
此外,许多事情都涉及在此表中执行查找,从 shell 中的特殊命令参数完成到网络工具和系统监视/管理实用程序,再到打印、WWW 浏览器和电子邮件系统。
拥有百万条记录的平面文件数据库对此来说是一个糟糕的主意。
我什至还没有触及插入和删除必须以原子方式完成的事实,以免系统看到文件处于部分重写状态(这可能会产生非常不良的后果)。这不会是这样如果您的做法是天真地在文本编辑器中打开文件。默认情况下,大多数文本编辑器本身不会执行原子文件更新。平面文件数据库,尤其是大型数据库,需要比人们天真的想象的更加小心的处理。不,是他们不是“只是文本文件”。
当然,使用名称查找来过滤 WWW 服务器访问也是一种糟糕的机制。