BigAdmin System Administration Portal
Article de fond
Print-friendly VersionPrint-friendly Version

Coup de projecteur sur les fonctionnalités des zones Solaris

Amy Rich

Dernière mise à jour le 07 septembre 2004

Une nouvelle et intéressante fonctionnalité du système d'exploitation Solaris 10 (qui est d'abord apparue dans Solaris Express 6/04) est la technologie de conteneurs Solaris, un moyen de virtualiser les ressources système et d'utiliser plusieurs partitions logicielles à partir d'une même instance du SE. Les conteneurs Solaris comprennent deux composants majeurs : la technologie de partitionnement en zones Solaris et les outils de gestion des ressources. Les zones Solaris permettent à l'administrateur de créer des environnements séparés pour les applications en cours d'exécution, tandis que la structure de gestion des ressources permet l'affectation, la gestion et la comptabilisation des ressources système, telles que les processeurs et la mémoire.

Les conteneurs Solaris sont indépendants du matériel et sont disponibles sur toute machine supportant le SE Solaris 10. Les conteneurs Solaris sont en développement constant, attendez-vous donc à une plus grande flexibilité et à plus de fonctionnalités dans les futures versions du SE Solaris 10. Pour de plus amples informations, reportez-vous au Guide d'administration système : Conteneurs Solaris – Gestion des ressources et zones Solaris sur docs.sun.com et également à la section de BigAdmin sur les zones Solaris.


Introduction au logiciel de zones Solaris

La fonction zones Solaris repose sur le même concept de base que les jails de FreeBSD. Dans les jails de FreeBSD et les zones de Solaris, chaque affichage virtuel de l'environnement d'exécution est entièrement séparé et les processus d'un environnement donné ne peuvent pas envoyer de signaux à un autre environnement ou même voir ses processus. Les jails et les zones ne partagent qu'une seule instance du système d'exploitation, permettant ainsi à plusieurs environnements d'exécution de coexister sur une machine avec un seul processeur.

Il existe deux types de zones : les zones globales et non globales. Une machine avec la fonctionnalité zones Solaris activée possède une zone globale et jusqu'à 8191 zones non globales. Le nombre maximal de zones que la machine peut prendre en charge dépend des ressources matérielles disponibles sur cette machine. Chaque zone possède un identifiant (ID) assigné par le système lorsqu'il est initialisé avec la zone globale, systématiquement présentée comme zone ID 0. Seule la zone globale contient un noyau Solaris amorçable et possède les informations concernant tous les périphériques, les systèmes de fichiers et les autres zones. La zone globale est également la seule zone à partir de laquelle la configuration, l'installation et la gestion de zones non globales sont possibles.

Les zones non globales contiennent un sous-ensemble du système d'exploitation Solaris installé dans la zone globale et éventuellement d'autres packages non installés dans la zone globale. Chaque zone non globale possède sa propre base de données répertoriant les packages qui y sont installés et ne partage pas les informations relatives à ces packages avec la zone globale ou d'autres zones non globales. Les zones non globales contiennent également des informations de configuration localisées et d'autres fichiers et répertoires qui leur sont propres.


Configuration d'une zone non globale

Les zones non globales sont créées par l'administrateur de la zone globale à l'aide des commandes zonecfg et zoneadm. La commande zonecfg permet à l'administrateur de construire une spécification de configuration de zone à partir du modèle de la zone globale. Pour des informations complètes relatives aux commandes zonecfg et zoneadm, reportez-vous à leurs pages de manuels respectives sur BigAdmin. La syntaxe de la commande zonecfg est :

zonecfg -z zonename
zonecfg -z zonename subcommand
zonecfg -z zonename -f command_file
zonecfg help

Les sous-commandes de la commande zonecfg sont :

add <resource-type>
	(global scope)
add <property-name> <property-value>
	(resource scope)
cancel
commit
create [-F] [ -b | -t <template> ]
delete [-F]
end
exit [-F]
export [-f output-file]
help [commands] [syntax] [usage] [<command-name>]
info [<resource-type> [property-name=property-value]*]
remove <resource-type> { <property-name>=<property-value> }
	(global scope)
