Pfad zum Executable eines laufenden AIX Prozesses herausfinden

Wurde ein Prozeß nicht mit absolutem Pfad gestartet, dann ist es überraschend schwierig den absoluten Pfad für das zugehörige Executable herauszufinden.

Wir demonstrieren dies am Beispiel von Splunk:

$ ps -ef |grep splun[k]d
    root  7143802  5702116   0   Apr 23      - 23:26 splunkd --nodaemon -p 8089 _internal_exec_splunkd
    root 31916484  7143802   0   Apr 23      -  0:00 [splunkd pid=7143802] splunkd --nodaemon -p 8089 _internal_exec_splunkd [process-runner]
$

Beim Start des Prozesses mit der PID 31916484 wurde zusätzlich das Argument 0 abgeändert.

Ein Teil der Informationen zu einem Prozeß sind über das Prozeß-Dateisystem /proc verfügbar. Da Splunk unter der Kennung von root läuft, sind root-Rechte notwendig, um auf die Informationen unter /proc zum Prozeß zuzugreifen.

Unterhalb von /proc gibt es für jeden aktiven Prozeß ein Unterverzeichnis mit der PID als Verzeichnisname.

# ls -l /proc/31916484
total 32
-rw-------    1 root     system            0 Apr 28 15:17 as
-r--------    1 root     system          128 Apr 28 15:17 cred
--w-------    1 root     system            0 Apr 28 15:17 ctl
lr-x------   38 root     system            0 Apr 28 13:31 cwd -> /root/
dr-x------    1 root     system            0 Apr 28 15:17 fd
dr-xr-xr-x    1 root     system            0 Apr 28 15:17 lwp
-r--------    1 root     system            0 Apr 28 15:17 map
-r--------    1 root     system            0 Apr 28 15:17 mmap
dr-x------    1 root     system            0 Apr 28 15:17 object
-r--r--r--    1 root     system          448 Apr 28 15:17 psinfo
lr-x------   48 root     system            0 Apr 28 09:02 root -> /
-r--------    1 root     system        12288 Apr 28 15:17 sigact
-r--------    1 root     system         1520 Apr 28 15:17 status
-r--r--r--    1 root     system            0 Apr 28 15:17 sysent
#

Im Unterverzeichnis object ist neben den geöffneten Dateien auch das Executable verfügbar:

# ls -l /proc/31916484/object
total 854216
-r-xr-xr-x    1 root     system    194980846 Nov 16 2019  a.out
-r-xr-xr-x    1 bin      bin           10749 Sep 21 2015  jfs2.10.5.103039
-r--r--r--    1 bin      bin        12858422 May 28 2019  jfs2.10.5.225767
-r-xr-xr-x    1 bin      bin           77411 Mar 25 2021  jfs2.10.5.4157
-r-xr-xr-x    1 bin      bin        13438344 Jul 27 2021  jfs2.10.5.4205
-r--r--r--    1 bin      bin         1351386 Mar 09 2021  jfs2.10.5.4209
-r--r--r--    1 bin      bin           80450 Jul 27 2021  jfs2.10.5.4220
-r-xr-xr-x    1 root     system    194980846 Nov 16 2019  jfs2.10.9.139342
-r-xr-xr-x    1 root     system      3487967 Nov 12 2019  jfs2.10.9.155672
-r-xr-xr-x    1 root     system       228087 Nov 12 2019  jfs2.10.9.155673
-r-xr-xr-x    1 root     system      2688333 Nov 16 2019  jfs2.10.9.155675
-r-xr-xr-x    1 root     system       901800 Nov 12 2019  jfs2.10.9.155677
-r-xr-xr-x    1 root     system      4256593 Nov 12 2019  jfs2.10.9.155679
-r-xr-xr-x    1 root     system       568791 Nov 16 2019  jfs2.10.9.155684
-r-xr-xr-x    1 root     system      6166802 Nov 12 2019  jfs2.10.9.155685
-r-xr-xr-x    1 root     system      1239656 Nov 12 2019  jfs2.10.9.155686
-r-xr-xr-x    1 root     system       124218 Nov 16 2019  jfs2.10.9.155690
#

