Linux: DNS Probleme in einer chroot

Wie einige von euch evtl. wissen benutze ich unter Linux gern kleine selbst zusammengebaute chroots.
Aktuell sitze ich an einer Mini-chroot mit einem nodejs und einem PHP drin welches mir zukünftig als Mini-CI Server für PHP-Projekte dienen soll.

Häufig hat man das Problem, dass die DNS-Auflösung innerhalb der chroot nicht korrekt funktioniert.
Ein „ping google.de“ bringt dann z.B. nur ein: „ping: bad address ‚google.de'“.

Um heraus zu finden welche libs und Dateien für die DNS-Auflösung benötigt werden, kann man das Programm „strace“ in der Buildroot benutzen.

Hierzu wird der selbe ping mit einem strace in der Buildroot abgesetzt und die Ausgabe in eine Datei geleitet:

strace ping google.de -c1 1> ping.strace 2>&1

Die Ausgabe vom strace liegt nun in der Datei „ping.strace“ im ausgeführten Verzeichnis vor.

Um herauszufinden welche libs benötigt werden, lesen wir die Datei aus und geben den Inhalt an ein „grep open(“ weiter:

# cat ping.strace | grep "open("                                      
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
open("/etc/resolv.conf", O_RDONLY)      = 4
open("/etc/resolv.conf", O_RDONLY)      = 4
open("/etc/nsswitch.conf", O_RDONLY)    = 4
open("/etc/ld.so.cache", O_RDONLY)      = 4
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY) = 4
open("/etc/host.conf", O_RDONLY)        = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4
open("/etc/ld.so.cache", O_RDONLY)      = 4
open("/lib/x86_64-linux-gnu/libnss_dns.so.2", O_RDONLY) = 4
open("/lib/x86_64-linux-gnu/libresolv.so.2", O_RDONLY) = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4

Das selbe machen wir für die benötigten Dateien ebenfalls mit einem „grep stat(„:

#cat ping.strace | grep "stat(\""
stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0

Nun kann man alle benötigten Dateien in einem Script aufführen und in die chroot kopieren:

cp /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /chroot/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 && \ 
cp /lib/x86_64-linux-gnu/libc.so.6 /chroot/lib/x86_64-linux-gnu/libc.so.6 && \
cp /lib/x86_64-linux-gnu/libnss_files.so.2 /chroot/lib/x86_64-linux-gnu/libnss_files.so.2 && \
cp /lib/x86_64-linux-gnu/libnss_dns.so.2 /chroot/lib/x86_64-linux-gnu/libnss_dns.so.2 && \
cp /lib/x86_64-linux-gnu/libresolv.so.2 /chroot/lib/x86_64-linux-gnu/libresolv.so.2 && \
cp /etc/ld.so.cache /chroot/etc/ld.so.cache && \
cp /etc/host.conf /chroot/etc/host.conf && \
cp /etc/hosts /chroot/etc/hosts && \
cp /etc/nsswitch.conf /chroot/etc/nsswitch.conf && \
cp /etc/resolv.conf /chroot/etc/resolv.conf

Nun funktioniert der ping incl. DNS-Auflösung auch in der chroot:

# ping google.de -c1
PING google.de (173.194.69.94): 56 data bytes
64 bytes from 173.194.69.94: seq=0 ttl=50 time=28.299 ms

--- google.de ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 28.299/28.299/28.299 ms

leave your comment


*

Unterstütze den Frickelblog!