Auf einem unserer Systeme lieferte das Kommando „who -r“ keine Ausgabe und auch keinen Fehler:
$ who -r
$ echo $?
0
$
In Folge dessen kam es zu einem Fehler bei einem Installationsskript, welches den Run-Level nicht ermitteln konnte.
Das Kommando „who -r“ bekommt die Information über den Run-Level aus der binären Log-Datei /etc/utmp. Der Run-Level eines Systems wird im zweiten Record der Datei festgehalten. Die Vermutung war, das die /etc/utmp korrupte Einträge enthält.
Mit dem Kommando /usr/sbin/acct/fwtmp (bos.acct) können binäre utmp-Records nach ASCII konvertiert werden (und umgekehrt). Das Kommando erwartet die zu konvertierenden Einträge über die Standard-Eingabe. In unserem Fall ergab sich folgendes:
$ cat /etc/utmp | /usr/sbin/acct/fwtmp
system boot 2 0 0000 0000 1484666008 Tue Jan 17 16:13:28 CET 2017
root 0 804397248 0000 0000 0 \ufffd{\ufffd\ufffd Thu Jan 1 01:00:00 CET 1970
naudio 8 3473526 0000 0000 1484666008 Tue Jan 17 16:13:28 CET 2017
naudio2 8 3539068 0000 0000 1484666008 Tue Jan 17 16:13:28 CET 2017
...
Die Ausgabe bestätigt das der zweite Record korrupt ist, er sollte eigentlich den Run-Level enthalten. Ein Vergleich mit den Einträgen eines anderen Systems zeigt wie der korrekte Eintrag aussehen sollte:
system boot 2 0 0000 0000 1545044734 Mon Dec 17 12:05:34 2018
run-level 2 1 0 0062 0123 1545044734 Mon Dec 17 12:05:34 2018
Wir haben dann zunächst eine Kopie der korrupten /etc/utmp gemacht und anschließend eine ASCII-Version in einer Datei abgespeichert um dann den korrupten Eintrag mit einem Editor zu korrigieren:
# cp /etc/utmp /etc/utmp.orig
# cat /etc/utmp | /usr/sbin/acct/fwtmp -X -L >/etc/utmp.ascii
#
Die Optionen -X und -L sorgen dafür das User- und Host-Namen nicht verkürzt werden.
Nun wird die zweite Zeile korrigiert, indem wir diese durch den Eintrag oben von einem funktionierenden System ersetzen und dann noch die Zeit-Stempel vom ersten Datensatz übernehmen. Insgesamt ergibt sich dann der folgende Inhalt:
system boot 2 0 0000 0000 1484666008 Tue Jan 17 16:13:28 CET 2017
run-level 2 1 0 0062 0123 1484666008 Tue Jan 17 16:13:28 CET 2017
naudio 8 3473526 0000 0000 1484666008 Tue Jan 17 16:13:28 CET 2017
...
Abschließend konvertieren wir die korrigierte ASCII-Version wieder in das binäre Format und Speichern die korrigierte Version unter /etc/utmp ab:
# cat /etc/utmp.ascii | /usr/sbin/acct/fwtmp -ic > /etc/utmp
#
Das Kommando „who -r“ liefert nun wieder den Run-Level zurück:
$ who -r
. run-level 2 Jan 17 16:13 2 0 S
$
Das Problem ist damit behoben.