Die Datei a.out repräsentiert dabei das Executable. Ein Zugriff auf diese Datei wird auf die Datei des Executables umgeleitet. Mit dem Kommando istat lassen sich Informationen wie Inode-Nummer und Gerät (Dateisystem) des Executables heraufinden:

# istat /proc/31916484/object/a.out
Inode 139342 on device 10/9     File
Protection: r-xr-xr-x  
Owner: 0(root)          Group: 0(system)
Link count:   1         Length 194980846 bytes

Last updated:   Tue Jul 27 07:15:40 CEST 2021
Last modified:  Sat Nov 16 01:23:05 CET 2019
Last accessed:  Thu Apr 28 10:38:13 CEST 2022

#

Die Inode-Nummer des Executables ist 139342. Das Dateisystem ist das Dateisystem auf dem Gerät mit der Major-Nummer 10 und der Minor-Nummer 9 („device 10/9“).

Man könnte nun erst einmal das Gerät durch eine Suche unter /dev herausfinden:

$ ls -l /dev | grep "10,  9"
brw-rw----    1 root     system       10,  9 Jul 27 2021  hd10opt
crw-rw----    1 root     system       10,  9 Apr 05 13:36 rhd10opt
$

und dann das zugehörige Dateisystem über df ermitteln:

$ df | grep hd10opt
/dev/hd10opt    12582912   7527920   41%    33349     4% /opt
$

Allerdings geht dies noch einfacher. Man kann einfach den Pfad für die a.out Datei bei df angeben:

# df /proc/31916484/object/a.out
Filesystem    512-blocks      Free %Used    Iused %Iused Mounted on
/dev/hd10opt    12582912   7527912   41%    33349     4% /opt
#

Das gesucht Dateisystem ist das /opt-Dateisystem. Nun kann man mit einer Suche nach der Inode-Nummer 139342 in /opt den absoluten Pfad zum Executable herausfinden:

# find /opt -inum 139342
/opt/splunkforwarder/bin/splunkd
#

Der Prozeß mit der PID 31916484 führt also das Executable /opt/splunkforwarder/bin/splunkd aus.

Mit einem kleinen Trick kann man die Suche auch deutlich abkürzen. Dazu benötigt man eine Shell als Benutzer root. In dieser Shell öffnet man die a.out explizit mittels exec und einer (freien) Descriptor-Nummer:

# exec 5</proc/31916484/object/a.out
#

Unsere aktuelle Shell hat damit das Executable geöffnet (über den Filedescriptor 5)! Nun lässt man sich mit dem Kommando procfiles die offenen Dateien dieser Shell anzeigen. Dabei benutzt man die Option „-n“, welche die absoluten Pfade von Dateien anzeigt, die zu einem Filedescriptor gehören:

# procfiles -n $$
19136808 : ksh
  Current rlimit: 10000 file descriptors
   0: S_IFCHR mode:00 dev:10,4 ino:4463 uid:0 gid:0 rdev:21,3
      O_RDWR | O_NOCTTY  name://dev/pts/3
   1: S_IFCHR mode:00 dev:10,4 ino:4463 uid:0 gid:0 rdev:21,3
      O_RDWR | O_NOCTTY  name://dev/pts/3
   2: S_IFCHR mode:00 dev:10,4 ino:4463 uid:0 gid:0 rdev:21,3
      O_RDWR | O_NOCTTY  name://dev/pts/3
   5: S_IFREG mode:0555 dev:10,9 ino:139342 uid:0 gid:0 rdev:0,0
      O_RDONLY size:194980846  name:/opt/splunkforwarder/bin/splunkd
   10: S_IFREG mode:0444 dev:10,5 ino:124151 uid:0 gid:0 rdev:0,0
      O_RDONLY size:5875  name:/usr/lib/nls/msg/EN_US/ksh.cat
   63: S_IFREG mode:0600 dev:10,4 ino:41933 uid:0 gid:0 rdev:0,0
      O_RDWR | O_APPEND size:5494  name://root/.sh_history
#

