Upgrader Solaris
se fait
traditionnellement en
réinstallant complètement l'OS. Solaris Live
Upgrade (LU) propose une alternative puissante qui minimise les
risques, permet un retour en arrière en cas d'erreur et
réduit le temps d'interruption de service à un
unique reboot.
L'idée générale est d'utiliser un disque dur libre (ou de l'espace disque inutilisé) pour :
Par exemple, une Sun possède 2 disques : 1 sous Solaris 9 et 1 inutilisé. On peut préparer le BE cible sur le disque libre, l'upgrader en Solaris 10, l'activer et rebooter dessus. Si tout va bien, on supprime Solaris 9 ; sinon, on réactive Solaris 9 et on reboote. Cette procédure est largement documentée.
Dans mon cas, ma Sun possède 2 disques en RAID 1 (miroir) sous Solaris Volume Manager (SVM), je n'ai pas de disque supplémentaire ni d'espace libre. Sun recommande et documente d'utiliser un troisième disque (même temporairement) pour upgrader le miroir. Ca ne me convient pas. La démarche que je décris ci-après consiste à :
Il s'agit seulement d'ajouter quelques étapes à un live upgrade classique. Le seul risque supplémentaire (hormis une erreur humaine due à la complexité accrue) est qu'un disque tombe pendant que le RAID 1 est cassé. À évaluer avec l'ami Murphy. Je déconseille cette manipulation les veilles de vacances et les vendredi soirs.
LU sait
gérer SVM et ses metadevices, on n'aura à
utiliser les commandes de SVM qu'à la dernière
étape, et éventuellement en cas de
galère.
À noter
qu'à la date de cet article, LU ne sait
pas upgrader un Solaris 10 comportant des zones, même
arrêtées (voir Galères).
La config que j'ai utilisée pour cet article est mon poste de travail de tous les jours (quassia) : une Sun Blade 1500 (Ultra SPARC IIIi) sous Solaris 10 3/5 avec 2 disques IDE en RAID 1. Le RAID est géré par SVM. Je l'ai upgradée en Solaris 10 11/6.
Ma configuration inclue un clavier et un écran, mais tout aurait pu être réalisé en console sans problème.
sreboux@quassia$
uname -a
SunOS quassia 5.10 Generic_118833-36 sun4u sparc SUNW,Sun-Blade-1500
sreboux@quassia$ cat /etc/release
Solaris 10 3/05 s10_74L2a SPARC
Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 22 January 2005
sreboux@quassia$ mount
/ on /dev/md/dsk/d0
/tmp on swap
/export/home on /dev/md/dsk/d7
[...]
sreboux@quassia$ metastat -p
d7 -m d27 d17 1
d27 1 1 c0t1d0s7
d17 1 1 c0t0d0s7
d1 -m d21 d11 1
d21 1 1 c0t1d0s1
d11 1 1 c0t0d0s1
d0 -m d20 d10 1
d20 1 1 c0t1d0s0
d10 1 1 c0t0d0s0
sreboux@quassia$ metadb
flags first blk block count
a m p luo 16 8192 /dev/dsk/c0t0d0s3
a p luo 8208 8192 /dev/dsk/c0t0d0s3
a p luo 16400 8192 /dev/dsk/c0t0d0s3
a p luo 16 8192 /dev/dsk/c0t1d0s3
a p luo 8208 8192 /dev/dsk/c0t1d0s3
a p luo 16400 8192 /dev/dsk/c0t1d0s3
Les 2 disques
sont c0t0d0 et
c0t1d0. Le point de montage / correspond à d0, un miroir
constitué de 2 metadevices d10 et d20. d10 est
l'encapsulation
de c0t0d0s0, d20 est l'encapsulation de c0t1d0s0.
d1 et d7 correspondent
à swap et
/export/home : ils ne seront pas touchés. La base de
données de SVM est sur la slice 3 de chaque disque.
À noter que dans
mon cas, /usr et
/var sont dans /. Si ce n'est pas votre cas, reportez vous à
la
documentation de LU car les filesystèmes "critiques" sont /,
/usr et /var. S'ils sont sur des slices séparées,
il faut
prévoir des paramètres supplémentaires
à
ajouter aux commandes LU. À noter également qu'il
est
possible de profiter d'une opération d'upgrade pour
séparer ou fusionner des filesystèmes ; j'aurais
pu par
exemple en profiter pour "sortir" /usr et/ou /var de /.
Solaris 10 11/6 sera
installé à partir d'un DVD original, que j'ai
d'ailleur obtenu gratuitement via SunWizard.
Les paquets Solaris de LU doivent être mis à jour avant toute chose. Ils sont fournis sur le DVD de Solaris.
root@quassia# pkgrm SUNWluu
root@quassia# pkgrm SUNWlur
root@quassia# pkgadd -d /cdrom/cdrom0/s0/Solaris_10/Product SUNWlur SUNWluu
[...]
## Executing postinstall script.
==============================
IMPORTANT NOTICE
Patches Needed to Run Solaris Live Upgrade
Correct operation of Solaris Live Upgrade requires that a limited set of
patch revisions be installed for SunOS 5.10 for the sparc platform.
Before installing or running Live Upgrade, you are required to install a
limited set of patch revisions. Make sure you have the most recently
updated patch list by consulting sunsolve.sun.com. Search for the info doc
72099 on the SunSolve(tm) web site.
Live Upgrade may fail to work properly if the latest limited set
of patch revisions are not installed on this system.
==============================
[...]
Des patches peuvent être requis pour LU, j'ai du en passer quelque-uns. Je ne le décrit pas ici, à noter que ca m'a coûté un reboot supplémentaire, parce que je n'étais pas trop à jour. La note ci-dessus recommande d'aller voir sur SunSolve et de chercher la doc 72099.
Cette double opération se fait en une seule commande LU.
Au préalable j'ai arbitrairement décidé que c0t1d0s0 serait le BE cible. c0t1d0s0 est encapsulé en d20 et fait partie du miroir d0. Une fois cassé, le demi-miroir d0 ne sera plus constitué que de d10 et deviendra le BE source.
Après l'upgrade, le miroir ne pourra pas être reconstruit sous le nom de metadevice d0, j'ai choisi arbitrairement le nom d120 comme futur point de montage pour /.
root@quassia# lustatus
ERROR: No boot environments are configured on this system
ERROR: cannot determine list of all boot environment names
lustatus, qui me servira tout au long de l'article, me dit qu'aucun BE n'est encore créé.
root@quassia# lucreate \
-C /dev/dsk/c0t0d0s0 \
-n sol10116 \
-m /:/dev/md/dsk/d120:ufs,mirror \
-m /:/dev/dsk/c0t1d0s0:detach,attach,preserve
Discovering physical storage devices
Discovering logical storage devices
Cross referencing storage devices with boot environment configurations
Determining types of file systems supported
Validating file system requests
Preparing logical storage devices
Preparing physical storage devices
Configuring physical storage devices
Configuring logical storage devices
Analyzing system configuration.
No name for current boot environment.
INFORMATION: The current boot environment is not named - assigning name
Current boot environment is named .
Creating initial configuration for primary boot environment .
The device is not a root device for any boot environment.
PBE configuration successful: PBE name PBE Boot Device .
Comparing source boot environment file systems with the file
system(s) you specified for the new boot environment. Determining which
file systems should be in the new boot environment.
Updating boot environment description database on all BEs.
Searching /dev for possible boot environment filesystem devices
Updating system configuration files.
The device is not a root device for any boot environment.
Creating configuration for boot environment .
Source boot environment is .
Creating boot environment .
Creating file systems on boot environment .
Preserving file system for on .
Mounting file systems for boot environment .
Calculating required sizes of file systems for boot environment .
Populating file systems on boot environment .
Checking selection integrity.
Integrity check OK.
Preserving contents of mount point .
Copying file systems that have not been preserved.
Creating shared file system mount points.
Creating compare databases for boot environment .
Creating compare database for file system .
Updating compare databases on boot environment .
Making boot environment bootable.
Setting root slice to Solaris Volume Manager metadevice .
Population of boot environment successful.
Creation of boot environment successful.
Les BE source et cible sont créés avec lucreate et quelques paramètres :
Si j'avais séparé /usr et /var, c'est ici que j'aurai du ajouter des paramètres -m à lucreate.
C'est cette série d'options qui rend LU si puissant, et en contrepartie c'est toute la difficulté de l'outil. Prenez bien le temps de tout comprendre, adaptez à votre configuration, lisez les documents (voir Biblio) pour comprendre les nombreux exemples. Malgrè tout, si LU ne fait pas ce que vous voulez, rien n'est perdu (voir Galères).
Les nombreux messages de lucreate reprennent mes explications. On note que c0t0d0s0/d10/d0 est nommé Boot Environment d0 par LU.
root@quassia# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
d0 yes yes yes no -
sol10116 yes no no yes -
root@quassia# metastat -p
d120 -m d20 1
d20 1 1 c0t1d0s0
d7 -m d27 d17 1
d27 1 1 c0t1d0s7
d17 1 1 c0t0d0s7
d1 -m d21 d11 1
d21 1 1 c0t1d0s1
d11 1 1 c0t0d0s1
d0 -m d10 1
d10 1 1 c0t0d0s0
Pour vérifier ou on en est, lustatus indique que le BE source est d0, et que le BE cible est sol10116, ainsi que leur status.
metastat permet de confirmer que LU a bien cassé le miroir système : d0 n'est plus qu'un demi-miroir constitué du metadevice d10. LU a également créé le futur miroir d120 et lui a attaché d20. On a maintenant 2 demi-miroirs, 1 est actif (BE source) et l'autre est prêt à être upgradé. d120 n'étant pas monté, son filesystème est quiescent, ce qui est optimal pour une upgrade ou un passage de patches (autre utilisation courante de LU).
La biscotte est dans le mange-disque, le thé est dans la tasse : plug and pray !
root@quassia# luupgrade \
-u \
-n sol10116 \
-s /cdrom/cdrom0/s0
Validating the contents of the media .
The media is a standard Solaris media.
The media contains an operating system upgrade image.
The media contains version <10>.
Constructing upgrade profile to use.
Locating the operating system upgrade program.
Checking for existence of previously scheduled Live Upgrade requests.
Creating upgrade profile for BE .
Determining packages to install or upgrade for BE .
Performing the operating system upgrade of the BE .
CAUTION: Interrupting this process may leave the boot environment unstable or unbootable.
Upgrading Solaris: 2% completed
[...]
Upgrading Solaris: 100% completed
Installation of the packages from this media is complete.
Updating package information on boot environment .
Package information successfully updated on boot environment .
Adding operating system patches to the BE .
The operating system patch installation is complete.
INFORMATION: The file on boot
environment contains a log of the upgrade operation.
INFORMATION: The file on boot
environment contains a log of cleanup operations required.
INFORMATION: Review the files listed above. Remember that all of the
files
are located on boot environment . Before you activate boot
environment , determine if any additional system maintenance is
required or if additional media of the software distribution must be
installed.
The Solaris upgrade of the boot environment is complete.
Et voila ! L'upgrade s'est bien déroulée pendant que je continuais tranquillement à travailler sur ma Blade.
J'ai utilisé la commande luupgrade, avec quelques paramètres :
root@quassia# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
d0 yes yes yes no -
sol10116 yes no no yes -
lustatus me dit que mes 2 BE sont toujours là.
Par cette étape, on configure Solaris pour que le prochain reboot se fasse sur le BE cible. / sera monté sur d120 (c'est à dire d20, ou encore c0t1d0s0 ou encore sol10116 pour M. au fond, près du radiateur. Oui, vous, là. Votre nom je vous prie ?).
On note que /etc/vfstab est alors automatiquement mis à jour dans le BE cible. Dans le BE source, il ne change pas.
root@quassia# luactivate sol10116
******************************
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. Change the boot device back to the original boot environment by typing:
setenv boot-device /pci@1e,600000/ide@d/disk@0,0:a
3. Boot to the original boot environment by typing:
boot
******************************
Activation of boot environment successful.
C'est la dernière limite. Lisez bien les infos, notez bien les recommandations au cas ou Solaris ne boot pas, qui seront adaptées à votre configuration. Une dernière vérification avant le grand saut :
root@quassia# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
d0
yes
yes no
no -
sol10116 yes no yes no -
Cette fois sol10116 est activé. On peut encore revenir en arrière avec lucancel, mais on n'est pas des moules :
Je passe sur les messages de shutdown et reboot, je laisse mouliner le bouzin jusqu'à l'apparition du tout nouveau tout beau écran de dtlogin.
sreboux@quassia$ cat /etc/release
Solaris 10 11/06 s10s_u3wos_10 SPARC
Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 14 November 2006
On remarque que quassia tourne maintenant sous Solaris 10 11/06.
sreboux@quassia$ mount
/ on /dev/md/dsk/d120 read/write/setuid/devices/intr
sreboux@quassia$ grep d120 /etc/vfstab
/dev/md/dsk/d120 /dev/md/rdsk/d120 / ufs 1 no -
[...]
/ est bien monté sur d120, vfstab est bien à jour.
root@quassia# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
d0 yes no no yes -
sol10116 yes yes yes no -
sol10116 (qui était le BE cible) est maintenant le BE actif. d0 (qui était le BE source) est inactif, il peut être supprimé.
À ce stade, il est toujours possible de revenir en arrière : il suffit de réactiver d0 avec luactivate et de rebooter. Si vraiment on n'est pas satisfait, on supprime d120 avec metaclear et on réattache d20 à d0 avec metattach, on vire sol10116 avec ludelete et on est revenu au debut.
less /var/sadm/install_data/upgrade_log
less /var/sadm/system/data/upgrade_cleanup
less /var/adm/messages
upgrade_log donne le détail des paquets mis à jour, pour information.
upgrade_cleanup est à lire absolument car il indique quels fichiers système ont (ou non) été modifiés. Cette étape manuelle est indispensable.
messages est étrangement désordonné, en tout cas chez moi : les entrées correspondant au reboot sont au milieu du fichier ! Mais elles sont là et n'indiquent pas d'erreur majeure.
sreboux@quassia$ uname -a
SunOS quassia 5.10 Generic_118833-33 sun4u sparc SUNW,Sun-Blade-1500
Je remarque que le niveau de paches kernel a regressé : il est passé de 118833-36 à 118833-33, qui était probablement la dernière révision de SunOS disponible à la date de pressage du DVD de Solaris. En gros je suis bon pour une nouvelle série de patches, ce qui me donnera l'occasion de refaire joujou avec LU.
Je suis satisfait de mon upgrade, je reconstruits le miroir système.
root@quassia# ludelete d0
Determining the devices to be marked free.
Updating boot environment configuration database.
Updating boot environment description database on all BEs.
Updating all boot environment configuration databases.
Boot environment deleted.
root@quassia# lustatus
Boot Environment Is Active Active Can Copy
Name Complete Now On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
sol10116 yes yes yes no -
ludelete supprime le BE obsolète, ca n'était peut être pas utile. sol10116 reste visible, on ne peut pas supprimer le BE courant. Il servira de BE source pour une prochaine utilisation de LU, ce qui sera par exemple l'occasion de renommer le miroir en d0.
root@quassia# metaclear d0
root@quassia# metattach d120 d10/p>
metaclear et metattach reconstruisent le miroir en attachant d10 à d120. Les données sont copiées de c0t1d0s0 vers c0t0d0s0, ce que confirment l'activité des disques avec iostat.
root@quassia# vi /etc/lvm/md.tab
root@quassia$ metastat -p
d7 -m d27 d17 1
d27 1 1 c0t1d0s7
d17 1 1 c0t0d0s7
d120 -m d20 d10 1
d20 1 1 c0t1d0s0
d10 1 1 c0t0d0s0
d1 -m d21 d11 1
d21 1 1 c0t1d0s1
d11 1 1 c0t0d0s1
C'est une bonne pratique de tenir à jour /etc/lvm/md.tab, qui ne contient ni plus ni moins qu'une sortie de metastat -p. Ce fichier peut servir pour reconstruire totalement et rapidement une configuration de SVM.
Quelques contre-temps et blagues de LU m'ont permis de valider mes connaissances en SVM et de tester les multiples possibilités de reprise sur erreur de l'outil :
Quelques saines lectures m'ont permises d'élaborer cet article :