10.4    Logdateien und dmesg

Nachdem wir unsere Benutzer und die Software verwalten sowie wichtige Daten sichern können, wollen wir jetzt das System erst einmal so am Laufen halten. Linux erleichtert diese Arbeit dadurch, dass für alle wichtigen Ereignisse Logdateien erstellt werden.

Eine Logdatei ist eine Datei, in der wichtige Vorgänge im System verzeichnet werden. Viele Softwarepakete haben eigene Logdateien. Sie werden in diesem Abschnitt die wichtigsten kennenlernen. Diese Dateien sind im Allgemeinen unter /var/log oder seinen Unterverzeichnissen gespeichert.

10.4.1    /var/log/messages

Die wichtigste Logdatei eines Systems enthält so ziemlich alles, was der Kernel oder einige Systemprozesse mitzuteilen haben.

So schreibt der Kernel eigene Meldungen in diese Datei, aber auch Anwendungen ohne eigene Logdateien haben die Möglichkeit, Nachrichten hineinzuschreiben. Sehen wir uns einfach mal einen Auszug an:

…
Oct 12 11:44:44 localhost kernel: eth0: no IPv6     
  routers present
…
Oct 12 14:59:00 localhost /USR/SBIN/CRON[2011]:     
  CMD ( rm -f /var/spool/cron/lastrun/cron.hourly)
Okt 12 15:29:09 localhost su: FAILED SU (to root)
  jploetner on /dev/pts/4
Okt 12 15:29:16 localhost su: (to root) jploetner   
  on /dev/pts/4
Okt 12 15:29:16 localhost su: pam_Unix2: session    
  started for user root, service su
Okt 12 15:31:42 localhost su: pam_Unix2: session    
  finished for user root, service su

Listing 10.27     Auszug aus /var/log/messages

Hier wird auch schon der generelle Aufbau deutlich, den Logdateien oft haben: Das Datum und die genaue Uhrzeit werden vor der eigentlichen Nachricht angegeben. Im Fall der /var/log/messages folgt nach der Zeit der Name des Rechners, der die Meldung verursachte, dann der Name des aufrufenden Programms, gefolgt von der eigentlichen Meldung.

In unserem Fall enthält die Datei ausschließlich Meldungen eines einzigen Computers, der im Logfile als localhost identifiziert wird. (Der Name localhost bezeichnet immer den aktuellen, also eigenen Rechner. In einem Netzwerk können aber unterschiedliche Hostnamen vergeben werden, siehe Kapitel 11, »Netzwerke unter Linux«.) In unserem Beispiel haben wir Meldungen von den Programmen cron, su und dem Kernel sowie Einträge des Logging-Systems selbst, die wir aber getrost ignorieren können.

An der Ausgabe erkennen wir zum Beispiel, dass der Benutzer jploetner einmal vergeblich versucht hat, sich per su-Kommando die root-Identität zu verschaffen, um als Systemadministrator Aufgaben zu übernehmen. Ein paar Sekunden später hat er es aber dann doch geschafft und ist für ein paar Minuten in einer Session als root aktiv.

Aus den Meldungen des Kernels haben wir eine beliebige herausgegriffen, in diesem Fall eine Meldung vom Bootvorgang, die beim Initialisieren der Netzwerkschnittstelle eth0 aufgetreten ist. Es werden also schwerwiegende Fehler, Warnungen sowie schlichte Informationen in dieser Logdatei angezeigt.

Eine typische Information ist der Eintrag des cron-Programms. Es handelt sich dabei um einen Dienst, der regelmäßig Programme beispielsweise zu Administrationszwecken ausführt. Eine solche Logdatei ist ein komfortabler Weg, an Rückmeldungen über die gestarteten Programme zu kommen – in diesem Fall wird einfach nur eine Statusdatei mit dem Kommando rm gelöscht, um die Festplatte nicht mit unnützen Daten zu verstopfen.

10.4.2    /var/log/wtmp

Die wtmp-Datei enthält Informationen über die letzten Login-Versuche bzw. die letzten Logins für jeden einzelnen Nutzer. Leider ist die Datei in keinem lesbaren Textformat gespeichert. Daher sollten Sie lieber das Programm lastlog nutzen, um Informationen aus dieser Datei auszulesen und anzuzeigen:

$ lastlog
Username  Port  From       Latest
root      tty2             Don Sep 18 16:35:01 +0200 2003
bin                        **Never logged in**
…
jploetner :0    console    Son Okt 12 11:46:30 +0200 2003
swendzel  pts/5 jupiter.wg Son Okt 12 20:05:22 +0200 2003
…

Listing 10.28     Die letzten Logins mit lastlog

Beim einfachen Aufruf von lastlog werden alle Benutzer mit den entsprechenden Daten ausgegeben. Zu diesen Daten gehört natürlich auf der einen Seite der Zeitpunkt, auf der anderen Seite beispielsweise aber auch der Ort, von dem aus sich der entsprechende Benutzer bzw. die Benutzerin eingeloggt hat. Das kann eine lokale Konsole (beispielsweise tty2) oder auch ein fremder Rechner (jupiter.wg) sein, der eine virtuelle Konsole (pts/5) zum Einloggen nutzt.

