Solaris 10 Inactive Boot Environment PCA patchelés Zónákkal

Sajnos a Solaris 10 patchelése elég nehézkesnek mondható. Főleg, ha egy Linuxal akarjuk összehasonlítani. Ez persze a Solaris 10 repository alapú csomag és patchkezeléséhez vezethető vissza. Ezt pedig szinte teljesen tökéletesen megoldottak a Solaris 11-ben. Az Oracle (és régebben a SUN is) belátta, hogy ez ellen tenni kell valamit, és olyan fajta egyszerűen kezelhető, automatikus funkciókat kell kínálni a Solaris 10 adminisztrátoroknak, amivel nem lesz horror a patchelés. Ez pedig már régóta elérhető a Live Upgrade formájában. Nekem viszont úgy tűnik, hogy nem merjük arra használni a Live Upgrade-t, amire való. Talán azért mert félünk tőle, talán azért, mert nem is értjük mikre lehet jó. Én ebben a cikkben azt kívánom bemutatni, hogy szerintem mi az ideális Solaris 10 patchelési módszer.

A Tradicionális módszer

Természetesen a Tradicionális és az én általam bemutatott verziók között lehet megannyi köztes forma is. Ahhoz, hogy ki tudjam hangsúlyozni az előnyöket, és hátrányokat, ahhoz ezt az alap koncepciót fogom alapul venni. Természetesen mindenki levonhatja belőle a tanulságot, és alkalmazhatja azt a saját rendszereire.

    – SVM tükör Global Zone root filesystem alatt
    – Adhoc vagy legutoljára kiadott Recommended Patchset alkalmazása
    – Zónák paralell patchelése (hivatalos ajánlás) vagy játék a Zónák update on patchingjével
    – Nincs failback plan hiba esetén, jobb esetben a tükrök szétválasztása

Inative Boot Environment with PCA script

Az egyetlen igazán rendszerszintű elvárás ehhez a folyamathoz az az, hogy a rendszer legyen legalább Solaris 10 update 8 (10/09) és ZFS alapú filesystem-en fusson az OS. Ez szükséges ahhoz, hogy a Live Upgrade elérhető legyen, és az általam bemutatott módon tudjon működni. Külön nem kívánok a Live Upgrade előnyébe és működésébe belemenni mélyebben. Akit mégis érdekelne, annak ajánlom a Live Upgrade írást. Az ötlet a következő:

1, Készítsünk egy új Boot Environment-et.
2, Mountoljuk fel az új Boot Environment adatait.
3, Patcheljük meg az inaktív, de felmountolt-t rendszert a PCA script által felkínált patchekkel.
4, Mountoljuk le megpatchelt, inaktív Boot Environment-et.
5, Aktiváljuk az új Boot Environmentet.
6, Indítsuk újra a rendszert.

Failback Method – Visszaállási metódus

1, Aktiváljuk a régi Boot Environment-et.
2, Indítsuk újra a gépet.

Egyszerűnek tűnik? Mert az is!

Összehasonlítás

A tradicionális esetben, főleg Live Upgrade használata nélkül iszonyat mennyiségű parancsot kell kiadnunk, és sok esetben konfigurációs állományokat is kell szerkeszteni. A tradicionális esetben már az előkészítés alatt illő lekapcsolni minden futó szolgáltatást. Így az egész folyamat leállással jár. Míg az én módszeremmel csupán egy újraindulásnyi idő a leállás és szinte minden patchelési lépés elvégezhető a rendszer produktív működése mellett. A PCA script minden számunkra fontos patch-et fel fog installálni, így visszamenőleg nem kell izgulnunk, hogy valami kimaradt. Illetve fontos megemlíteni, hogy míg a Tradicionális esetben a Zónák csak plusz időt és nyűgöt jelentenek (főleg cluster-ben). Az új fajta módszer segítségével gyorsabban, és minden féle újraindítás, vagy alkalmazáskiesés mellett patchelhetjük meg a Global Zone-t, és az összes rajta futó local zone-t is.

