Back to Basis: Solaris LiveUpgrade

Bonne année à tous ! Ca faisait un bail que je n’avais pas écrit sur K-Tux, mais, bonnes résolutions obligent, fini la prélasse vive le taff :)

Pour ce tip, je ne vais pas trop me fouler, et vous parler du système de Live Upgrade de Solaris, qui permet de construire plusieurs BE (boot environnement). Ca peut servir, et plutôt pas mal, surtout si vous avez une plateforme critique qui doit rester à jour tout en honorant des SLAs tenant de l’utopie.

Les prérequis sont simples : selon votre partitionnement, il vous faut de la place pour accueillir le double de vos partitions. De même, il vous faut installer une version viable et récente des packages SUNWluu, SUNWlur et SUNWlucfg, c’est mieux pour jouer avec Live Upgrade.

Exemple, pour ma part, la Solaris sur laquelle je me base a 2 disques et est partitionnée avec son / et son /var (ainsi que d’autres partitions) sur des metadevices distincts. De plus, pour la démonstration, elle porte une whole zone séparée du / et du /var du serveur principal (que j’appellerai le main) et qui a également un / et un /var distincts.

De manière plus succinte, Le serveur main slxu11 a donc / sur d0 et /var sur d5; quant à sa whole zone slxu11-z1, elle met son / sur d30 et son /var sur d35. La zone est montée sous /zones/slxu11-z1.

Et en plus technique, ça donne ça :

partition> p
	Volume:  solaris
	Current partition table (original):
	Total disk cylinders available: 64986 + 2 (reserved cylinders)

	Part      Tag    Flag     Cylinders         Size            Blocks
	  0       root    wm   11628 - 23255      100.00GB    (11628/0/0)  209722608
	  1       swap    wu       0 - 11627      100.00GB    (11628/0/0)  209722608
	  2     backup    wm       0 - 64985      558.89GB    (64986/0/0) 1172087496
	  3 unassigned    wm   23256 - 34883      100.00GB    (11628/0/0)  209722608
	  4 unassigned    wm   34884 - 40697       50.00GB    (5814/0/0)   104861304
	  5        var    wm   40698 - 46511       50.00GB    (5814/0/0)   104861304
	  6 unassigned    wm   46512 - 64955      158.62GB    (18444/0/0)  332655984
	  7 unassigned    wm   64956 - 64985      264.20MB    (30/0/0)        541080
slxu11#metastat -c
	d72              p   10GB d6
	d71              p  1.0GB d6
	d70              p  5.0GB d6
	d69              p  5.0GB d6
	d67              p  2.0GB d6
	d66              p  1.0GB d6
	d65              p  100MB d6
	d64              p  100MB d6
	d63              p  1.0GB d6
	d62              p  1.0GB d6
	d61              p  500MB d6
	d60              p  1.0GB d6
	d68              p  100GB d6
		d6           m  258GB d16
			d16      s  258GB /dev/dsk/c0t5000CCA03C4D2354d0s6
	d3               m   50GB d13
		d13          s   50GB /dev/dsk/c0t5000CCA03C4D2354d0s3
	d34              m   50GB d24
		d24          s   50GB /dev/dsk/c0t5000CCA03C4DF264d0s4
	d33              m  100GB d23
		d23          s  100GB /dev/dsk/c0t5000CCA03C4DF264d0s3
	d36              m  158GB d26
		d26          s  158GB /dev/dsk/c0t5000CCA03C4DF264d0s6
	d35              m   50GB d25
		d25          s   50GB /dev/dsk/c0t5000CCA03C4DF264d0s5
	d5               m   50GB d15
		d15          s   50GB /dev/dsk/c0t5000CCA03C4D2354d0s5
	d30              m  100GB d20
		d20          s  100GB /dev/dsk/c0t5000CCA03C4DF264d0s0
	d4               m   50GB d14
		d14          s   50GB /dev/dsk/c0t5000CCA03C4D2354d0s4
	d1               m  100GB d11
		d11          s  100GB /dev/dsk/c0t5000CCA03C4D2354d0s1
	d0               m   50GB d10
		d10          s   50GB /dev/dsk/c0t5000CCA03C4D2354d0s0
	d21              s  100GB /dev/dsk/c0t5000CCA03C4DF264d0s1
	slxu11# metastat -p
	d3 -m d13 1
	d13 1 1 /dev/dsk/c0t5000CCA03C4D2354d0s3
	d34 -m d24 1
	d24 1 1 /dev/dsk/c0t5000CCA03C4DF264d0s4
	d33 -m d23 1
	d23 1 1 /dev/dsk/c0t5000CCA03C4DF264d0s3
	d36 -m d26 1
	d26 1 1 /dev/dsk/c0t5000CCA03C4DF264d0s6
	d35 -m d25 1
	d25 1 1 /dev/dsk/c0t5000CCA03C4DF264d0s5
	d5 -m d15 1
	d15 1 1 /dev/dsk/c0t5000CCA03C4D2354d0s5
	d30 -m d20 1
	d20 1 1 /dev/dsk/c0t5000CCA03C4DF264d0s0
	d4 -m d14 1
	d14 1 1 /dev/dsk/c0t5000CCA03C4D2354d0s4
	d1 -m d11 1
	d11 1 1 /dev/dsk/c0t5000CCA03C4D2354d0s1
	d0 -m d10 1
	d10 1 1 /dev/dsk/c0t5000CCA03C4D2354d0s0
	d21 1 1 /dev/dsk/c0t5000CCA03C4DF264d0s1
	d72 -p d6 -o 246800800 -b 20971520
	d6 -m d16 1
	d16 1 1 /dev/dsk/c0t5000CCA03C4D2354d0s6
	d71 -p d6 -o 244703616 -b 2097152
	d70 -p d6 -o 234217824 -b 10485760
	d69 -p d6 -o 223732032 -b 10485760
	d67 -p d6 -o 9822464 -b 4194304
	d66 -p d6 -o 7725280 -b 2097152
	d65 -p d6 -o 7520448 -b 204800
	d64 -p d6 -o 7315616 -b 204800
	d63 -p d6 -o 5218432 -b 2097152
	d62 -p d6 -o 3121248 -b 2097152
	d61 -p d6 -o 2097216 -b 1024000
	d60 -p d6 -o 32 -b 2097152
	d68 -p d6 -o 14016800 -b 209715200

