Migration von SDDPCM nach AIX PCM

Auf vielen AIX Systemen wird aktuell noch SDDPCM als Multipathing Lösung eingesetzt. Allerdings wird SDDPCM auf POWER 9 Hardware von IBM nicht mehr unterstützt.

Im folgenden soll daher die Migration von SDDPCM nach AIX PCM gezeigt werden. Auf unserem Beispielsystem haben wir die folgenden Physical Volumes:

$ lspv
hdisk0          00abcdefabcde000                    datavg          active     
hdisk1          00abcdefabcde001                    datavg          active     
hdisk2          none                                None                       
hdisk3          00abcdefabcde003                    altinst_rootvg             
hdisk4          00abcdefabcde004                    rootvg          active     
$

Bei den Physical Volumes handelt es sich um Platten, die über einen SVC zur Verfügung gestellt werden:

$ lsdev -l hdisk0 -F uniquetype
disk/fcp/2145
$

Als Path Control Module (PCM) wird SDDPCM verwendet:

$ lsattr -El hdisk0 -a PCM -F value
PCM/friend/sddpcm
$

Dies sieht man auch, wenn man sich die Liste der Kernel Extensions anschaut:

$ genkex | grep pcm
f1000000c012a000    af000 /usr/lib/drivers/sddpcmke
$

Welcher PCM Treiber für welche Disk Typen verwendet wird, lässt sich leicht mit dem Kommando „manage_disk_drivers“ sehen:

$ manage_disk_drivers -l
Device              Present Driver        Driver Options    
2810XIV             AIX_AAPCM             AIX_AAPCM,AIX_non_MPIO
DS4100              AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DS4200              AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DS4300              AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DS4500              AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DS4700              AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DS4800              AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DS3950              AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DS5020              AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DCS3700             AIX_APPCM             AIX_APPCM
DCS3860             AIX_APPCM             AIX_APPCM
DS5100/DS5300       AIX_SDDAPPCM          AIX_APPCM,AIX_SDDAPPCM
DS3500              AIX_APPCM             AIX_APPCM
XIVCTRL             MPIO_XIVCTRL          MPIO_XIVCTRL,nonMPIO_XIVCTRL
2107DS8K            NO_OVERRIDE           AIX_AAPCM,AIX_non_MPIO,NO_OVERRIDE
IBMFlash            NO_OVERRIDE           AIX_AAPCM,AIX_non_MPIO,NO_OVERRIDE
IBMSVC              NO_OVERRIDE           AIX_AAPCM,AIX_non_MPIO,NO_OVERRIDE
$

In unserem Falle, SVC Platten, ist die letzte Zeile relevant (IBMSVC). Als aktueller PCM Treiber ist hier NO_OVERRIDE gelistet, mögliche andere Treiber sind AIX_AAPCM (AIX PCM für active/active und ALUA Systeme) und AIX_non_MPIO (Platten ohne Multi-Pathing betreiben). Der Wert NO_OVERRIDE bedeutet, das wenn kein Multipathing-Treiber explizit angegeben wird, nach Möglichkeit ein Multipathing-Treiber verwendet wird (falls vorhanden), ansonsten wird kein Multipathing-Treiber verwendet. Steht mehr als ein Multipathing-Treiber zur Verfügung (bei uns AIX PCM und SDDPCM, dann hat SDDPCM Priorität).

In einem nachfolgenden Blog-Eintrag werden wir die möglichen Werte noch einmal genauer anschauen, sowie die Stelle in AIX, an der die Auswahl festgehalten wird.

Bevor wir jetzt den Treiber für IBMSVC Platten ändern (hierzu ist ein Reboot notwendig), schauen wir uns noch die Attribute unsere Platten an, hier exemplarisch für die hdisk0:

$ lsattr -El hdisk0
PCM             PCM/friend/sddpcm                                   PCM                                     True
...
algorithm       load_balance                                        Algorithm                               True+
...
queue_depth     120                                                 Queue DEPTH                             True+
...
reserve_policy  no_reserve                                          Reserve Policy                          True+
...
$

Durch Ändern des Treibers gehen die Werte einiger gesetzter Attribute verloren, bzw. werden durch neue default Werte des neuen Treibers ersetzt. Dies gilt insbesondere für die queue_depth (hier: 120), die reserve_policy (hier: no_reserve) und die Load-Balancing-Policy (algorithm). Die aktuellen Werte sollte man notieren, um dann nach der Umstellung auf den AIX PCM Treiber diese dann entsprechend anzupassen.

Das Wechseln auf AIX PCM kann mit dem Kommando „manage_disk_drivers“ durchgeführt werden. Hierzu wird dem Kommando der Disk-Typ (hier IBMSVC) mit der Option „-d“ und der gewünschte Treiber (hier AIX_AAPCM für den AIX PCM Treiber) mit der Option „-o“ mitgegeben:

# manage_disk_drivers -d IBMSVC -o AIX_AAPCM
********************** ATTENTION *************************
  For the change to take effect the system must be rebooted
#

Die geänderte Konfiguration lässt sich unmittelbar mit „manage_disk_drivers -l“ auflisten:

$ manage_disk_drivers -l
Device              Present Driver        Driver Options    
...
IBMSVC              AIX_AAPCM             AIX_AAPCM,AIX_non_MPIO,NO_OVERRIDE
$

Für die Durchführung der Änderung muss das System nun rebootet werden:

# shutdown -r now

SHUTDOWN PROGRAM
Thu Feb  7 09:43:38 CET 2019
...