Hinweis: Die spezielle Variable $$ wird von der Shell durch die PID der Shell ersetzt.

Für den Filedescriptor 5 wird der absolute Pfad /opt/splunkforwarder/bin/splunkd angezeigt.

Anschließend sollte man den Filedescriptor wieder schließen:

# exec 5<&-
#

Passwörter nicht-interaktiv ändern

AIX bietet mit dem Kommando chpasswd die Möglichkeit Passwörter sowohl interaktiv, als auch nicht interaktiv zu ändern. Allerdings ist die Benutzung des Kommandos dem Benutzer root vorbehalten.

Im einfachsten Fall kann der Administrator das Kommando ohne Argumente starten. Es wird dann die interaktive Eingabe von Benutzernamen und zugehörigem Passwort, getrennt durch einen Doppelpunkt „:“, erwartet. Pro Zeile wird ein Benutzername und ein Klartext-Passwort angegeben. Die Eingabe muss mit Control-D beendet werden:

# chpasswd
user01:hello19
<Control>-<D>
#

Es wird per Default das ADMCHG Flag für den Benutzer-Account gesetzt:

# pwdadm -q user01
user01:
        lastupdate = 1650438240
        flags = ADMCHG

#

Damit wird der Benutzer beim nächsten Login aufgefordert sein Passwort zu ändern.

Möchte man das Setzen des Passworts über ein Skript nicht interaktiv machen, kann z.B. ein sogeanntes „here“ Dokument verwendet werden:

# chpasswd -c <<EOF
> user02:hello20
> EOF
#

Diese Variante erfordert keine manuelle Eingabe mehr. Die einzugebenden Benutzer und Passwörter können direkt im Skript eingetragen werden. Um zu Verhindern das die Benutzer beim nächsten Login aufgefordert werden ihr Passwort zu ändern, haben wir die Option „-c“ (clear all password flags) verwendet.

Alternativ könnte man aber auch z.B. eine Pipe mit einem echo-Kommando verwenden:

# echo user03:hello21 | chpasswd -c
#

Verwendet man eine bash, dann gibt es noch die besonders elegante Möglichket eine Eingabe-Umleitung auf eine Zeichenkette einzurichten. Dazu werden 3 Kleiner-Zeichen „<<<“ gefolgt von einer Zeichenkette verwendet:

(bash)# chpasswd -c <<<user04:hello22
(bash)#

In allen obigen Beispielen wurde das Passwort jeweils im Klartext angegeben. Das ist in der Regel bei nicht-interaktivem Setzen des Passworts nicht gewünscht. Man kann das Passwort aber auch in verschlüsselter Form angeben. Dazu muss lediglich die Option „-e“ (encrypted password) verwendet werden. Es erfolgt keine Prüfung durch das chpasswd Kommando, ob das angegebene verschlüsselte Passwort die richtige Länge und Syntax hat, oder ob es überhaupt gültig ist!

Allerdings muss man nun beachten, dass das verschlüsselte Passwort eventuell Sonderzeichen wie „$“ oder „!“ enthält, die von der Shell ausgewertet und eventuell ersetzt werden. Bei Verwendung eines „here“ Dokuments werden Sonderzeichen in der Eingabe durch die Shell interpretiert. Wir demonstrieren dies durch Setzen einer Variable VAR, die dann im verschlüsselten Passwort verwendet wird:

# VAR=hello
# chpasswd -e -c <<EOF
> user02:{ssha512}06TQ.$VAR
EOF
#

Das angegebene verschlüsselte Passwort ist viel zu kurz und daher nicht gültig, es gibt aber keine Fehlermeldung. Der Teil „$VAR“ wird von der Shell durch den Wert „hello“ ersetzt, wie das Anzeigen des gesetzten Passworts zeigt:

# lsuser -a spassword user02
user02 spassword={ssha512}06TQ.hello
#

Die Ersetzung durch die Shell lässt sich verhindern, indem das Wort „EOF“ in Anführungszeichen gesetzt wird:

# VAR=hello
# chpasswd -e -c <<”EOF”
> user02:{ssha512}06TQ.$VAR
EOF
#