patch1

A ronda csíkok a saját teszt rendszeremen bemutatott méréseken alapszik. Szerintem elég meggyőzők az ábrák, de nézzük magát a folyamatot.

Patch Check Advanced (PCA)

Mielőtt az egész folyamatot ismertetném, először ismerkedjünk meg a PCA-val, ami egy fontos komponense lesz az egész folyamatnak. A Patch Check Advanced (PCA) egy nyílt forráskódú, egyszerű script, amit Martin Paul tart karban. A script maga egy patchdiag.xref referencia file alapján dolgozik, amit a közösség az Oracle információi alapján ad ki rendszeresen. Ez a file tartalmazza az összes elérhető patchet, azok architektúra és azon információt, hogy melyik patch teszi melyik patch-et elavulttá. Tehát a script nem csinál mást, mint összehasonlítja a patchdiag.xref és a gépünkön elérhető patcheket, és ezáltal létre tud hozni egy konkrét listát, milyen patchek hiányoznak a rendszerünkről. Természetesen képes listázni, letölteni a patcheket és installálni is azokat.

Először is töltsük le a scriptet a hivatalos oldalról, http://www.par.univie.ac.at/solaris/pca/

A script egy normál Shell script, ami némi perl elemet is tartalmaz. Ennek ellenére, csak olyan dologokat használ a script, ami egy alap Solaris telepítés során alapból elérhető a rendszeren. Tehát amint létrehoztuk a scriptet a rendszerünkön, máris használhatjuk.

root@testsystem # ./pca -l missing

patch2

A -l kapcsolót használhatjuk a listázásra. Majd utána egy kulcsszót megadva, hogy miket is listázzon. missing, installed, all, total, unbundled, bad. Értelemszerűen én a hiányzó (missing) patcheket fogom listázni.

A -d kapcsolóval tölthetjük le a patcheket, a -i pedig letölti és installálja is a rendszerre. Természetesen a script ennél sokkal többet is tud. A teljes helpje elérhető a -h kapcsolóval.

patch3

Usage: /usr/sbin/pca [OPTION] .. [OPERAND] ..

Operands:
  patch group:    missing, installed, all, total, unbundled, bad
                  Add r, s or rs at the end to list Recommended,
                  Security or Recommended/Security patches only.
  patch ID:       123456, 123456-78
  patch file:     123456-78.zip, 123456-78.jar, 123456-78.tar.Z
  file name:      patchlist.txt

