Seite wählen

NETWAYS Blog

Do Servers Dream of Electric Sadness?

Als Systemadministrator ist man oft mit einer Vielzahl von Fehlermeldungen konfrontiert, die manchmal klar verständlich, manchmal mehrdeutig und manchmal völlig nichtssagend sein können. Wichtig ist hierbei, sich nicht von der Meldung in der Herangehensweise an den Fehler beeinflussen zu lassen und somit von vornherein auf dem Holzweg unterwegs zu sein.

icingadbweb

Zwei Hosts down, oder nur redis und mysql?

In diesem Blogbeitrag werden wir die Bedeutung eines methodischen Denkens und eines gut ausgestatteten Werkzeugkastens für Systemadministratoren erkunden.

 

Kenne Deine Umgebung:

Für die korrekte Interpretation ist es nicht nur wichtig, seine Umgebung zu kennen, sondern auch zu wissen, welche Werkzeuge in dem persönlichen Werkzeugkasten vorhanden sind. Sieht der Fehler nach Schraube aus, ich halte allerdings einen Hammer in der Hand, wird der Fehler gerne als Nagel interpretiert.Beides hält ja irgendwie Dinge zusammen und mit ausreichend Ausdauer, bekommt auch ein Hammer mit einer Schraube eine Verbindung zustande. Die Schraubverbindung mit einem Hammer zu lösen ist hier allerdings schon wieder eine andere Geschichte.

Aufbau Deines Werkzeugkastens:

Der Werkzeugkasten eines Systemadministrators baut sich über viele Jahre Erfahrung zusammen, kann aber auch durch realitätsnahe Übungen erweitert werden, was dann auch eine gewaltige Zeitersparnis beim Lösungsweg mit sich bringt. Ein sehr sympathischer Ansatz ist der Advent of Code mit dem Fokus auf programmatischen Lösungen, um so auch eventuell eine neue Sprache näher zu beleuchten.

Realitätsnahe Herausforderungen:

Mit realitätsnahen Herausforderungen auf AWS-Root Servern locken dagegen die traurigen Server auf https://sadservers.com. In derzeit 20 unterschiedlichen Szenarien darf man, falls nötig auch mit Tipps, eine definierte Aufgabe via bash lösen. Während der Beginn und die Zeitvorgaben entspannt anfangen, wird es je nach Kenntnisstand ziemlich schnell ziemlich fordernd. Einen ersten Einblick bietet auch das zugehörige GitHub Repository

Austausch und Schulungen:

Wer danach oder währenddessen Interesse daran hat, den Werkzeugkasten über einen Monat hin weiter zu befüllen, sollte einen Blick auf https://linuxupskillchallenge.com/ riskieren. Auch Personen, die schon Jahrzehnte im Geschäft sind, erfahren bei solchen Challenges nicht nur neues, sondern auch der Austausch mit Gleichgesinnten hilft hierbei enorm. Wem das alles zu digital ist, findet vielleicht in unseren Schulungen und Events nicht nur sich selbst eher wieder, sondern auch mehr Gleichgesinnte.

 

Ein gut ausgestatteter Werkzeugkasten und ein methodischer Ansatz sind entscheidend für den Erfolg eines Systemadministrators. Indem Du Deine Umgebung kennst, Deine Werkzeuge verstehst und durch praktische Übungen und Herausforderungen Dein Wissen erweiterst, wirst Du in der Lage sein, Fehler effektiv zu lösen und die Herausforderungen Deines Berufs zu meistern!

Tim Albert
Tim Albert
Senior Systems Engineer

Tim kommt aus einem kleinen Ort zwischen Nürnberg und Ansbach, an der malerischen B14 gelegen. Er hat in Erlangen Lehramt und in Koblenz Informationsmanagement studiert. Seit Anfang 2016 ist er bei uns tätig. Zuerst im Managed Services Team, dort kümmerte Tim sich um Infrastrukturthemen und den internen Support, um dann 2019 - zusammen mit Marius - Gründungsmitglied der ITSM Abteilung zu werden. In seiner Freizeit engagiert sich Tim in der Freiwilligen Feuerwehr – als Maschinist und Atemschutzgeräteträger -, spielt im Laientheater Bauernschwänke und ist auch handwerklich ein absolutes Allroundtalent. Angefangen von Mauern hochziehen bis hin zur KNX-Verkabelung ist er jederzeit...

Benutzerfreundliche Fehlermeldungen

Der erste Schritt bei Fehlern ist meist der Versuch, anhand von Logmeldungen nachzuvollziehen, was die Anwendung zuletzt gemacht hat, bevor das Problem aufgetreten ist. Hier zeigt sich dann schnell, wie gut die Anwendung darauf vorbereitet ist, dem Benutzer bei der Fehlersuche zu helfen. Dazu einige Beispiel:

[2014-05-28 09:47:04 +0200] <Q #0x7f5a08c68780 W #0x7f5a08c688c0> critical/remote: Cannot connect to host 'voip.beutner.name' on port '5665'

Auf den ersten Blick sieht es so aus, als würde die Verbindung nicht aufgebaut werden können. Aber es fehlen einige wichtige Informationen, um die Logmeldung in den Kontext einordnen zu können:

  • Wer hat aus welchem Grund versucht die Verbindung aufzubauen bzw. was für eine Art Verbindung ist es? (Datenbank? Cluster? Was ganz anderes?)
  • Warum ist der Verbindungsaufbau gescheitert („Connection refused“ in diesem Fall, wenn man mit strace nachschaut, warum der connect()-Aufruf fehlschlägt)?
  • Welche Auswirkungen hat dies (in diesem Fall wird der Verbindungsaufbau periodisch erneut versucht, wodurch sich auch die Frage stellt, ob der Fehler wirklich „critical“ ist)?

Die andere Seite des Spektrums bietet eine wahre Informationsüberflutung und ist mindestens genauso schlecht:

Caught unhandled exception.
Current time: 2014-05-28 09:46:51 +0200
***
* Application version: v2.0.0-beta1-8-g641ff1f
* Installation root: /home/gbeutner/i2
* Sysconf directory: /home/gbeutner/i2/etc
* Local state directory: /home/gbeutner/i2/var
* Package data directory: /home/gbeutner/i2/share/icinga2
* State path: /home/gbeutner/i2/var/lib/icinga2/icinga2.state
* PID path: /home/gbeutner/i2/var/run/icinga2/icinga2.pid
* Application type: icinga/IcingaApplication
***
/home/gbeutner/icinga2/lib/base/application.cpp(671): Throw in function void icinga::Application::UpdatePidFile(const icinga::String &, pid_t)
Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >
std::exception::what: Could not open PID file '/home/gbeutner/i2/var/run/icinga2/icinga2.pid'
[icinga::StackTrace*] =
(0) libbase.so: void boost::throw_exception<boost::exception_detail::error_info_injector<std::runtime_error> >(boost::exception_detail::error_info_injector<std::runtime_error> const&) (+0xb3) [0x7fec91f6b323] (throw_exception.hpp:61)
(1) libbase.so: void boost::exception_detail::throw_exception_<std::runtime_error>(std::runtime_error const&, char const*, char const*, int) (+0x66) [0x7fec91f64c96] (exception.hpp:276)
(2) libbase.so: icinga::Application::UpdatePidFile(icinga::String const&, int) (+0xe7) [0x7fec91f5de87] (application.cpp:671)
(3) libbase.so: icinga::Application::Run() (+0xd9) [0x7fec91f627f9] (basic_string.h:287)
(4) icinga2: Main() (+0x740c) [0x4250cc] (??:0)
(5) icinga2: main (+0x25) [0x4252a5] (??:0)
(6) libc.so.6: __libc_start_main (+0xfd) [0x7fec9023dead] (libc-start.c:276)
(7) ./sbin/icinga2() [0x41dbf9]
[icinga::ContextTrace*] =
***
* This would indicate a runtime problem or configuration error. If you believe this is a bug in Icinga 2
* please submit a bug report at  and include this stack trace as well as any other
* information that might be useful in order to reproduce this problem.
***
Aborted

