SMF : Service Management Facility

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Les SMF sont listés par catégories :

  • application
  • device
  • legacy
  • milestone
  • network
  • platform
  • site
  • system

Exemple :

svc:/system/filesystem/root:default
  • Le prefix svc indique que c'est un service géré par SMF
  • La catégorie du service est "system"
  • Le service lui même est un filesystem
  • L'instance du service est la racine du file system
  • Le mot "default" identifie le premier, dans ce cas seulement, c'est une instance du service

Un autre exemple :

lrc:/etc/rc3_d/S90samba
  • Le nom "lrc" indique que le service en cours n'est pas géré par SMF
  • Le pathname "/etc/rc3_d" se réfère au dossier "/etc/rc3.d" ou le script est utilisé pour etre géré
  • Le nom du script est S90samba

Pour lister les noms et les états des services :

Command svcs
$ svcs
STATE          STIME    FMRI
legacy_run     Feb_10   lrc:/etc/rc2_d/S10lu
legacy_run     Feb_10   lrc:/etc/rc2_d/S20sysetup
legacy_run     Feb_10   lrc:/etc/rc2_d/S90wbem
legacy_run     Feb_10   lrc:/etc/rc2_d/S99dtlogin
legacy_run     Feb_10   lrc:/etc/rc3_d/S81volmgt
(output removed)
online         Feb_10   svc:/system/system-log:default
online         Feb_10   svc:/system/fmd:default
online         Feb_10   svc:/system/console-login:default
online         Feb_10   svc:/network/smtp:sendmail
online         Feb_10   svc:/milestone/multi-user:default
online         Feb_10   svc:/milestone/multi-user-server:default
online         Feb_10   svc:/system/zones:default
offline        Feb_10   svc:/application/print/ipp-listener:default
offline        Feb_10   svc:/application/print/rfc1179:default
maintenance   10:24:15 svc:/network/rpc/spray:default

Voici la liste des différents états possibles :

Etat Description
online The service instance is enabled and has successfully started.
offline The service instance is enabled, but the service is not yet running or available to run.
disabled The service instance is not enabled and is not running.
legacy_run The legacy service is not managed by SMF, but the service can be observed. This state is only used by legacy services.
uninitialized This state is the initial state for all services before their configuration has been read.
maintenance The service instance has encountered an error that must be resolved by the administrator.
degraded The service instance is enabled, but is running at a limited capacity.

2 Gestion des Runlevels et Milstones

Voici les différents types de service :

  • single-user
  • multi-user
  • multi-user-server
  • network
  • name-services
  • sysconfig
  • devices


Voici la relation entre le milstone et les services :

Sun-milstone-1.gif

Voilà un exemple de relation entre les dépendances :

Sun-milstone-2.gif

Pour déterminer les milstones en cours :

Command svcs

$ svcs


Voici les états que le milestone peut prendre :

  • none
  • single-user
  • multi-user
  • multi-user-server
  • all

Pour choisir sur quel milestone vous voulez démarrez :

Command
ok> boot -m milestone=single-user

Rappel : svc.startd est un démon.

La base de donnée listant tous ces services se trouve ici :

/etc/svc/repository.db

Cette base de donnée est gérée par le service svc.configd.

Si il y a une erreur à ce niveau, votre machine ne bootera pas. Pour réparer ceci, mettez vous en mode single user et exécutez cette commande :

Command
/lib/svc/bin/restore_repository

Voici une liste des milestones et runlevels :

Run Level Milestone Description
0 System is running the PROM monitor.
s or S single-user Solaris OS single-user mode with critical file systems mounted and accessible.
1 The system is running in a single-user administrative state with access to all available file systems.
2 multi-user The system is supporting multiuser operations. Multiple users can access the system. All system daemons are running except for the Network File System (NFS) server and some other network resource server related daemons.
3 multi-user-server The system is supporting multiuser operations and has NFS resource sharing and other network resource servers available.
4 This level is currently not implemented.
5 A transitional run level in which the Solaris OS is shut down and the system is powered off.
6 A transitional run level in which the Solaris OS is shut down and the system reboots to the default run level.