Options:

  -l, --list           List patches
  -L, --listhtml       List patches, produce HTML output
  -d, --download       Download patches
  -i, --install        Install patches
  -I, --pretend        Pretend to install patches
  -r, --readme         Display patch READMEs
  -u, --unzip          Unzip patches
  -x, --getxref        Download patch xref file
  -X, --xrefdir=DIR    Location of patch xref file
  -y, --nocheckxref    Do not check for updated patch xref file
      --xrefown        Give write permissions on xref file to user only
      --nocache        Tell proxy to not cache xref file
  -P, --patchdir=DIR   Patch download directory
      --user=USER      My Oracle Support (MOS) user name
      --passwd=PASS    My Oracle Support (MOS) password
      --patchurl=URL   Source for patches and READMEs (URLs or "oracle")
      --xrefurl=URL    Source for patchdiag.xref (URLs or "oracle")
      --stop=ID        Stop after patch ID
      --ignore=WHAT    Ignore patches whose ID or synopsis match WHAT
      --rec=ID         Set Recommended flag on patch ID
      --sec=ID         Set Security flag on patch ID
  -p, --pattern=REGEX  List only patches whose synopsis matches REGEX
  -n, --noreboot       Install only patches which do not require a reboot
      --minage=DAYS    List only patches which are at least DAYS old
      --maxage=DAYS    List only patches which are at most DAYS old
      --nodep          Do not resolve patch dependencies
      --minimal        Use minimal revision for recommended patches
      --syslog=TYPE    Log patch installs to syslog priority TYPE
  -k, --nobackup=ID    Do not back up files to be patched for patch ID
  -B, --backdir=DIR    Saves patch backout data to DIR
  -s, --safe           Check locally modified files for safe patch installation
  -G, --currentzone    Make patchadd install patches in the current zone only
      --patchadd=FILE  Path to patchadd command
  -H, --noheader       Don't display descriptive headers
      --format=FORMAT  Set output format to FORMAT
  -f, --fromfiles=DIR  Read uname/showrev/pkginfo output from files in DIR
      --dltries=NUM    Try downloads from Oracle download server NUM times
  -F, --force          Force local caching proxy to download from Oracle server
  -R, --root=DIR       Alternative root directory
      --wget=FILE      Path to wget command
      --wgetproxy=URL  Default proxy for wget
      --wgetopt=OPT    Feed option OPT directly to wget
      --logger=FILE    Path to logger command
  -t, --threads=NUM    Use NUM download threads (DISABLED, Perl lacks ithreads)
      --update=TYPE    Update pca (TYPE is never, check, now or auto)
      --pcaurl=URL     URL for pca update
      --ohost=HOST     HOST name or IP address for Oracle patch server
      --norootchk      Skip check for root user with safe/install options
      --cffile=FILE    Read FILE as additional configuration file
  -V, --debug          Print debug information
  -h, --help           Display this help
  -m, --man            Display manual page
  -v, --version        Display version information

PCA proxy

A PCA script alap esetben képes használni az Oracle felhasználó nevünket és annak jelszavát (–user and –passwd), hogy a szükséges patch-eket direktbe az Oracle oldaláról letöltse. Amennyiben viszont nem néhány gépet használunk, úgy érdemes lehet helyi hálózatban egy Patch Server-t beállítanunk, ami letölti a patch-eket és azt már csak helyi hálózaton belül szolgálja ki a többi kliensnek.

Ilyen PCA proxy server-t egyszerűen összeüthetünk, ugyanis a PCA bináris tartalmazza alapból a proxy funkciót. Nincs más dolgunk, mint egy webszerver cgi-bin könyvtárába tesszük, majd beállítjuk a proxy konfigurációs állományát.

Én egy Solaris 10 rendszert fogok használni a Patch Server elkészítéséhez. Először is készítsük el azt a könyvtárat, ahol a patch-eket tárolni fogjuk.

root@patchserver # mkdir /patch
root@patchserver # chown webservd:webservd /patch

Másoljuk a PCA scriptet pca-proxy.cgi néven a megfelelő helyre. Majd hozzuk létre a konfigurációs állományt az /etc alá. Ebben meg kell adnunk a patch-ek helyét, a patchdiag.xref helyét, plusz hogy a proxy milyen ORACLE felhasználóval próbálja meg letölteni a patch-eket.

root@patchserver # cd /var/apache2/cgi-bin
root@patchserver # cp /usr/sbin/pca pca-proxy.cgi
root@patchserver # chmod 555 pca-proxy.cgi
root@patchserver # vi /etc/pca-proxy.conf
     xrefdir=/patch
     patchdir=/patch
     user=oracle_user@akarmi.hu
     passwd=nagyontitkosjelszo

root@patchserver  # chown webservd:webservd /etc/pca-proxy.conf
root@patchserver  # chmod 600 /etc/pca-proxy.conf

Ezek után bizonyosodjunk meg, hogy az apache-hoz megfelelően be van állítva a cgi-bin és kapcsoljuk be a webservice-t.

root@patchserver # vi /etc/apache2/httpd.conf
root@patchserver # svcadm enable svc:/network/http:apache2

Amennyiben a gépünk direktbe nem lát ki az internetre, abban az esetben a rendszerünkön konfigurálni kell a WEB PROXY szervert is. A PCA-PROXY a wget-et használja a csomagok letöltéséhez. Tehát az /etc/wgetrc file-t érdemes a következő módon beállítani.