remove <property-name>=<property-value>
	(resource scope)
revert [-F]
select <resource-type> { <property-name>=<property-value> }
set <property-name>=<property-value>
verify

Pour configurer une zone de base, exécutez zonecfg en mode interactif puis exécutez les directives create et set zonepath. La directive export imprime les informations de configuration actuelles à l'écran sous une forme permettant de les enregistrer dans un fichier. Etant donné qu'à ce stade, aucune modification n'a été apportée, la directive export liste la configuration par défaut :

zonecfg -z myzone
zonecfg:myzone> create
zonecfg:myzone> export
create -b
set autoboot=false
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end

Vous pouvez maintenant modifier le modèle par défaut. Cet exemple configure la zone myzone pour qu'elle s'initialise automatiquement, lui associe l'adresse IP 192.168.1.7 et un masque réseau 255.255.255.0 (/24) avec l'interface physique hme0, monte /opt/sfw comme système de fichiers en lecture seule et copie les métadonnées d'empaquetage correspondantes dans la zone. En utilisant un montage loopback accessible en écriture, cet exemple exporte le répertoire /data de la zone globale dans la zone, sous le nom /usr/local.

zonecfg:myzone> set zonepath=/zones/myzone
zonecfg:myzone> set autoboot=true
zonecfg:myzone> add net
zonecfg:myzone:net> set address=192.168.1.7/24
zonecfg:myzone:net> set physical=hme0
zonecfg:myzone:net> end
zonecfg:myzone> add inherit-pkg-dir
zonecfg:myzone:inherit-pkg-dir> set dir=/opt/sfw
zonecfg:myzone:inherit-pkg-dir> end
zonecfg:myzone> add fs
zonecfg:myzone:fs> set dir=/usr/local
zonecfg:myzone:fs> set special=/data
zonecfg:myzone:fs> set type=lofs
zonecfg:myzone:fs> add options [nodevices]
zonecfg:myzone:fs> end
zonecfg:myzone> verify
zonecfg:myzone> export
create -b
set zonepath=/zones/myzone
set autoboot=true
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end
add inherit-pkg-dir
set dir=/opt/sfw
end
add fs
set dir=/usr/local
set special=/data
set type=lofs
add options nodevices
end
add net
set address=192.168.1.7/24
set physical=hme0
end
zonecfg:myzone> commit
zonecfg:myzone> export -f /tmp/myzone-zone.cfg
zonecfg:myzone> exit

