Unterschied in der Namensauflösung zwischen CentOS und Debian


13

Ich habe ein kleines Java-Programm, das jede Sekunde InetAddress.getByName ("example.com") aufruft. Wenn ich es mit 'strace -f' auf einer CentOS 6.4-Box ausführe, sehe ich, dass /etc/resolv.conf einmal geöffnet und gelesen wird:

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

Wenn ich es unter Debian 7 starte, sehe ich, dass /etc/resolv.conf wiederholt geöffnet wird oder stat () 'd:

$ 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

Beide Systeme haben /etc/nsswitch.conf mit konfiguriert

Hosts: Dateien DNS

Auf keinem System wird ein Name-Caching-Daemon ausgeführt.

Ich habe auf beiden Computern dieselbe Version der Oracle HotSot Java JVM verwendet, um Java-Unterschiede auszuschließen.

Auf der CentOS 6.4-Box ist glibc 2.12 installiert. Auf der Debian 7-Box ist glibc 2.13 installiert.

Was erklärt das unterschiedliche Verhalten der beiden Betriebssysteme beim Öffnen und Lesen von /etc/resolv.conf?


Kannst du bitte volle Spuren hinterlassen.
Danila Ladner

Antworten:


10

Die RedHat glibc-Entwickler betrachten einige Fehler in ihrer Software nicht als Fehler. Einer dieser Fehler ist das erneute Lesen der resolv.conf nach einer Änderung. glibc ist der Ansicht, dass die Verantwortung bei der Anwendung liegt. Daher muss jede Anwendung ihre eigene Logik dafür erstellen.

Da dies absolut verrückt ist, haben die Eglibc-Entwickler dieses Problem behoben. Auf Nicht-Eglibc-Systemen muss Ihre Anwendung eine eigene Logik für die Neuinitialisierung von nss_dns haben, oder sie muss nach einer Änderung von resolv.conf neu gestartet werden. Auf eglibc-Systemen (Debian und auf Debian basierende Dinge) erhalten Sie eine weniger fehlerhafte libc.

Wir haben dies auf die harte Tour herausgefunden, nachdem wir die resolv.conf geändert, alte DNS-Server außer Betrieb genommen und anschließend mehr als 1200 mysql-Server neu gestartet haben. Das macht natürlich keinen Spaß.


Warum wird das als "absolut verrückt" angesehen? Und warum hat glibc das so gemacht?
Michael Hampton

1
Denn anstatt glibc zu reparieren, belasten sie jede Anwendung da draußen ... Warum tun sie das? Ich weiß es nicht. Ich kann Dreppers Gedanken nicht lesen und ich bin nicht sicher, ob ich wissen will, was da
drin vor sich

1
Die Sache ist: Ich bin nicht sicher, ob Glibc tatsächlich kaputt ist. Warum muss /etc/resolv.confbei jedem DNS-Lookup erneut gelesen werden? Wird es wirklich erwartet, dass sich das häufig ändert? Wenn das Verhalten undokumentiert wäre, könnte ich verstehen ...
Michael Hampton

1
Es wird nicht bei jedem Nachschlagen erneut gelesen, das würde auch kaputt gehen :) Das Verhalten ist undokumentiert und sehr eingängig: glibc übernimmt die Verantwortung für die Initialisierung der Bibliothek nss_dns, macht die Anwendung jedoch anschließend für die Neuinitialisierung verantwortlich, auch wenn diese Anwendungen dies nicht tun weiß alles über nss und wie es funktioniert. Wie ist das nicht verrückt?
Dennis Kaarsemaker

1
Dennis hat recht, gai in EL6 ist absichtlich kaputt, weil das Verhalten des Buggys zum "erwarteten Verhalten" geworden ist - access.redhat.com/site/solutions/541163
suprjami

4

Nicht nur die C-Bibliotheksversionen unterscheiden sich, CentOS verwendet auch die GNU C-Bibliothek ( glibc), während Debian Embedded GLIBC ( eglibc) verwendet, so dass die tatsächliche Implementierung der Systemaufrufe für die Namenssuche völlig unterschiedlich ist.

Dies würde wahrscheinlich ein unterschiedliches Systemaufrufverhalten zwischen diesen beiden Verteilungen erklären.

Ich nehme an, InetAddress.getByNameübersetzt in getaddrinfo(). Sie können damit beginnen, die Quelle jedes Systemaufrufs in der entsprechenden C-Bibliotheksimplementierung und -version zu lesen.

Stellen Sie sicher, dass Sie den Quellcode der tatsächlich verwendeten Paketversionen lesen. Die Pakete in EL 6.4 wurden über 2 Jahre lang im Vergleich zu ihren ursprünglichen Upstream-Versionen verbessert. Ich gehe davon aus, dass dies auch für die Debian-Pakete gilt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.