Lokaler DNS Resolver ignoriert Suchdomains in Mac OS X Lion

Der lokale DNS Resolver in Mac OS X 10.7 (Lion) berücksichtigt die eingetragenen Suchdomains nicht, wenn der gesuchte Hostname bereits einen Punkt enthält.

Enthält der Suchdomaineintrag „example.com“, war es bisher möglich mit ping www.subdomain den Host www.subdomain.example.com zu erreichen. Mit MacOS X Lion ist dies jetzt nicht mehr möglich. Mit einer Änderung der Optionen für den lokalen DNS Resolver ist es möglich, den alten Zustand wieder herzustellen. Hierzu muss die Option -AlwaysAppendSearchDomains aktiviert werden.

Da in der Regel keine Optionen gesetzt sind, kann dies durch den Befehl

sudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder \
        ProgramArguments -array-add "-AlwaysAppendSearchDomains"

erreicht werden. Danach muss der mDNSResponder neu gestartet werden.

sudo launchctl unload -w \
           /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo launchctl load -w \
           /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

Ein weiterer Parameter für den mDNSResponder ist -NoMulticastAdvertisements. Damit kann man verhindern, dass diverse Dienste nicht mehr per Multicast verkündet werden. Allen voran ist hier Bonjour zu nennen.

Ähnlich wie bei -AlwaysAppendSearchDomains kann diese Option mittels

sudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder \
        ProgramArguments -array-add "-NoMulticastAdvertisements"

eingestellt werden.

Für den Fall, dass man das Ganze wieder Rückgängig machen will/muss, kann dies durch den Befehl

sudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder \
        ProgramArguments -array /usr/sbin/mDNSResponder -launchd

erreicht werden.

ldd / strace unter Mac OS X

Für die Fehlersuche unter *NIX sind ldd und strace sehr nützlich um Abhängigkeiten von dynamischen Bibliotheken zu finden. Leider hatte ich ein Problem auf einem Mac OS X 10.6, wo es diese beiden Tools nicht gibt.

Nach einiger Suche (die meist nur ktrace als Alternative für Mac OS brachte) fand ich eine ganz brauchbare Alternative für beide Tools:

Um die Abhängigkeiten von dyn. Bibliotheken zu finden, kann man als Alternative zu ldd

otool -L <binary>

benutzen. Eine Alternative für strace ist

dtruss <binary>

brauchbar. Nachteil bei letzterem ist, dass es keine Möglichkeit gibt, die Ausgabe per Kommandozeilenoption in eine Datei umzuleiten. Statt dessen gibt dtruss die Informationen immer auf STDERR aus.

Die beiden Alternativen sind brauchbar (bzw. besser als nix), man vermisst aber bei dtruss doch schnell die Optionsvielfalt von strace (vor allem -ff und -o bei komplizierteren Pro{grammen,blemen}).

UID ändern unter Mac OS 10.5 / 10.6

Die Suche nach einer Möglichkeit, die numerische UserID (UID) meines Benutzers auf dem Mac zu ändern hat mich ein wenig Zeit gekostet. Das NetInfo-Dienstprogramm, auf welches in zahlreichen Foren verweisen wird, gibt es nicht mehr und in /etc/passwd oder ähnlichen Dateien findet man nicht die Informationen, die man braucht.

Als erstes muss man einen weiteren (temporären) Benutzer erzeugen, der den Mac administrieren darf. Anschließend meldet man sich als dieser Benutzer an.

Mit der Option -n zeigt der Befehl ls die numerischen UserIDs an, anstatt sie aufzulösen. Das ist deshalb wichtig, weil wir zunächst die alte UserID des Benutzers herausfinden müssen:

ls -ladn /Users/username

Als Ergebnis erscheint eine Zeile, die in etwa so aussieht:

drwxr-xr-x 56 502 25 4096  9. Feb 09:01 /Users/username

Die zweite Zahl (hier 502) ist die UID, die wir ändern möchten. Folgende Befehle führen dann zum Ziel, wenn man die UID z.B. auf 1006 ändern möchte:

sudo dscl . -change /Users/username UniqueID 502 1006
sudo chown -R 1006 /Users/username
sudo find / -uid 502 -exec chown username {} \;

Zum Abschluss kann man ja vorsichtshalber mal booten, das ist aber eigentlich nicht nötig. An- und abmelden muss reichen.