Je vous fait grâce de la conf de la zone, car vous allez vite comprendre avec le lucreate qui est à qui. La création d’un boot environnement se fait par lucreate :

slxu11#lucreate -c be_d0 -n be_d3 -l /home/ktux/lucreate_be_d3.log -m /:/dev/md/dsk/d3:ufs -m /var:/dev/md/dsk/d4:ufs -m /zones/slxu11-z1:/dev/md/dsk/d33:ufs -m /zones/slxu11-z1/root/var:/dev/md/dsk/d34:ufs

Grosso modo, je demande à créer une image be_d3 de l’environnement actuel que je nomme au passage be_d0. be_d3 utilisera d3 pour son / (on l’appelle parfois /root2) et d4 pour son /var (/var2 quoi), quant à sa zone, le / de la zone sera mis sous d33 et son /var sous d34, le tout en ufs. Si tout va bien, la sortie standard vous pissera un truc du genre :

Validating file system requests
Preparing logical storage devices
Preparing physical storage devices
Configuring physical storage devices
Configuring logical storage devices
Analyzing system configuration.
Updating boot environment description database on all BEs.
Updating system configuration files.
The device /dsk/c0t5000CCA03C4D2354d0s3> is not a root device for any boot environment; cannot get BE ID.
Creating configuration for boot environment .
Source boot environment is .
Creating file systems on boot environment .
Creating  file system for > in zone  on /md/dsk/d3>.
Creating  file system for  in zone  on /md/dsk/d4>.
Creating  file system for /slxu11-z1> in zone  on /md/dsk/d33>.
Creating  file system for /slxu11-z1/root/var> in zone  on /md/dsk/d34>.
Mounting file systems for boot environment .
Calculating required sizes of file systems for boot environment .
Populating file systems on boot environment .
Temporarily mounting zones in PBE .
Analyzing zones.
Mounting ABE .
Cloning mountpoint directories.
Generating file list.
Copying data from PBE  to ABE .
10% of filenames transferred
56% of filenames transferred Thus Jan 07 07:46:59 GMT 2013
100% of filenames transferred
Finalizing ABE.
Fixing zonepaths in ABE.
Unmounting ABE .
Fixing properties on ZFS datasets in ABE.
Reverting state of zones in PBE .
Making boot environment  bootable.
Setting root slice to Solaris Volume Manager metadevice /md/dsk/d3>.
Population of boot environment  successful.
Creation of boot environment  successful.

Pour savoir où l’on en est, rien de plus simple :

slxu11#lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
be_d0 yes yes yes no -
be_d3 yes no no yes -

Et pour savoir qui tape sur quoi, lufslist vous donnera toutes les infos utiles :