Dieses Mal wurde “$VAR” nicht ersetzt:

# lsuser -a spassword user02
user02 spassword={ssha512}06TQ.$VAR
#

(Das verschlüsselte Passwort ist aber nach wie vor zu kurz und damit ungültig.)

Gruppen-Mitgliedschaft unter AIX mit chgrpmem verwalten

AIX bietet ein elegantes Kommando um die Mitgliedschaft von Benutzern in Gruppen zu ändern: chgrpmem.

Als Beispiel verwenden wir die Benutzer user01, user02, …, sowie die Gruppe mygroup:

$ lsgroup mygroup
mygroup id=225 admin=false users= registry=files
$

Die Gruppe mygroup besitzt aktuell noch keine Mitglieder (users=““).

Um die beiden lokalen Benutzer user01 und user02 der Gruppe mygroup hinzuzufügen, muss die Option „-m“ (Member) verwendet werden. Dann folgt das Zeichen Plus „+“ für Hinzufügen und eine komma-separierte Liste von Benutzernamen. Als letztes Argument muss noch die Gruppe angegeben werden:

# chgrpmem -m + user01,user02 mygroup
#
# lsgroup mygroup
mygroup id=225 admin=false users=user01,user02 registry=files
#

Verwendet man anstelle des Plus-Zeichens „+“ das Gleichheits-Zeichen „=“, dann wird die aktuelle Liste der Benutzer durch die angegebene Liste von Benutzernamen überschrieben:

# chgrpmem -m = user03,user04,user05 mygroup
# 
# lsgroup mygroup
mygroup id=225 admin=false users=user03,user04,user05 registry=files
#

Das Entfernen von Benutzern erfolgt durch Verwenden eines Minus-Zeichens „“ z.B. Entfernen des Benutzers user04:

# chgrpmem -m - user04 mygroup
# 
# lsgroup mygroup
mygroup id=225 admin=false users=user03,user05 registry=files
#

Das Entfernen eines Benutzers aus der Mitgliederliste einer Gruppe muss aber nicht immer erfolgreich sein! Wir legen den Benutzer user06 mit primärer Gruppe mygroup an:

# mkuser pgrp=mygroup user06
# 
# lsgroup mygroup
mygroup id=225 admin=false users=user03,user05,user06 registry=files
#

Die Ausgabe von lsgroup zeigt das der Benutzer user06 ebenfalls Mitglied der Gruppe mygroup ist. Allerdings lässt sich in diesem Fall die Mitgliedschaft nicht aufheben:

# chgrpmem -m - user06 mygroup
Cannot drop "user06" from primary group "mygroup".
#

Ein Benutzer muss immer eine primäre Gruppe haben! Mit dem Kommando chgrpmem können nur die zusätzlichen Mitgliedschaften von Benutzern verwaltet werden. Die primäre Gruppe kann nur mit dem Kommando chuser geändert werden.

Hinweis: Mit dem Kommando chgrpmem und der Option „-a“ können auch die Administratoren einer Gruppe geändert werden. Dies wird in der Praxis aber eher selten verwendet und ist daher hier auch nicht angesprochen.

Ändern der PVID eines Physical Volumes

Jedes Physical Volume das vom AIX LVM verwendet wird, besitzt eine eindeutige Physical Volume ID, kurz PVID. Die PVID ist eine Software-generierte ID, die im Header Bereich einer Platte (Block 0) abgespeichert wird. Wenn eine neue Platte einem AIX System hinzugefügt wird, dann besitzt das neue Physical Volume noch keine PVID. Sobald ein Physical Volume einer Volume Group hinzugefügt wird, wird eine PVID generiert, wenn das Physical Volume noch keine PVID haben sollte. Eine schon existierende PVID wird übernommen.

Eine PVID kann auch manuell mit Hilfe des Kommandos chdev erzeugt werden. Dabei wird das Attribut pv auf den Wert yes gesetzt:

# chdev -l hdisk3 -a pv=yes
hdisk3 changed
#

