与任何其他平面文件数据库相同。

与任何其他平面文件数据库相同。

我正在尝试编写一个网站拦截器,我发现的最简单的事情是将行放在 /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 服务器访问也是一种糟糕的机制。

进一步阅读

相关内容