Solaris 10: Zone im ‹mounted› Status

Eine Zone, welche sich im Status mounted befindet? Das kann eigentlich nicht sein.  Zumal es diesen Status in den offiziellen Dokumentationen von SUN auch nicht zu geben scheint.

# zoneadm list -cv
  ID NAME          STATUS     PATH                     BRAND    IP
   0 global        running    /                        native   shared
   1 zone1         running    /opt/local/zones/zone1   native   shared
   2 zone2         running    /opt/local/zones/zone2   native   shared
  10 zone3         mounted    /opt/local/zones/zone3   native   shared

Durchkämmt man den OpenSolaris Code nach den verschiedenen Statussen findet man jedoch auch die Definition für den mounted Status

#define ZONE_STATE_MOUNTED

Und wie kommt dieser Status zustande? Hauptsächlich durch die Installation eines neuen Patches/Paketes. Hierdurch wird mit den Befehlen die Zone (sofern diese nicht lief) in den Status mounted gebootet um dann das Pake/den Patch installieren zu können. Im Normalfall wird das entsprechende Tool dann auch den Ursprünglichen Zustand wieder herstellen. Aber manchmal funktioniert das halt nicht.

Das Problem ist, dass man mit der Zone solange nichts machen kann (kein reboot, kein halt) bis man den Status auf installed gebracht hat. Hierzu verwendet man einen ebenfalls eine nicht angegebene Option von zoneadm: unmount

Mit dem Befehl:

zoneadm -z zone3 unmount

Wird die Zone sauber unmounted und wieder in den Status installed gebracht.




Solaris 10: Kernel Modul Parameter setzen

Gerade eben wollte ich auf einem unserer Solaris 10 Systeme den Parameter nfs_portmon des nfssrv Modules von 1 auf 0 setzen, damit er die unprivilegierten Ports nicht prüft.

Nun wird überall im Netz geraten, in /etc/system den Eintrag vorzunehmen und dann einen reboot durchzuführen. Warum aber sollte ich ein ganzes System mit unzähligen Zonen neu starten, wenn ich doch nur einen Parameter ändern möchte?

Es muss doch bei Solaris 10 möglich sein, wie unter Linux (mit dem sysctl Befehl) die Kernelkonfiguration zu manipulieren. Nach ein wenig suchen fand ich denn auch die Lösung. mdb

# mdb -kw
Loading modules: [ unix krtld genunix specfs dtrace cpu.generic ...etc...
> nfs_portmon/D
nfs_portmon:
nfs_portmon:    1
> nfs_portmon/W 0
nfs_portmon:    0x1             =       0x0
> nfs_portmon/D
nfs_portmon:
nfs_portmon:    0
> $q

Mdb ist der modulare debugger von Sun. Man startet ihn mit den Parametern -kw, welche auf die Objektdatei /dev/ksyms und das Core File /dev/kmem schreibend zugreifen.

Nun kann man im Debugger einfach den Parameter (ohne Angabe des Modules, da dies automatisch aufgeschlüsselt wird) gefolgt von einem /D für dump oder einem /W <wert> für write angegeben werden.

Um den Debugger zu beenden, gibt man $q ein.

So einfach geht das 🙂 (und erst noch ohne rebooot!).