La zone est maintenant configurée et le modèle utilisé est enregistré dans /tmp/myzone-zone.cfg. Ce fichier peut ensuite être utilisé pour configurer la même zone, ou de légères modifications peuvent y être apportées (telles que l'adresse IP), afin qu'il puisse être utilisé pour configurer une zone similaire à l'aide de la commande zonecfg -z secondzone -f /tmp/myzone-zone.cfg. Il est maintenant temps d'installer la zone avec la commande zoneadm. La syntaxe de la commande zoneadm est la suivante :

zoneadm -z zonename subcommand [options]
zoneadm [-z zonename] list [options]
zoneadm help

Et la commande zoneadm est associée aux sous-commandes suivantes :

boot
halt
help [subcommand]
install
list [-cipv]
ready
reboot
uninstall [-F]
verify

Installation et initialisation d'une zone non globale

Pour installer la zone, il suffit d'exécuter la commande suivante :

zoneadm -z myzone install
Preparing to install zone <myzone>.
Creating list of files to copy from the global zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <779> packages on the zone.
Initialized <779> packages on zone.
Successfully initialized zone <myzone>.

Initialisez maintenant la zone afin d'afficher l'environnement d'exécution de la zone et connectez-vous à la console de la zone en utilisant zlogin. Pour vous déconnecter de la console de la zone, appuyez sur la combinaison de touches ~. (tilde + point).

zoneadm -z myzone boot
zlogin -C myzone

Puisqu'il s'agit de la première initialisation de la zone après son installation, elle ne possède pas de configuration de nommage interne et vous invite à saisir les informations requises via la console. Le nom d'hôte de la zone est par défaut le nom de la zone. Le nom choisi doit se résoudre à l'une des adresses IPv4 de la zone, en fonction des services de nommage interne de la zone (DNS, LDAP, fichiers, NIS, NIS+ et autres). La zone peut utiliser des services de nommage distincts de ceux de la zone globale et même lorsque des services de nommage identiques sont configurés, ils sont exécutés de façon indépendante.

La zone utilise sysidcfg pour effectuer la configuration, les résultats affichés doivent donc ressembler à ceux rencontrés après un sys-unconfig ou au cours d'une installation initiale du système d'exploitation. La plupart des informations requises ici peuvent être préconfigurées en créant le fichier sysidcfg dans le dossier /etc de la zone, avant d'initialiser la zone pour la première fois. La zone peut également être déconfigurée avec la commande sys-unconfig. Reportez-vous aux pages de manuels sysidtool(1M) et sysidcfg(4) pour de plus amples informations.

L'état de chaque zone en cours d'exécution peut être affiché à partir de la zone globale en exécutant :

zoneadm list -v
   ID NAME             STATUS         PATH
    0 global           running        /
    2 myzone           running        /zones/myzone

Ceci permet de vérifier que la nouvelle zone est maintenant initialisée et prête à l'emploi. Si la commande zoneadm list -v est exécutée à l'intérieur de la zone non globale, elle affichera uniquement la zone non globale. La commande zonename peut être exécutée à l'intérieur d'une zone pour afficher le nom de la zone en cours d'exécution.

Une zone nouvellement initialisée est similaire à un ordinateur récemment installé. Il n'y a aucun compte utilisateur ou paramètres de configuration autre que la configuration par défaut. La première étape pour préparer la nouvelle zone à un usage de production est de créer des comptes, d'ajouter des logiciels supplémentaires et de personnaliser la configuration de la zone. L'administrateur de la zone globale peut alors se connecter en tant qu'utilisateur normal dans la zone non globale en utilisant l'indicateur -l avec la commande zlogin :

zlogin -l user zonename

La commande zlogin peut également être exécutée à partir de la zone globale en mode non interactif afin d'exécuter des commandes à l'intérieur d'une zone spécifiée. Pour exécuter un ls -al / dans myzone, depuis la zone globale et en tant qu'administrateur, effectuez la commande suivante :

zlogin myzone ls -al /
total 126
drwxr-xr-x  19 root  other  512 Mar  8 12:45 .
drwxr-xr-x  19 root  other  512 Mar  8 12:45 ..
lrwxrwxrwx   1 root  root     9 Mar  8 12:03 bin -> ./usr/bin
drwxr-xr-x   2 root  other  512 Mar  8 12:02 data
drwxr-xr-x  10 root  other 1024 Mar  8 12:45 dev
drwxr-xr-x  51 root  sys   3584 Mar  8 13:36 etc
drwxr-xr-x   2 root  sys    512 Feb 12 11:42 export
dr-xr-xr-x   1 root  root     1 Mar  8 12:45 home
drwxr-xr-x   5 root  sys    512 Mar  8 12:03 kernel
drwxr-xr-x   4 root  bin   4608 Feb 12 12:17 lib
drwxr-xr-x   2 root  sys    512 Mar  8 12:04 mnt
dr-xr-xr-x   1 root  root     1 Mar  8 12:45 net
drwxr-xr-x   5 root  sys    512 Mar  8 12:03 opt
drwxr-xr-x  43 root  sys   1536 Feb 12 11:52 platform
dr-xr-xr-x  64 root  root 30400 Mar  8 16:27 proc
drwxr-xr-x   2 root  sys   1024 Feb 12 11:48 sbin
drwxrwxrwt   4 root  sys    314 Mar  8 16:19 tmp
drwxr-xr-x  38 root  other 1024 Jul 18  2003 usr
drwxr-xr-x  33 root  sys    512 Mar  8 12:45 var

Le mode non-interactif de zlogin est particulièrement utile lors de l'exécution de scripts pour administrer des zones non globales. La commande zlogin fournit également un mode de secours (-S) pour se connecter à une zone non globale, dans le cas où une zone est endommagée et ne peut accepter de connexions.

Pour supprimer la zone myzone, fermez-la, supprimez le système de fichiers racine avec zoneadm uninstall et exécutez la commande zonecfg avec l'argument delete :

zlogin myzone shutdown -y -i0 -g0
zoneadm -z myzone uninstall -F
zonecfg -z myzone delete -F

Obtenir et configurer des informations de zones non globales depuis la zone globale
En plus de l'utilisation de zonecfg, zoneadm, zonename et zlogin, diverses commandes système standard ont été modifiées pour permettre aux informations d'une zone d'être visualisées et modifiées depuis la zone globale.

Contrôle des processus

La commande ps, dispose désormais des options de formatage, -o zone et -o zoneid, qui affichent le nom de la zone ou l'ID de zone d'un processus. On peut ensuite effectuer un grep sur le nom de la zone ou l'ID de zone afin d'obtenir uniquement une liste des processus de la ou des zones spécifiées :

/bin/ps -efo user,zone,pid,ppid,c,stime,tty,time,comm |grep myzone
  root myzone 18386     1  0 12:45:24 ?      00:00 /usr/sbin/syslogd
  root myzone 18527     1  0 12:47:04 ?      00:00 /usr/lib/ssh/sshd
  root myzone 18630 18527  0 13:38:26 ?      00:03 /usr/lib/ssh/sshd
  root myzone 18300     1  0 12:45:22 ?      00:00 init
  root myzone 18512     1  0 12:45:33 ?      00:01 /usr/sfw/sbin/snmpd
  root myzone 18399     1  0 12:45:24 ?      00:00 /usr/sbin/cron
  root myzone 18638 18634  0 13:38:31 pts/2  00:00 -sh
  root myzone 18523 18300  0 12:47:03 ?      00:00 /usr/lib/saf/sac
  root myzone 18401     1  0 12:45:25 ?      00:00 /usr/lib/autofs/automountd
daemon myzone 18324     1  0 12:45:23 ?      00:00 /usr/lib/crypto/kcfd
  root myzone 18656 18638  0 13:44:26 pts/2  00:00 tcsh
daemon myzone 18349     1  0 12:45:23 ?      00:00 /usr/sbin/rpcbind
  root myzone 18400     1  0 12:45:24 ?      00:00 /usr/sbin/nscd
  root myzone 18402     1  0 12:45:25 ?      00:00 /usr/sbin/inetd
 smmsp myzone 18435     1  0 12:45:29 ?      00:00 /usr/lib/sendmail
  root myzone 18434     1  0 12:45:29 ?      00:00 /usr/lib/sendmail
  root myzone 18442     1  0 12:45:29 ?      00:00 /usr/lib/utmpd
  root myzone 18297     1  0 12:45:09 ?      00:00 zsched
  root myzone 18618 18300  0 13:37:58 zoneconsole \
                                             00:00 /usr/lib/saf/ttymon
  root myzone 18496     1  0 12:45:31 ?      00:00 /usr/dt/bin/dtlogin
  root myzone 18526 18523  0 12:47:03 ?      00:00 /usr/lib/saf/ttymon

Un certain nombre de commandes a été amélioré pour filtrer par zones les informations qu'elles affichent ou pour inclure la zone à laquelle appartient un processus. Les commandes ipcs, pgrep, pkill, ptree et prstat incluent désormais l'indicateur -z pour spécifier une zone. En outre, prstat possède un indicateur -Z pour lister tous les processus, ainsi qu'un récapitulatif par ID de zone. Cette action permet d'identifier rapidement les zones utilisant le plus de ressources. Le programme truss a également été modifié pour être au courant des appels spécifiques de zones, mais ne fonctionne pas encore entièrement à l'intérieur des zones non globales.

Dans le SE Solaris, coreadm peut être utilisé pour définir le modèle de nom de fichier Core. Le modèle inclut désormais %z pour le nom de la zone. Par exemple, si le modèle de nom de fichier Core était positionné sur /var/core/core.%f.%p.%z dans la zone globale, le Core pour un programme nommé foo avec un PID de 123 exécuté dans la zone myzone serait : /var/core/core.foo.123.myzone. L'administrateur de zone peut également exécuter coreadm à l'intérieur d'une zone non globale pour contrôler les réglages de cette zone.

Systèmes de fichiers

Lorsqu'il est exécuté à partir de la zone globale, l'indicateur -Z de la commande df affiche les montages dans toutes les zones. Par défaut, df affiche uniquement les montages situés au sein de la zone courante.

df -Z
/                  (/dev/dsk/c0t1d0s0 ):      1881482 blocks   247016 files
/devices           (/devices          ):            0 blocks        0 files
/usr               (/dev/dsk/c0t1d0s3 ):       859490 blocks   271499 files
/proc              (proc              ):            0 blocks     1837 files
/etc/mnttab        (mnttab            ):            0 blocks        0 files
/dev/fd            (fd                ):            0 blocks        0 files
/var               (/dev/dsk/c0t1d0s4 ):      1889810 blocks   239530 files
/var/run           (swap              ):      2111168 blocks    15280 files
/tmp               (swap              ):      2111168 blocks    15280 files
/zones             (/dev/dsk/c0t1d0s5 ):     60468666 blocks  3681959 files
/zones/myzone/root/dev(/zones/myzone/dev  ): 60468666 blocks  3681959 files
/zones/myzone/root/lib(/lib               ):  1881482 blocks   247016 files
/zones/myzone/root/opt/sfw(/opt/sfw       ): 60468666 blocks  3681959 files
/zones/myzone/root/platform(/platform     ):  1881482 blocks   247016 files
/zones/myzone/root/sbin(/sbin             ):  1881482 blocks   247016 files
/zones/myzone/root/usr(/usr               ):   859490 blocks   271499 files
/zones/myzone/root/usr/local(/data        ):  1881482 blocks   247016 files
/zones/myzone/root/proc(proc              ):        0 blocks     1837 files
/zones/myzone/root/etc/mnttab(mnttab      ):        0 blocks        0 files
/zones/myzone/root/dev/fd(fd              ):        0 blocks        0 files
/zones/myzone/root/var/run(swap           ):  2111168 blocks    15280 files
/zones/myzone/root/tmp(swap               ):  2111168 blocks    15280 files

Gestion de réseaux

L'utilitaire ifconfig a été modifié afin de pouvoir également configurer et voir les interfaces en fonction de la granularité de la zone, mais les interfaces ne peuvent être montées ou démontées qu'à partir de la zone globale. Pour placer une interface IP à l'intérieur de la zone, effectuez depuis de la zone globale :

ifconfig <interface> zone {<name> | <number>}
ifconfig hme0:3 plumb 192.168.1.8 netmask 255.255.255.0 zone myzone up

Pour afficher la liste des interfaces IP limitées à la zone globale, depuis cette dernière, utilisez ifconfig -aZ. L'utilisation de ifconfig -a affiche les interfaces réseau pour toutes les zones.

ifconfig -a
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1 
         inet 192.168.1.7 netmask ff000000
lo0:1: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1
         zone myzone
         inet 127.0.0.1 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         inet 192.168.1.4 netmask ffffff00 broadcast 192.168.1.255
         ether 8:0:20:9e:b5:40
hme0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         zone myzone
         inet 192.168.1.7 netmask ffffff00 broadcast 192.168.1.255

ifconfig -aZ
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> 
         mtu 8232 index 1
         inet 192.168.1.7 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> 
         mtu 1500 index 2
         inet 192.168.1.4 netmask ffffff00 broadcast 192.168.1.255
         ether 8:0:20:9e:b5:40

Comptabilisation

Lorsque vous utilisez la comptabilisation étendue (exacct), chaque zone est configurée séparément. Les enregistrements sont écrits à la fois dans les fichiers de comptabilisation de la zone globale, ainsi que dans ceux propres à chaque zone. Les enregistrements de comptabilisation des processus et ceux des tâches possèdent maintenant un nouveau champ intitulé zonename. Ce champ identifie la zone à laquelle le processus ou la tâche appartient.


Ressources

Comments (latest comments first)

Discuss and comment on this resource in the BigAdmin Wiki

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin
  
 
BigAdmin Upgrade Hub