In dieser Fehlermeldung sind soviele Informationen versteckt, dass es für den Benutzer schon teilweise schwierig wird, überhaupt die eigentliche Fehlermeldung („Could not open PID file ‚/home/gbeutner/i2/var/run/icinga2/icinga2.pid'“) zu finden. Und trotzdem fehlt hier eigentlich eine ganz entscheidende Information: Warum ist das Öffnen der Datei denn eigentlich gescheitert?
Für mich als Entwickler sind solche Fehlermeldungen natürlich sehr praktisch: Ich weiss genau – abgesehen vom fehlenden Fehlercode, in welcher Zeile und zu welchem Zeitpunkt der Fehler aufgetreten ist; die Fehlermeldung beinhaltet die Pfade zu wichtigen Dateien. Diese Details helfen mir, das Problem zu reproduzieren bzw. evtl sogar direkt anhand des Stacktraces zu finden.
Die beiden Beispiele verdeutlichen einige Eigenschaften, die Fehlermeldungen haben sollen, um den Benutzer bei der Fehlersuche zu helfen:

  • Sie sollten kurz und einfach zu verstehen sein (keine Stacktraces, Klassennamen, o.ä.)
  • Sie sollten alle wichtigen Informationen enthalten (Dateinamen, Fehlercode)
  • Sie sollten den Benutzer in Richtung der Problemlösung leiten (z.B. bei EPERM -> Hinweis auf Datei-Berechtigungen)
  • Zusätzlich sollten die für Entwickler wichtigen Informationen aber trotzdem bereitgehalten werden; vielleicht als Referenz auf eine separate Log-Datei, die dann auch gerne seitenlange Stacktraces enthalten kann

Dass bei den Logmeldungen von Icinga 2 dieses Ideal noch nicht erreicht ist, haben wir im Bugtracker zusammengefasst und arbeiten fleissig daran, dies noch zu verbessern. Wer beim Testen noch auf etwas unhandliche Fehlermeldungen stößt, sollte dazu Issues erstellen, damit wir diese für die Beta 2 noch anpassen können.

Produktverteilerdatei – Fehler im Mac App Store beheben

Schon seit einigen Tagen versuche ich im Mac App Store die neue Version von TweetDeck zu „kaufen“, was aber nicht klappen. Denn ich bekomme die folgende, wenig aussagende Fehlermeldung:

„Ihr Kauf konnte nicht abgeschlossen werden. Die Produktverteilerdatei konnte nicht überprüft werden. Möglicherweise ist sie beschädigt oder wurde nicht ordnungsgemäß signiert.“

Zuerst dachte ich, dass es sich vielleicht nur um einen temporären Fehler handelt oder Apple da gerade etwas wartet und vielleicht nur vergessen hat ein gelbes PostIt dranzukleben. Leider hat sich der Fehler aber nicht selbst behoben und auch Google hat nichts brauchbares ausgespuckt, so dass ich mich selber auf die Suche begeben musste.
Folgendes hat mein Problem dann behoben. Der Fehler wird inkl. Details geloggt. Dort kann man rausfinden, wo diese ominöse Produktverteilerdatei eigentlich liegt und dann alle betroffenen Dateien einfach löschen. Der App Store legt die dann beim nächsten Start einfach neu an. Hier die Vorgehensweise im Einzelnen:

  1. Am besten zuerst alle Programme schließen, damit im Logfile nicht so viele Meldungen durchscrollen
  2. Im Finder „konsole“ eingeben und das Programm Konsole starten
  3. Im linken Menü „Alle Systemmeldungen“ auswählen
  4. Den App Store öffnen und nochmal versuchen das betroffene Programm zu kaufen
  5. Im gleichen Moment oder wenige Sekunden später müsste die Fehlermeldung auch im Log auftauchen:
    13.12.11 13:40:22,342 App Store: FRPurchaseManager: Preflight operation for 485812721 failed with error: Error Domain=com.apple.appstore Code=0 „Die Produktverteilerdatei konnte nicht überprüft werden. Möglicherweise ist sie beschädigt oder wurde nicht ordnungsgemäß signiert.“  (usw.)
  6. Die Meldung kann man mit einem Klick auf das kleine Dreieck aufklappen
  7. Weiter im Text findet sich dann eine URI mit dem Hinweis auf die genaue Lage der Date im Dateisystem:
    „Cannot create PKProduct from „file://localhost/var/folders/c3/->
    g01fg00s6wxf0rlp4y171k_m0000gn/C/com.apple.appstore/485812721/preflight.pfpkg“
  8. Jetzt weiss man wo die Produktverteilerdatei liegt und kann sie inkl. der anderen Cache Dateien einfach löschen. Entweder im Terminal oder wenn man sich nicht so auskennt über den Finder:
    • Finder normal starten
    • CMD+SHIFT+G drücken und dann /var/folders/ eingeben
    • Durchklicken bis zu „com.apple.appstore“
    • Markieren und zum Löschen CMD-BACKSPACE drücken
    • Papierkorb leeren
  9. Als letztes nur noch den App Store neu starten und die App kaufen. Voilà
Julian Hein
Julian Hein
Executive Chairman

Julian ist Gründer und Eigentümer der NETWAYS Gruppe und kümmert sich um die strategische Ausrichtung des Unternehmens. Neben seinem technischen und betriebswirtschaftlichen Background ist Julian häufig auch kreativer Kopf und Namensgeber, beispielsweise auch für Icinga. Darüber hinaus ist er als CPO (Chief Plugin Officer) auch für die konzernweite Pluginstrategie verantwortlich und stösst regelmässig auf technische Herausforderungen, die sonst noch kein Mensch zuvor gesehen hat.

World of Errors I

guru

Wer kann sich an diese Fehlermeldung noch erinnern? Erklärung gibt es in der Wikipedia.

Julian Hein
Julian Hein
Executive Chairman

Julian ist Gründer und Eigentümer der NETWAYS Gruppe und kümmert sich um die strategische Ausrichtung des Unternehmens. Neben seinem technischen und betriebswirtschaftlichen Background ist Julian häufig auch kreativer Kopf und Namensgeber, beispielsweise auch für Icinga. Darüber hinaus ist er als CPO (Chief Plugin Officer) auch für die konzernweite Pluginstrategie verantwortlich und stösst regelmässig auf technische Herausforderungen, die sonst noch kein Mensch zuvor gesehen hat.