slxu11#lufslist be_d0
boot environment name: be_d0
This boot environment is currently active.
This boot environment will be active on next system boot.
Filesystem fstype device size Mounted on Mount Options
----------------------- -------- ------------ ------------------- --------------
/dev/md/dsk/d1 swap 107377975296 - -
/dev/md/dsk/d0 ufs 53688987648 / logging
/dev/md/dsk/d5 ufs 53688987648 /var logging
/dev/md/dsk/d60 ufs 1073741824 /tools/nagios -
/dev/md/dsk/d61 ufs 524288000 /tools/explorer -
/dev/md/dsk/d62 ufs 1073741824 /tools/tina -
/dev/md/dsk/d63 ufs 1073741824 /tools/admlog -
/dev/md/dsk/d64 ufs 104857600 /tools/perl -
/dev/md/dsk/d65 ufs 104857600 /tools/bkp -
/dev/md/dsk/d66 ufs 1073741824 /tools/heartbeat -
/dev/md/dsk/d67 ufs 2147483648 /export/home -
/dev/md/dsk/d30 ufs 107377975296 /zones/slxu11-z1 -
/dev/md/dsk/d69 ufs 5368709120 /tools/mysql/prod -
/dev/md/dsk/d70 ufs 5368709120 /tools/mysql/pprod -
/dev/md/dsk/d71 ufs 1073741824 /tools/stats -
/dev/md/dsk/d72 ufs 10737418240 /tools/mysql/test -

zone  within boot environment 
/dev/md/dsk/d36 ufs 170319863808 /home/produits-locaux -
/dev/md/dsk/d35 ufs 53688987648 /var -

slxu11#lufslist be_d3
boot environment name: be_d3

Filesystem fstype device size Mounted on Mount Options
----------------------- -------- ------------ ------------------- --------------
/dev/md/dsk/d1 swap 107377975296 - -
/dev/md/dsk/d3 ufs 53688987648 / logging
/dev/md/dsk/d4 ufs 53688987648 /var logging
/dev/md/dsk/d60 ufs 1073741824 /tools/nagios -
/dev/md/dsk/d61 ufs 524288000 /tools/explorer -
/dev/md/dsk/d62 ufs 1073741824 /tools/tina -
/dev/md/dsk/d63 ufs 1073741824 /tools/admlog -
/dev/md/dsk/d64 ufs 104857600 /tools/perl -
/dev/md/dsk/d65 ufs 104857600 /tools/bkp -
/dev/md/dsk/d66 ufs 1073741824 /tools/heartbeat -
/dev/md/dsk/d67 ufs 2147483648 /export/home -
/dev/md/dsk/d33 ufs 107377975296 /zones/slxu11-z1 -
/dev/md/dsk/d69 ufs 5368709120 /tools/mysql/prod -
/dev/md/dsk/d70 ufs 5368709120 /tools/mysql/pprod -
/dev/md/dsk/d71 ufs 1073741824 /tools/3IRT-RCS -
/dev/md/dsk/d72 ufs 10737418240 /tools/mysql/test -

zone  within boot environment 
/dev/md/dsk/d36 ufs 170319863808 /home/produits-locaux -
/dev/md/dsk/d34 ufs 53688987648 /var -

Il faut ensuite corriger toutes vos conf faisant référence aux partitions propres à be_d0. Pour moi, ça sera les 2 vfstab (celle du main() slxu11 et celle de la whole zone slxu11-z1) et la configuration de la whole zone slxu11-z1 (/etc/zones/slxu11-z1.xml). Pour cela, il suffit de monter be_d3 et d’y apporter, via vi par exemple, les corrections qui permettront d’être carré sur be_d3.

slxu11#lumount be_d3
/.alt.be_d3

Ainsi dans mon cas toutes les occurrences de d0, d5, d30 et d35 seront corrigées par leurs pendants propres à be_d3, en l’occurence d3, d4 et d34. Même chose pour toutes les autres partitions qui en ont besoin (d36 pour exemple, mais c’est à cause de ma conf un peu tordue).

slxu11#grep var /.alt.be_d3/etc/vfstab
/dev/md/dsk/d4 /dev/md/rdsk/d4 /var ufs 1 no logging

Une fois les modifications apportées, luumount be_d3 démontera proprement votre be_d3.

slxu11#luumount be_d3

Certes, ça a pris un peu de temps, mais votre BE est prêt. Que faire ensuite de be_d3 ? Bah, le patcher par exemple.

Pour rappel, nous sommes toujours sur be_d0. Ici, je mets à jour les outils LiveUgrade de be_d3 avec le patch que j’ai en prévision récupéré et dézippé sous /tmp :