root@patchserver # vi /etc/wgetrc
https_proxy = http://proxy.host.name:8080/
http_proxy = http://proxy.host.name:8080/
ftp_proxy = http://proxy.host.name:8080/

proxy_user=proxyuser
proxy_password=proxypassword

use_proxy = on

Amennyiben a /etc/pca-proxy.conf file-ba beletesszük a következő bejegyzést is:

debug=1

Akkor automatikusan létrehozza a /var/tmp/pca-proxy-debug.txt file-t, és minden részletes információt bele fog vezetni ebbe a log file-ba.

root@patchserver # less /var/tmp/pca-proxy-debug.txt 

patch4

A PCA klienseken érdemes létrehozni egy konfigurációs állományt, amiben eltároljuk a patch szerverünk elérhetőségét. Így azt nem kell mindig paraméterként beírnunk.

root@testsystem # vi /etc/pca.conf
          xrefurl=http://patchserver.hostname.hu:8080/cgi-bin/pca-proxy.cgi
          patchurl=http://patchserver.hostname.hu:8080/cgi-bin/pca-proxy.cgi

Ezek után a patchelendő szervereken ha a PCA-t használjuk, akkor automatikusan, a /etc/pca.conf-ból vett információk alapján a saját patch szerverünkhöz fog fordulni a gép. Ha a Patch Server saját /patch könyvtárában megtalálható a patch, akkor onnan fogja kiszolgálni a kéréseket. Ha nem található a kért patch, akkor a beállított WEB PROXY-n keresztül a patch server letölti az Oracle-től, eltárolja lokálisan majd kiszolgálja a kérést. Ezek után már az eltárolt file-t, lokálisan fogja mindig kiszolgálni, és természetesen ebből a kliensek semmit nem vesznek észre.

Most már megvan az infrastruktúra is a patcheléshez, nézzük akkor a folyamatot.

Inactive Boot Environment patch with Zones by PCA script

Egy Solaris 10-es rendszeren fogom bemutatni a folyamatot, amin három zóna is fut.

patch5

Lefuttattam a Global Zone-n és a local zone-kon is a PCA scriptet, és ugyan azok a patchek hiányoztak értelemszerűen mindenhonnan.

patch6

Készítsünk egy új Boot Environment-et a futó rendszerről. Az én esetemben patch-nek fogják hívni az új Boot Environmentet, de bármit megadhatunk.

root@testsystem # lucreate -n patch

patch7

Nézzük meg, mi is jött ezáltal létre:

root@testsystem #  lustatus
root@testsystem #  zfs list
root@testsystem #  lumount

patch8

Ahogy a fenti képen is látszik, egy új Boot Environment jött létre, de továbbra is az eredeti, még továbbra is produktívan működő az aktuális. Most csatoljuk fel az inaktív Boot Environment-et.

root@testsystem # lumount patch

patch9

Ahogy látszik az inaktív Boot Environment adatai, zónákkal együtt elérhetőek lettek egy alternatív mountpoint-on. Most hívjuk meg a PCA scriptet, de adjuk meg, hogy ne az aktív rendszert, hanem ezt az alternatív, felmountolt Boot Environmentet patchelje meg.

root@testsystem # pca -i -R /.alt.patch

patch10

Ahogy látszik a patchelés szépen egyesével fog haladni. Pirossal jeleztem, hogy az aktuális patch installálása mikor ért véget. Zöldel, hogy az a patch mennyi ideig tartott, és kékkel, hogy az egész patchelés odáig meddig tartott. Természetesen mivel az inaktív Boot Environmentet patcheljük, ezért a rendszerünk továbbra is működik, és nincs semmilyen szolgáltatás kiesésünk. A művelet befejeztével le kell csatolnunk a felmountolt Boot Environmentet.

root@testsystem # luumount patch

patch11

Majd aktiváljuk az új Boot Environmentet. Ezzel csak annyit teszünk, hogy újraindítást követően ez az új Boot Environment fog elindulni és nem az amiben most vagyunk.

