CentOSとDebianの名前解決の違い


13

毎秒InetAddress.getByName( "example.com")を呼び出すループを実行する小さなJavaプログラムがあります。'strace -f'を使用してCentOS 6.4ボックスで実行すると、/ etc / resolv.confが開かれて1回読み取られることがわかります。

$ 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のオープンと読み取りに関して、2つのオペレーティングシステム間の異なる動作を説明するものは何ですか?


完全なトレースを貼り付けてください。
ダニララドナー

回答:


10

RedHat glibc開発者は、ソフトウェアのバグの一部をバグではないと考えています。これらのバグの1つは、変更後のresolv.confの再読み取りです。glibcはアプリケーションの責任であると考えているため、すべてのアプリケーションはこのための独自のロジックを作成する必要があります。

これは絶対におかしいので、eglibc開発者はこの問題を修正しました。したがって、eglibc以外のシステムでは、アプリケーションにnss_dnsを再初期化する独自のロジックが必要です。そうでない場合は、resolv.confの変更後に再起動する必要があります。eglibcシステム(DebianおよびDebianベースのもの)では、バグの少ないlibcが得られます。

resolv.confを変更し、古いDNSサーバーを廃止し、1200以上のmysqlサーバーを再起動する必要があった後、これは難しい方法であることがわかりました。言うまでもなく、これは楽しいことではありません。


なぜこれが「絶対に狂った」と見なされるのですか?なぜglibcはこのようにしたのですか?
マイケルハンプトン

1
glibcを修正する代わりに、彼らはそこにあるすべてのアプリケーションに負担をかけるからです...なぜそうするのでしょうか?知りません。私はDreppersの心を読むことができない、と私は...私はそこにあるに行くかを知りたいかわからない
デニスKaarsemaker

1
問題は、glibcが実際に壊れているかどうかはわかりません。なぜ/etc/resolv.confすべてのDNSルックアップで再読み取りする必要があるのですか?それを頻繁に変更することが本当に期待されていますか?動作が文書化されていない場合、私は理解することができました...
マイケルハンプトン

1
ルックアップごとに再読み込みされるわけではありませんが、破損する可能性があります:)動作は文書化されておらず、直感に反します。 nssとそれがどのように機能するかについて何でも知っています。どうしてそれはおかしくないのですか?
デニスカースメーカー

1
バギー行動が「期待行動」となっていますので、デニスは右、EL6で街を意図的に壊れているされて- access.redhat.com/site/solutions/541163
suprjami

4

Cライブラリのバージョンが異なるだけでなく、CentOSはGNU Cライブラリ(glibc)を使用しますが、DebianはEmbedded GLIBC(eglibc)を使用するため、名前検索システムコールの実際の実装は完全に異なります。

これはおそらく、これら2つのディストリビューション間で異なるシステムコールの動作を説明します。

InetAddress.getByName翻訳すると仮定しgetaddrinfo()ます。関連するCライブラリの実装とバージョンの各syscallのソースを読むことから始めることができます。

使用している実際のパッケージバージョンからソースを必ず読んでください。EL 6.4のパッケージは、元のアップストリームバージョンと比較して2年以上改善されています。Debianパッケージについても同じことが当てはまります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.