10.4.3    /var/log/Xorg.log

Die Logdatei der grafischen Oberfläche ist ein typisches Beispiel für eine Logdatei einer Anwendung, die ja vom System getrennt ist. An dieser Stelle möchten wir nur erwähnen, dass es diese Datei gibt, da man nach unerklärlichen Abstürzen des XServers vielleicht hier einen Hinweis auf die Ursache findet.

10.4.4    syslogd

Der syslogd hat nur bedingt etwas mit Logdateien zu tun – er ist ein sogenannter Daemonprozess und verwaltet die Logdateien. Wenn dieser Dienst läuft, haben auch andere Rechner im Netzwerk die Möglichkeit, auf diesem Rechner ihre Logdateien anzulegen. Aus diesem Grund ist in der /var/log/messages ein Feld für den Rechnernamen reserviert – so können Sie die einzelnen Systeme auseinanderhalten. Sinnvoll ist der Einsatz eines Logging-Servers oft nur in größeren Netzwerken, wo beispielsweise Hacker daran gehindert werden sollen, auf gehackten Systemen durch das Löschen von Logdateien ihre Spuren zu verwischen.

10.4.5    logrotate und DoS-Angriffe

Logdateien werden mit der Zeit immer größer, und übergroße Logdateien können ein System potenziell außer Gefecht setzen, indem sie irgendwann die ganze Festplatte füllen und das System somit keine neuen Daten mehr ablegen kann. Man nennt einen derartigen Angriff einen DoS-Angriff (Denial of Service), weil der Rechner vom Angreifer so überlastet wird, dass er schließlich den Dienst verweigert.[ 26 ]

Zur Lösung des Problems überfüllter Platten gibt es das Programm logrotate. Wird eine Logdatei zu groß oder ist ein bestimmter Zeitabschnitt vorüber, wird die Logdatei gepackt bzw. gelöscht und eine neue, leere Logdatei erstellt.

logrotate ist kein Daemonprozess, und das hat auch seine Gründe. Es ist nicht notwendig, dass logrotate die gesamte Zeit im Hintergrund läuft und Speicher sowie Rechenzeit frisst – logrotate läuft als cron-Job, wird also vom cron-Daemon in einem regelmäßigen Intervall gestartet.

In vielen Distributionen ist logrotate schon als cron-Job sinnvoll vorkonfiguriert, und wenn Sie in Ihrem Logverzeichnis /var/log ein paar durchnummerierte und gepackte Dateien finden, ist logrotate bereits am Werk.

$ ls /var/log/messages*
/var/log/messages
/var/log/messages-20230510.gz
/var/log/messages-20230629.gz

Listing 10.29     logrotate im Einsatz

10.4.6    tail und head

Wenn Sie einmal einen Blick in /var/log werfen, werden Sie feststellen, dass dort viel mehr Dateien liegen als nur die paar, die wir Ihnen hier vorgestellt haben. Zudem sind Logdateien trotz logrotate mitunter sehr groß, und ein Anschauen mit cat <Datei> macht da nicht wirklich Spaß.

Als Lösung bieten sich wie immer ein paar mysteriöse Shellprogramme an: head und tail. Beide Programme haben eine ähnliche Syntax und zeigen jeweils Teile einer Datei, doch mit dem Unterschied, dass head die ersten und tail entsprechend die letzten Zeilen einer Datei anzeigt.

$ head Makefile
all : .
        latex buch
        makeindex -s gp97.ist buch
        latex buch
        makeindex -s gp97.ist buch
        latex buch
        dvips -P gp -j0 -o buch.ps buch
…

$ tail Makefile
view:
        evince buch.ps

backup : 
        cp -r *.tex ../working_backup/
        sync
…

Listing 10.30     head und tail

In diesem Beispiel haben wir uns einfach das Makefile für unser Buch angeschaut. Ein Makefile ist eine Art Skript, das normalerweise eher für die Programmierung genutzt wird. Wir haben jedoch ein Skript geschrieben, das unser Buch automatisch übersetzt, sichert oder in einem Extra-Betrachter anzeigt. Aber eigentlich ist das nebensächlich, denn es geht schlicht um den Fakt, dass head wie versprochen den Anfang und tail das Ende der Datei ausgibt. Per Default sind das jeweils 10 Zeilen, es kann aber mit der Option -n eine andere Zeilenzahl angegeben werden.

Da in Logdateien die neuesten Einträge sinnvollerweise immer unten stehen, ist sicherlich tail für Sie das Programm der Wahl. Mit der Option -f können Sie auch aktuelle Änderungen mitverfolgen. Das Programm bleibt aktiv, und wenn neue Einträge in die Datei geschrieben werden, werden sie auch gleichzeitig auf dem Bildschirm ausgegeben.