Die gesetzte PVID kann entweder mit dem Kommando lsattr oder auch einfach mit lspv angezeigt werden:

$ lsattr -El hdisk3 -a pvid -F value
00c276b0084049750000000000000000
$
$ lspv |grep hdisk3
hdisk3          00c276b008404975                    None                       
$

Eine PVID kann auch wieder entfernt werden. Dazu darf das Physical Volume allerdings nicht in Verwendung sein (.z.B. als Teil einer Volume Group).

Um eine PVID eines Physical Volumes zu löschen, kann das Attribut pv auf den Wert clear gesetzt werden:

# chdev -l hdisk3 -a pv=clear
hdisk3 changed
#

Die PVID wurde entfernt, wie die nachfolgenden Aussagen zeigen:

$ lsattr -El hdisk3 -a pvid -F value
none
$
$ lspv |grep hdisk3
hdisk3          none                                None                       
$

Der Versuch die PVID eines Physical Volumes zu löschen, das in Verwendung ist, führt zu der folgenden Fehlermeldung:

# chdev -l hdisk0 -a pv=clear
Method error (/usr/lib/methods/chgdisk):
        0514-062 Cannot perform the requested function because the
                 specified device is busy.
     pv    

#

 

Größe eines Physical Volumes bestimmen

Um die Größe eines Physical Volumes (Disk, LUN) zu bestimmen, gibt es unter AIX eine Reihe verschiedener Möglichkeiten.

Besitzt man root-Rechte, kann das Kommando bootinfo mit der Option „-s“ (size) verwendet werden:

#  bootinfo -s hdisk0
51200
#

Die Größe des Physical Volumes wird in MB ausgegeben. Im Beispiel also 51.200 MB oder ca 50 GB.

Ohne root-Rechte, kann das Kommando getconf verwendet werden. Mit diesem Kommando können systemweite Konfigurationsparameter, aber auch gerätespezifische Variablen angezeigt werden. Um die Größe eines Physical Volumes anzuzeigen, kann die gerätespezifische Variable DISK_SIZE verwendet werden. Das in Frage kommende Physical Volume wird über den absoluten Pfad der Block- oder Character-Gerätedatei des Physical Volumes angegeben:

$ getconf DISK_SIZE /dev/hdisk0
51200
$

Auch hier wird die Größe in MB ausgegeben.

Eine weitere Möglichkeit, die aber wieder root-Rechte erfordert, ist die Verwendung des Kommandos lsmpio. Dieses bietet über die Option „-q“ (query) Daten über ein MPIO Storage Gerät anzuzeigen:

# lsmpio -ql hdisk0
Device:  hdisk0
…
           Capacity:  50.00GiB
…
#

Die Größe wird dieses Mal direkt in GB (GiB) angezeigt.

Ist das Physical Volume Teil einer Volume Group, kann auch das Kommando lspv verwendet werden, um die Größe zumindest abzuschätzen:

$ lspv hdisk0
…
TOTAL PPs:          199 (50944 megabytes)    VG DESCRIPTORS:   2
…                                      
$

Hier wird der für Daten verwendbare Bereich angegeben (50.944 MB), das Physical Volume selbst ist etwas größer, da ja auch noch Platz für Verwaltungsinformationen verwendet wird.

LPAR-Tool 1.7.0.1 ist ab sofort verfügbar

Ab sofort ist die Version 1.7.0.1 des LPAR-Tools in unserem Download-Bereich verfügbar.

Die neue Version unterstützt unter anderem die folgenden neuen Features:

    • Installation von IFixes und Updates auf der HMC (hmc help updhmc)
    • System-Firmware Updates (und mehr) von Managed Systems (ms help updatelic)
    • Anzeigen von FLRT Daten mit Online Abfrage bei IBM (hmc help flrt, ms help flrt, lpar help flrt)
    • Konfiguration von NTP auf HMCs (hmc help ntp)

Es stehen Versionen für Linux, AIX und Macos zur Verfügung.

Alle Versionen beinhalten eine Test-Lizenz mit einer Gültigkeit bis 30.09.2022.

Also Downloaden, Installieren und dann Ausprobieren!