slxu11#luupgrade -t -n be_d3 -s /tmp/ 121430-89
Validating the contents of the media />.
The media contains 2 software patches that can be added.
Mounting the BE .
Adding patches to the BE .
Validating patches...
Loading patches installed on the system...Done!
Loading patches requested to install.Done!
Checking patches that you specified for installation.Done!
Approved patches will be installed in this order:
121430-89
Preparing checklist for non-global zone check...
Checking non-global zones...
This patch passes the non-global zone check.121430-89
Summary for zones: Zone slxu11-z1
Rejected patches: None.
Patches that passed the dependency check:121430-89
Patching global zone
Adding patches...
Checking installed patches...
Executing prepatch script...
Installing patch packages...
Patch 121430-89 has been successfully installed.
See /a/var/sadm/patch/121430-89/log for details
Executing postpatch script...
Patch packages installed:
SUNWlucfg
SUNWlur
SUNWluu
Done!
Patching non-global zones...
Patching zone slxu11-z1
Adding patches...
Checking installed patches...
Executing prepatch script...
Installing patch packages...
Patch 121430-89 has been successfully installed.
See /a/var/sadm/patch/121430-89/log for details
Executing postpatch script...

Patch packages installed:
SUNWlucfg
SUNWlur
SUNWluu
Done!
Unmounting the BE .
The patch add to the BE  completed.

Une fois votre BE patché, il faut l’activer pour pouvoir basculer dessus au prochain boot :

slxu11#luactivate be_d3
A Live Upgrade Sync operation will be performed on startup of boot environment .
WARNING: The following files have changed on both the current boot
environment  zone  and the boot environment to be activated
:
/etc/shadow
INFORMATION: The files listed above are in conflict between the current
boot environment  zone  and the boot environment to be
activated . These files will not be automatically synchronized from
the current boot environment  when boot environment  is
activated.
**********************************************************************
The target boot environment has been activated. It will be used when you
reboot. NOTE: You MUST NOT USE the reboot, halt, or uadmin commands. You
MUST USE either the init or the shutdown command when you reboot. If you
do not use either init or shutdown, the system will not boot using the
target BE.
**********************************************************************
In case of a failure while booting to the target BE, the following process
needs to be followed to fallback to the currently working boot environment:
1. Enter the PROM monitor (ok prompt).
2. Boot the machine to Single User mode using a different boot device
(like the Solaris Install CD or Network). Examples:
At the PROM monitor (ok prompt):
For boot to Solaris CD: boot cdrom -s
For boot to network: boot net -s
3. Mount the Current boot environment root slice to some directory (like
/mnt). You can use the following command to mount:
mount -Fufs /dev/dsk/c0t5000CCA03C4D2354d0s0 /mnt
4. Run  utility with out any arguments from the current boot
environment root slice, as shown below:
/mnt/sbin/luactivate
5. luactivate, activates the previous working boot environment and
indicates the result.
6. Exit Single User mode and reboot the machine.
**********************************************************************
Modifying boot archive service
Activation of boot environment  successful.

La sortie est lourde d’info, ce qui vous sauvera la mise si le patch vous met l’OS en foutraque. Un lustatus vous confirmera que Solaris a bien pris acte de votre luactivate :

slxu11#lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
be_d0 yes yes no no -
be_d3 yes no yes no -

Après un init 6, on se retrouve sur le BE patché :

slxu11#lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
be_d0 yes no no yes -
be_d3 yes yes yes no -

Le patch est bien valide, et pour le main slxu11 et pour sa zone slxu11-z1 :

slxu11#showrev -p | grep 149175-04
Patch: 149175-04 Obsoletes: 125166-13, 125392-02, 139606-02, 142084-04, 143957-05, 146489-06 Requires: 119130-33 Incompatibles: Packages: SUNWqlcu, SUNWqlc

slxu11-z1#showrev -p | grep 149175-04
Patch: 149175-04 Obsoletes: 125166-13, 125392-02, 139606-02, 142084-04, 143957-05, 146489-06 Requires: 119130-33 Incompatibles: Packages: SUNWqlcu, SUNWqlc

Si vous ne levez pas de loup avec l’OS patché, il ne reste plus qu’à remettre d’équerre be_d0 comme be_d3. La manip est la même et passe par luupgrade cette fois pour be_d0. Le tout et le mieux étant ensuite de revenir en be_d0.

Et voilà, temps de down réduit, 2 environnements pour tester la validité des patches et ça fonctionne plutôt pas mal ! Que dire de plus ? Ah si ! Happy new year 2014 :)

Vus : 1484
Publié par K-Tux : 59