Pour savoir dans quel runlevel vous vous trouvez, utilisez cette commande :

Command who
who -r

Toujours au niveau des Runlevels, vous pouvez trouver dans /etc/ ou /sbin les différents runlevels :

  • rc0
  • rc1
  • rc2
  • rc3
  • rc4
  • rc5
  • rc6
  • rcS

Lorsque vous regardez dans un de ces dossiers, vous pouvez voir les processus de boot et de stop. Pour les distinguer :

  • K pour Kill
  • S pour Start

Pour connaitre le processus en cours par rapport au démon :

Command
$ ls -i S90samba
4715 samba

3 Le boot

Si vous avez tout bien suivit, vous devirez comprendre que l'ordre de boot ressemble à cela :

  • Phase de boot PROM
  • Phase de progamme de boot
  • Phase d'initialization du kernel
  • Phase d'init
  • Phase de svc.startd

Sun-initd.gif

Durant la phase de boot, le kernel lit son fichier de configuration "/etc/system", puis charge les modules. Il utilise la commande "ufsboot" pour charger les fichiers.

Ensuite il charge le démon /etc/init.

Voici ce que l'on peut trouver dans le fichier /etc/system :

  • moddir

Recherche les éventuels modules à charger

  • root device and root file system configuration

Par défaut : rootfs:ufs
Ceci est pour le Système de fichier racine. Ex :

rootdev:/sbus@1,f8000000/esp@0,800000/sd@3,0:a
  • exclude

Ne va pas charger les modules listés. Ex :

exclude: sys/shmsys
  • forceload

Oblige à charger certains modules. Ex :

forceload: drv/vx
  • set

Change les paramètres du kernel pour modifier des opérations système. Ex :

set maxusers=40

Faites une copie du fichier /etc/system avant de sauvegarder les modifications. Si le fichier est erroné, vous ne pourrez pas booter. Si vous avez un problème avec le fichier modifié, voici la solution pour réparer :

Command
$ ok boot -a
Enter filename [kernel/sparcv9/unix]: 
Enter default directory for modules [/platform...]: 
Name of system file [etc/system]: etc/system.orig - or - /dev/null
root filesystem type [ufs]: 
Enter physical name of root device [/...]: 
(further boot messages omitted)

4 Inittab

Chaque ligne de ce fichier ressemblent à ceci :

id:rstate:action:process

Voilà les champs :

Champs Descriptions
id Two character identifier for the entry
rstate Run levels to which this entry applies
action Defines how the process listed should be run
For a description of the action keywords see man inittab
process Defines the command to execute

Par défaut, voici ce que l'on trouve dans le fichier inittab :

Configuration File inittab
ap::sysinit:/sbin/autopush -f /etc/iu.ap
sp::sysinit:/sbin/soconfig -f /etc/sock2path
smf::sysinit:/lib/svc/bin/svc.startd	>/dev/msglog 2<>/dev/msglog </dev/console
p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/msglog 2<>/dev/msglog

Dans les actions possibles, nous avons :

  • sysinit

Executes the process before the init process tries to access the console (for example, the console login prompt). The init process waits for completion of the process before it continues to read the inittab file.

  • powerfail

Executes the process only if the init process receives a power fail signal.

Le démon svc.startd est le remplacant d'init. Pour voir la configuration actuelle :

Command
/var/svc/manifest

Si vous souhaitez voir les fichiers milestones pour les éditer :

single-user.xml
multi-user.xml
multi-user-server.xml
network.xml
name-services.xml
sysconfig.xml
/sbin/rc2
/lib/svc/method/fs-local

5 SVCS

Voici la commande pour monitorer les services SMF :

