Das Kommando ‚who -r‘ liefert keinen Run-Level zurück

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.

/usr/sbin/rpm_share[440]: 36044986 Illegal instruction

Obige Fehlermeldung ist bei der Installation eines RPM-Pakets aufgetreten:

# rpm -U db4-4.7.25-2.aix5.1.ppc.rpm 
/usr/sbin/rpm_share[440]: 36044986 Illegal instruction
rpm_share: 0645-007 ATTENTION: get_rpm_inst_root_list() returned an unexpected result.
rpm_share: 0645-007 ATTENTION: update_inst_root() returned an unexpected result.

Das rpm-Kommando funktioniert nicht mehr, ein Rebuild der RPM-Datenbank ist damit auch nicht mehr möglich:

# rpm --rebuilddb
/usr/sbin/rpm_share[470]: 22478966 Illegal instruction

Abhilfe schafft hier das Fileset rpm.rte noch einmal zu installieren:

# installp -acFXYd . rpm.rte
+-----------------------------------------------------------------------------+
                    Pre-installation Verification...
+-----------------------------------------------------------------------------+

...

Installation Summary
--------------------
Name                        Level           Part        Event       Result
-------------------------------------------------------------------------------
rpm.rte                     4.13.0.3        USR         APPLY       SUCCESS    
rpm.rte                     4.13.0.3        ROOT        APPLY       SUCCESS

Im Anschluß funktioniert auch das rpm-Kommando wieder:

# rpm -qa
...
db4-4.7.25-2.ppc
...
AIX-rpm-7.1.5.15-7.ppc

 

 

PVID / erster Block sichern

Manchmal kommt es vor, dass durch div. hdisk Operationen die PVID gelöscht wird und die Platte mit ihren Daten nicht mehr erkennbar ist für AIX. Da ist es gut wenn man eine Sicherung der PVID hat 😉
Das geht so:

dd if=/dev/hdiskXX of=hdiskXX.block1 bs=512 count=1

zurückschreiben:

dd if=hdsikXX.block1 of=/dev/hdiskXXbs=512 count=1

PVID manuell setzen

Manchmal kann man es brauchen, die eigene PVID auf einer hdisk 🙂

Es ist gar nicht so schwer. Die gewünschte hexadezimale PVID muss erst in oktal umgewandelt werden. Zum Beispiel:

PVID 00f78f7be1815e7d
hex  oktal
0    0
f6   367
8f   317
7b   173
e1   341
81   201
5e   136
7d   175

So einfach gehts:

# echo "\0000\0367\0317\0173\0341\0201\0136\0175\c" | \ 
> dd of=/dev/hdiskX bs=1 seek=128 
8+0 records in 
8+0 records out

Oder 🙂

# echo "\0000\0000\0000\0000\0000\0000\0000\0001\c" | \
> dd of=/dev/hdiskX bs=1 seek=128

Mehr dazu gibt es in diversen Videos im Bereich „Advanced Administration“

Mounten eines ISO-Images

Natürlich lässt sich mit dem im letzten Beitrag vorgestellten Kommando /usr/sbin/loopmount auch ein ISO-Image mounten:

# loopmount -i /path/to/iso/image.iso -o „-o ro -V cdrfs“ -m /mnt

Unmounten und löschen des erzeugten loopback Devices geht dann mit /usr/sbin/loopumount:

# loopumount -l loopX -m /mnt

 

Erzeugen eines jfs2-Filesystems in einer Datei

In diesem Beitrag soll das Erzeugen eines jfs2-Filesystems in einer Datei beschrieben werden. Gelegentlich gibt es Situationen, in denen man ein Filesystem braucht, man aber nicht die Möglichkeit hat ein Filesystem in einem Logical Volume zu verwenden. Falls dies der Fall sein sollte, existiert eine Möglichkeit dennoch zu einem Filesystem zu kommen, indem das Filesystem in einer Datei erzeugt wird.

Zunächst muss man eine Datei anlegen, in welcher das jfs2-Filesystem angelegt werden soll. Wobei diese auch in einem per NFS gemounteten Filesystem liegen könnten:

# lmktemp /path/to/file 1000m

Hier kann man jedoch nicht g für GB angeben. Die Datei kann natürlich auch mit anderen Kommandos (z.B. dd) erzeugt werden. Damit man auf die Datei zugreifen kann, muss nun aber ein Gerät für diese Datei erzeugt werden. Unter AIX gibt es hierfür den Gerätetyp loopback. Standardmäßig werden diese Geräte mit loop und einer fortlaufenden Nummer benannt.

Mittels lsdev kann leicht überprüft werden, ob man schon ein solches Device hat:

# lsdev -l loop\*

Mit dem Kommando /usr/sbin/loopmount kann man dann ein solches Gerät erzeugen:

# loopmount -i /path/to/file

Jetzt sollte es damit auch ein neues loopback Device geben:

# lsdev -l loop\*
loop0 Available  Loopback Device

# lsattr -El loop0
filename  /tmp/bigfile Name of the image file to be associated with the device True
temporary yes          Determines if the device should be removed at boot time True

Nun kann auf dem loopback Device ein jfs2-Filesystem erzeugt werden:

# mkfs -V jfs2 -o log=INLINE /dev/loop0
mkfs: destroy /dev/loop0 (y)? y
logform: Format inline log for  <y>?y
File system created successfully.
1015572 kilobytes total disk space.
Device /dev/loop0:
Standard empty file system
Size:           2031144 512-byte (DEVBLKSIZE) blocks

Das erzeugte Filesystem kann nun gemountet werden. Das Kommando mfks darf nicht noch einmal ausgeführt werden, wenn die Datei schon ein jfs2-Filesystem beinhaltet. Zum Mounten eines Filesystems in einer Datei gibt es das spezielle Kommando loopmount:

# loopmount -l loop0 -o "-V jfs2 -o log=INLINE" -m /mnt

Alternativ kann das Filesystem auch mit dem Kommando mount gemountet werden:

# mount -V jfs2 -o log=INLINE /dev/loop0 /mnt

Das Filesystem kann nun normal benutzt werden.

# df -g /mnt
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/loop0         0.98      0.97    1%        4     1% /mnt

Das Filesystem kann ganz einfach wieder entfernt werden, wenn es nicht mehr benötigt wird:

# loopumount -l loop0 -m /mnt

Das Filesystem wird ausgehangen und das loopback Device wird gelöscht (falls das Attribut temporary auf yes gesetzt ist, das ist der Default für loopback Devices).

Die Datei muss aber manuell gelöscht werden, wenn diese nicht mehr benötigt wird:

# rm /path/to/file

Wir hoffen dieser Beitrag über das Erzeugen eines jfs2-Filesystems in einer Datei war sowohl informativ als auch hilfreich!