CentOS和Debian之间的名称解析差异


13

我有一个小的Java程序,它每秒循环调用InetAddress.getByName(“ example.com”)。当我使用'strace -f'在CentOS 6.4盒子上运行它时,我看到/etc/resolv.conf已打开并读取一次:

$ grep /etc/resolv.conf strace.out
[pid 24810] open("/etc/resolv.conf", O_RDONLY) = 6

当我在Debian 7上运行它时,我看到/etc/resolv.conf被重复打开或stat()':

$ grep  /etc/resolv.conf strace.out
[pid 41821] open("/etc/resolv.conf", O_RDONLY) = 10
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0
[pid 41821] open("/etc/resolv.conf", O_RDONLY) = 10
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0

两个系统都配置了/etc/nsswitch.conf

主机:文件dns

这两个系统都没有运行名称缓存守护程序。

我在两台计算机上都使用了相同版本的Oracle HotSot Java JVM,以排除Java的任何差异。

CentOS 6.4盒已安装glibc 2.12。Debian 7盒子安装了glibc 2.13。

是什么导致两个操作系统在打开和读取/etc/resolv.conf方面的不同行为?


能否请您粘贴完整的痕迹。
Danila Ladner 2013年

Answers:


10

RedHat glibc开发人员认为其软件中的某些错误不是错误。这些错误之一是更改后重新读取resolv.conf。glibc认为这是应用程序的责任,因此每个应用程序都需要为此创建自己的逻辑。

由于这绝对是傻瓜,因此eglibc开发人员已修复此问题。因此,在非eglibc系统上,您的应用程序将需要具有自己的逻辑来重新初始化nss_dns,否则将需要在resolv.conf更改后重新启动。在eglibc系统(Debian和基于Debian的东西)上,您得到的bugc较少。

更改resolv.conf,停用旧的DNS服务器,然后必须重新启动1200多个mysql服务器后,我们发现了这种困难的方法。不用说,这不好玩。


为什么将其视为“绝对傻瓜”?为什么glibc会这样做?
迈克尔·汉普顿

1
因为他们没有解决glibc,而是将负担放在了那里的每个应用程序上……至于为什么这样做呢?我不知道。我听不懂Dreppers的想法,我不确定我想知道那里发生了什么……
Dennis Kaarsemaker 2013年

1
关键是:我不确定glibc是否已损坏。为什么必须/etc/resolv.conf在每次DNS查找时重新读取?真的期望经常改变吗?现在,如果行为没有记录,那么我可以理解...
迈克尔·汉普顿

1
它不会在每次查找时都重新读取,这也会被破坏:)行为是未记录的,并且确实违反直觉:glibc负责初始化nss_dns库,但随后使应用程序负责对其进行初始化,即使这些应用程序没有了解有关nss及其工作方式的任何信息。那不是疯子吗?
丹尼斯·考斯玛克

1
丹尼斯说得对,EL6中的街被故意破坏了,因为越野车的行为已成为“预期行为” -access.redhat.com/site/solutions/541163
suprjami 2013年

4

不仅C库版本不同,而且CentOS使用GNU C库(glibc),而Debian使用嵌入式GLIBC(eglibc),因此名称查找系统调用的实际实现是完全不同的。

这可能会解释这两个发行版之间的不同系统调用行为。

我假设InetAddress.getByName翻译成getaddrinfo()。您可以先阅读相关C库实现和版本中每个syscall的源代码。

确保从正在使用的实际软件包版本中阅读源代码。与原始上游版本相比,EL 6.4中的软件包已进行了2年以上的改进。我认为Debian软件包也是如此。

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.