Wir führen die 3 Kommandos vom Anfang noch einmal aus (lspv, lsdev und lsattr):

$ lspv
hdisk0          00abcdefabcde000                    datavg          active     
hdisk1          00abcdefabcde001                    datavg          active     
hdisk2          none                                None                       
hdisk3          00abcdefabcde003                    altinst_rootvg             
hdisk4          00abcdefabcde004                    rootvg          active     
$

Die Physical Volumes sind unverändert.

$ lsdev -l hdisk0 -F uniquetype
disk/fcp/mpioosdisk
$

Der Typ der Platten hat sich geändert von disk/fcp/2145 auf disk/fcp/mpioosdisk. Dies deutet schon an, das sich der Multipathing-Treiber geändert hat.

$ lsattr -El hdisk0 -a PCM -F value
PCM/friend/fcpother
$

Das Path Control Module (PCM) hat sich ebenfalls geändert. Der Typ ist nicht mehr sddpcm sondern fcpother. Das schaut erst einmal nicht direkt nach AIX PCM aus. Ein Blick auf den zugehörigen Treiber zeigt aber sofort das hier AIX PCM in Verwendung ist:

$ lsdev -P -c PCM -s friend -t fcpother -F DvDr
aixdiskpcmke
$

Die zugehörige Kernel Extension aixdiskpcmke ist auch aktuell geladen und in Verwendung:

$ genkex | grep pcm
         73e2000    57000 /usr/lib/drivers/aixdiskpcmke
$

Schauen wir uns nun, wieder exemplarisch für hdisk0, die Attribute an. Wir erwarten ja hier geänderte Werte für einige Attribute:

$ lsattr -El hdisk0
PCM             PCM/friend/fcpother                                 Path Control Module              False
...
algorithm       fail_over                                           Algorithm                        True+
...
queue_depth     20                                                  Queue DEPTH                      True+
...
reserve_policy  single_path                                         Reserve Policy                   True+
...
$

Der Wert 120 für die queue_depth ist verloren gegangen und wurde durch den default Wert 20 ersetzt. Die reserve_policy hat sich auf single_path geändert und der Load-Balancing Algorithmus ist nun fail_over, d.h. es wird immer nur ein Pfad verwendet.

Wir ändern die Einstellungen auf eine Konfiguration die der Ausgangssituation entspricht:

# chdev -P -l hdisk0 -a algorithm=shortest_queue -a queue_depth=120 -a reserve_policy=no_reserve
hdisk0 changed
#

Da das Physical Volume in Benutzung ist, kann die Einstellung nur in der ODM geändert werden und es ist ein weiterer Reboot notwendig.

Nachdem alle Platten über die ODM umkonfiguriert worden sind, muss das System ein zweites Mal rebootet werden:

# shutdown -r now

SHUTDOWN PROGRAM
Thu Feb  6 20:07:12 CET 2019
...

Nach dem Reboot kann SDDPCM dann deinstalliert werden:

# installp -u devices.fcp.disk.ibm.mpio.rte devices.sddpcm.72.rte
+-----------------------------------------------------------------------------+
                    Pre-deinstall Verification...
+-----------------------------------------------------------------------------+
Verifying selections...done
Verifying requisites...done
Results...

SUCCESSES
...
0503-292 This update will not fully take effect until after a
        system reboot.

    * * *  A T T E N T I O N  * * *
    System boot image has been updated. You should reboot the
    system as soon as possible to properly integrate the changes
    and to avoid disruption of current functionality.

installp:  bosboot process completed.
+-----------------------------------------------------------------------------+
                                Summaries:
+-----------------------------------------------------------------------------+

Installation Summary
--------------------
Name                        Level           Part        Event       Result
-------------------------------------------------------------------------------
devices.sddpcm.72.rte       2.7.1.1         ROOT        DEINSTALL   SUCCESS   
devices.sddpcm.72.rte       2.7.1.1         USR         DEINSTALL   SUCCESS   
devices.fcp.disk.ibm.mpio.r 1.0.0.25        USR         DEINSTALL   SUCCESS   
#

Das SDDPCM Fileset, sowie das zugehörige Host-Attachment Fileset, konnten erfolgreich deinstalliert werden.

Da der SDDPCM-Treiber nicht geladen war, und sich damit auch keine Änderungen am Kernel ergeben haben, sollte eigentlich ein weiterer Reboot nicht notwendig sein. Da allerdings ausdrücklich auf einen schnellen Reboot hingewiesen wird, und es auch eine gute Idee ist mit der finalen Konfiguration einen Reboot-Test zu machen, rebooten wir das System ein drittes und letztes Mal:

# shutdown -r now

SHUTDOWN PROGRAM
Thu Feb  6 20:17:21 CET 2019
...

Nach dem Reboot kontrollieren wir noch einmal die Platten-Attribute:

$ lsattr -El hdisk0
PCM             PCM/friend/fcpother                                 Path Control Module              False
...
algorithm       shortest_queue                                      Algorithm                        True+
...
queue_depth     120                                                 Queue DEPTH                      True+
...
reserve_policy  no_reserve                                          Reserve Policy                   True+
...
$

Das System verwendet nun den AIX PCM Treiber für Multipathing:

$ manage_disk_drivers -l
Device              Present Driver        Driver Options    
...
IBMSVC              AIX_AAPCM             AIX_AAPCM,AIX_non_MPIO,NO_OVERRIDE
$

Die Migration von SDDPCM zu AIX PCM ist also in der Durchführung ziemlich einfach.

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!