Command svcs
$ svcs
STATE          STIME    FMRI
legacy_run     13:45:11 lrc:/etc/rcS_d/S29wrsmcfg
legacy_run     13:45:37 lrc:/etc/rc2_d/S10lu
legacy_run     13:45:38 lrc:/etc/rc2_d/S20sysetup
legacy_run     13:45:38 lrc:/etc/rc2_d/S40llc2
legacy_run     13:45:38 lrc:/etc/rc2_d/S42ncakmod
legacy_run     13:45:39 lrc:/etc/rc2_d/S47pppd
(output omitted)
online         13:45:36 svc:/network/smtp:sendmail
online         13:45:38 svc:/network/ssh:default
online         13:45:38 svc:/system/fmd:default
online         13:45:38 svc:/application/print/server:default
online         13:45:39 svc:/application/print/rfc1179:default
online         13:45:41 svc:/application/print/ipp-listener:default
online         13:45:45 svc:/milestone/multi-user:default
online         13:45:53 svc:/milestone/multi-user-server:default
online         13:45:54 svc:/system/zones:default
online          8:46:25 svc:/system/filesystem/local:default
online          8:46:26 svc:/network/inetd:default
online          8:46:32 svc:/network/rpc/meta:tcp
online          8:46:32 svc:/system/mdmonitor:default
online          8:46:38 svc:/milestone/multi-user:default
online         13:14:35 svc:/network/telnet:default
maintenance     8:46:21 svc:/network/rpc/keyserv:default

Pour vérifier l'état d'un service :

Command svcs
$ svcs svc:/system/console-login:default

STATE          STIME    FMRI
online         14:38:27 svc:/system/console-login:default

Pour voir les dépendances d'un service :

Command svcs
svcs -d svc:/system/filesystem/local:default

STATE          STIME    FMRI
online         14:38:15 svc:/system/filesystem/minimal:default
online         14:38:26 svc:/milestone/single-user:default

Ceci montre ce dont un service à besoin (dépendances) :

Command svcs
$ svcs -d milestone/multi-user:default
STATE          STIME    FMRI
online         13:44:53 svc:/milestone/name-services:default
online         13:45:12 svc:/milestone/single-user:default
online         13:45:13 svc:/system/filesystem/local:default
online         13:45:15 svc:/network/rpc/bind:default
online         13:45:16 svc:/milestone/sysconfig:default
online         13:45:17 svc:/system/utmp:default
online         13:45:19 svc:/network/inetd:default
online         13:45:31 svc:/network/nfs/client:default
online         13:45:34 svc:/system/system-log:default
online         13:45:36 svc:/network/smtp:sendmail

On peut voir ici les autres services qui dépendent de /system/filesystem/local :

Command svcs
$ svcs -D svc:/system/filesystem/local
STATE          STIME    FMRI
disabled       14:38:00 svc:/network/inetd-upgrade:default
disabled       14:38:07 svc:/network/nfs/server:default
online         14:38:30 svc:/network/inetd:default
online         14:38:30 svc:/network/smtp:sendmail
online         14:38:30 svc:/system/cron:default
online         14:38:30 svc:/system/sac:default
online         14:38:45 svc:/system/filesystem/autofs:default
online         14:38:47 svc:/system/dumpadm:default
online         14:38:51 svc:/milestone/multi-user:default

5.1 svcadm

Cette commande sert à changer l'état d'un service :

Command ps
$ ps -ef 

Command svcs
$ svcs cron
STATE          STIME    FMRI
online         14:38:30 svc:/system/cron:default

Command svcadm
$ svcadm -v disable system/cron:default 
system/cron:default disabled.

Command svcs
svcs cron
STATE          STIME    FMRI
disabled       20:35:25 svc:/system/cron:default

Command ps
ps -ef 

Command svcadm
$ svcadm -v enable system/cron:default
system/cron:default enabled.

Command svcs
$ svcs cron
STATE          STIME    FMRI
online         20:35:59 svc:/system/cron:default

Command ps
$ ps -ef 

Pour désactiver le service cron :

Command svcadm
svcadm -v disable -t system/cron:default
svc:/system/cron:default temporarily disabled.

6 Gestion d'un service non SMF

init.d est là :

Command svcs
$ svcs 

Command ps
$ ps -ef 

Command
ls /etc/init.d/volmgt
/etc/init.d/volmgt
/etc/init.d/volmgt stop

Command
$ ps -ef 

Command
$ /etc/init.d/volmgt start
volume management starting.

Command
$ ps -ef 

Command svcs
svcs 

7 Créer un service géré par SMF

Cette procédure peut être un peu complexe pour les personnes non initiés. Voici l'ordre chronologique à suivre :

  • Determiner quels milestones et run levels ce service doit être disponible et la commande appropriée pour démarrer et arréter le service.
  • Establire chaque relations entre les dépendances, le service et les autres services.
  • Créer un script dans /lib/svc/method pour démarrer le process si nécessaire.
  • créer un fichier .xml dans le sous dossier approprié.
  • Faire une copie du "Service Repository Database".
  • Intégrer ce script dans SMF en utilisant l'utilitaire svccfg.

Créer le fichier /lib/svc/method/newservice :

Configuration File /lib/svc/method/newservice
#!/sbin/sh
#
# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# ident "@(#)newservice 1.14    04/08/30 SMI"
 
case "" in
'start')
        /usr/bin/newservice &
;;
 
'stop')
	/usr/bin/pkill -x -u 0 newservice
        ;;
*)
        echo "Usage: PAGECONTENT { start | stop }"
        ;;
esac
exit 0

Mettons les droits :

Command chmod
chmod 744 /lib/svc/method/newservice

Puis créez le fichier /var/svc/manifest/site/newservice.xml :

Configuration File /var/svc/manifest/site/newservice.xml
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<!--
        Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
        Use is subject to license terms.
 
        ident   "@(#)newservice.xml     1.2     04/09/13 SMI"
-->
 
<service_bundle type='manifest' name='OPTnew:newservice'>
 
<service
        name='site/newservice'
        type='service'
        version='1'>
 
        <single_instance/>
 
        <exec_method
                type='method'
                name='start'
                exec='/lib/svc/method/newservice start'
                timeout_seconds='30' />
 
        <exec_method
                type='method'
                name='stop'
                exec='/lib/svc/method/newservice stop'
                timeout_seconds='30' />
 
        <property_group name='startd' type='framework'>
                <propval name='duration' type='astring' value='transient' />
        </property_group>
 
        <instance name='default' enabled='true' />
 
        <stability value='Unstable' />
 
        <template>
                <common_name>
                        <loctext xml:lang='C'>
                                New service
                        </loctext>
                </common_name>
        </template>
</service>
 
</service_bundle>

Command
cd /var/svc/manifest/milestone
cp multi-user.xml /var/tmp
vi multi-user.xml

Voici un exemple du contenu :

Configuration File multi-user.xml
	<dependency
                name='fs'
                grouping='require_all'
                restart_on='none'
                type='service'>
                <service_fmri value='svc:/system/filesystem/local' />
        </dependency>
 
        <dependency
                name='newservice'
                grouping='require_all'
                restart_on='none'
                type='service'>
                <service_fmri value='svc:/site/newservice' />
        </dependency>

Le nouveau service doit être importer dans SMF :

Command svccfg
svccfg import /var/svc/manifest/site/newservice.xml

A présent, il doit être visible :

Command svcs
$ svcs newservice
STATE          STIME    FMRI
online          8:43:45 svc:/site/newservice:default

Il doit être également possible de manipuler le service en utilisant :

Command svcadm
$ svcadm -v disable site/newservice

site/newservice disabled.

Command svcs
$ svcs newservice

STATE          STIME    FMRI
disabled        9:11:38 svc:/site/newservice:default

Command svcadm
svcadm -v enable site/newservice

site/newservice enabled.

Command svcs
svcs newservice

STATE          STIME    FMRI
online          9:11:54 svc:/site/newservice:default

On peut voir que le milestone multiuser pour notre nouveau service est nécessaire pour en finir :

Command svcs
$ svcs -d milestone/multi-user:default
STATE          STIME    FMRI
disabled        8:43:16 svc:/platform/sun4u/sf880drd:default
online          8:43:16 svc:/milestone/name-services:default
online          8:43:33 svc:/system/rmtmpfiles:default
online          8:43:42 svc:/network/rpc/bind:default
online          8:43:46 svc:/milestone/single-user:default
online          8:43:46 svc:/system/utmp:default
online          8:43:47 svc:/system/system-log:default
online          8:43:47 svc:/system/system-log:default
online          8:43:49 svc:/system/filesystem/local:default
online          8:44:01 svc:/system/mdmonitor:default
online          9:11:54 svc:/site/newservice:default

8 Créer un service non géré par SMF

  • Tout d'abord, nous allons créer notre script dans l'init.d :
Command
vi /etc/init.d/filename

Voir plus haut pour le contenu, puis :

Command
chmod 744 /etc/init.d/filename
chgrp sys /etc/init.d/filename

  • Nous allons maintenant créer les bons liens (le faire pour chaque runlevels voulu) :
Command
cd /etc/init.d
ln filename /etc/rc#.d/S##filename
ln filename /etc/rc#.d/K##filename

  • Vérifions :
Command
ls -li /etc/init.d/filename
ls -li /etc/rc#.d/S##filename
ls -li /etc/rc#.d/K##filename

  • Maintenant testons :
Command
/etc/init.d/filename start

9 Définir le temps de boot des milestones

Voici un exemple :

Command svcadm
svcadm -v milestone -d multi-user-server:default

Ainsi que les options dispo :

  • all
  • none
  • svc:/milestone/single-user:default
  • svc:/milestone/multi-user:default
  • svc:/milestone/multi-user-server:default

Pensez également à faire une copie de la base de donnée des milestones :

Command
pstop svc.startd
pkill svc.configd
cp /etc/svc/repository.db /etc/svc/safe_repository.db
cp /lib/svc/seed/global.db /etc/svc/repository.db
init 0
ok boot -m verbose

10 Faq

10.1 svc.configd: smf(5) database integrity check of : /etc/svc/repository.db

Je me suis tapé un message pareil après un reboot, merci UFS. Le message en entier était :

svc.configd: smf(5) database integrity check of:
 
    /etc/svc/repository.db
 
  failed.  The database might be damaged or a media error might have
  prevented it from being verified.  Additional information useful to
  your service provider is in:
 
    /etc/svc/volatile/db_errors
 
  The system will not be able to boot until you have restored a working
  database.  svc.startd(1M) will provide a sulogin(1M) prompt for recovery
  purposes.  The command:
 
    /lib/svc/bin/restore_repository
 
  can be run to restore a backup version of your repository.  See
  http://sun.com/msg/SMF-8000-MY for more information.

Pour résoudre ce problème, il faut :

  • Rebooter en mode failsafe (grub)
  • Corriger tous les problèmes de fragmentation du filesystem (wizzard)
  • Monter en lecture et écriture dans le /a votre partition root (wizzard)
  • Chrooter la partition /a :
Command chroot
chroot /a /a/bin/bash

  • Lancer la commande /lib/svc/bin/restore_repository et lui dire de réparer le /boot :
The following backups of /etc/svc/repository.db exists, from
oldest to newest:
 
... list of backups ...
 
The backups are named based on their type and the time when they were taken.
Backups beginning with "boot" are made before the first change is made to
the repository after system boot.  Backups beginning with "manifest_import"
are made after svc:/system/manifest-import:default finishes its processing.
The time of backup is given in YYYYMMDD_HHMMSS format.
 
Please enter one of:
        1) boot, for the most recent post-boot backup
        2) manifest_import, for the most recent manifest_import backup.
        3) a specific backup repository from the above list
        4) -seed-, the initial starting repository.  (All customizations
           will be lost.)
        5) -quit-, to cancel.
 
Enter response [boot]:

Il n'y a qu'a faire entrée ici. Et valider en tapant yes :

After confirmation, the following steps will be taken:
 
svc.startd(1M) and svc.configd(1M) will be quiesced, if running.
/etc/svc/repository.db
    -- renamed --> /etc/svc/repository.db_old_YYYYMMDD_HHMMSS
/etc/svc/volatile/db_errors
    -- copied --> /etc/svc/repository.db_old_YYYYMMDD_HHMMSS_errors
repository_to_restore
    -- copied --> /etc/svc/repository.db
and the system will be rebooted with reboot(1M).
 
Proceed [yes/no]? yes

11 Ressources

Solaris Features: Service Management Facility
Using Service Management Facility (SMF)