root@testsystem #  luactivate patch

patch12

A végén pedig indítsuk újra a rendszert. Ekkor lesz az első igazi szolgáltatás kiesésünk, ez viszont csupán a normál újraindulásig fog fennállni.

Ellenőrzés Patch után

Miután a rendszerünk újra elindult, természetesen illő ellenőrizni, hogy mit is kaptunk vissza.

root@testsystem # lustatus
root@testsystem # lumount

patch13

Ahogy látszik a fenti képen, most már a patch nevű Boot Environment az aktív. A zónák újra futnak:

patch14

Végül nézzük a PCA script segítségével a hiányzó patcheket.

root@testsystem # pca -l missing
root@testsystem # zlogin test1 pca -l missing
root@testsystem # zlogin test2 pca -l missing
root@testsystem # zlogin test3 pca -l missing

patch15

Ahogy látszik, az új Boot Environmentből nem hiányzik egyetlen patch sem. Tehát egyetlen újraindulásnyi szolgáltatás kieséssel megpatcheltük a Global Zone-t és a három Local Zone-t az adott rendszeren.

Failback – visszaállás

Minden adminisztrátor rémálma, de sajnos előfordulhat, ha egy patchelés után mégis vissza kell állni az eredeti állapotra. A fenti folyamat esetében ez pofon egyszerű. Elengedő ugyanis aktiválni az erdeti Boot Environment-et, és újraindítani a gépet.

root@testsystem #  luactivate 10u11_X86

patch16

root@testsystem # init 6

patch17

Ezt követően megint az eredeti állapotot fogjuk látni:

root@testsystem # lustatus
root@testsystem # lumoun

patch18

Természetesen a hiányzó patchek itt nem lesznek telepítve.

root@testsystem # pca -l missing

patch19

Összegzés

Az új módszer hihetetlen egyszerűen kezelhető. Szimpla parancsokkal kell operálni, a többit pedig a Solaris automatizációjára kell bízni. A PCA script által hihetetlen rugalmasságot érhetünk el. Illetve az Inaktív Boot Environment patchelésével teljesen minimalizálhatjuk a kiesésünket. Sajnos meg kell említenem az árny oldalát is a folyamatnak. A Boot Environmentek elkészülése (vagy törlése) sokszor hibára fut. Ekkor természetesen nem történik szolgáltatás kiesés, csupán megakadunk a patcheléssel. Egyik tipikus probléma, hogy INSTALLED állapotú zónák vannak az /etc/zone/index file-ban, amit a Live Upgrade megrpbálni elindítani. Ezért illő a folyamat előtt kitakarítani az /etc/zone/index file-t. Minden zóna, amit nem akarunk futtatni az legyen lecsatolva, és configured állapotban. Erre írtam egy rövid scriptet.

root@testsystem # awk -F: '$0~/installed/ {print $1" "$3}' < /etc/zones/index | grep -v global | while read zone path; do if [ ! -d "${path}/root/etc" ]; then perl -i -pe "s|$zone:installed|$zone:configured|g" /etc/zones/index; fi; done

Sajnos ezen túl is sok hibába futok bele, ennek ellenére továbbra is ezt a folyamatot tartom a leginkább hatásosabbnak Solaris 10 rendszerek patchelésére.

Solaris 10 Inactive Boot Environment PCA patchelés Zónákkal” bejegyzéshez 2 hozzászólás

  1. Király cikk Misi és abban is egyetértek, hogy így kellene működnie a patchelesnek alapból.

  2. Tiszteltem,
    Koszonom a dicseretet. A jo hir, hogy Solaris 11-ben ez mar teljesen alapertelmezett. A boot environmentek keszitese egybeforrt a csomagkezelovel es a patchmanagementel.

    A legjobb az lenne ha egyik naprol a masikra hirtelen minden Solaris 11 lenne, de sajnos ettol messze vagyunk :)

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük