Système d'initialisation Gentoo Linux 1.0

Contenu:

1.Introduction

Gentoo Linux utilise un système d'initialisation qui est largement controlé par les dépendances entre services (par exemple: un démon "x" ne peut etre lancé que si un autre est lancé). Il doit etre facile a maintenir, et cependant assez puissant et fléxible pour tout type d'installation. Ce document doit plutot etre considéré comme une introduction au fonctionnement interne, plutot qu'un rapide guide de démarrage et d'utilisation du système d'initialisation de la Gentoo. Pour les plus curieux concernant ce fonctionnement... lisez les sources ;-)

2.Niveau d'exécutions

Contrairement aux autres systèmes de démarrage, les niveaux d'exécutions Gentoo n'ont pas de noms fixes ou de numéros. Mais des noms personnalisés/personnalisables copiés sur les niveaux d'exécution standards sont préférés et utilisés.

Note: Par défaut, il y a 3 niveaux d'exécutions, nommés:"boot", "default" et "nonetwork".

Le niveau d'exécution "boot" devrait etre utilisé pour des configurations standards du système. Ce niveau d'exécution est le premier niveau d'exécution qui est exécuté. Ensuite, le niveau d'exécution "default"(niveau d'exécution par défaut) est exécuté. Finalement, "nonetwork" est exécuté.

Les scripts(liens symboliques sur les véritables scripts) formant ces niveaux d'exécution se trouvent dans /etc/runlevels. Chaque runlevel possède un répertoire dans /etc/runlevels à son nom. On peut trouver dans ce répertoire des liens symboliques vers les services qui doivent etre démarré dans ce niveau.

Note: Une façon commune d'ajouter ou de retirer un service d'un runlevel est expliqué dans la section "About rc-update".

Comme il a été énoncé précédemment, l'utilisateur peut changer le nom du runlvel comme bon lui semble, en sachant que la règle est la suivante: l'entrée dans /etc/inittab doit correspondre au nouveau nom du runlevel.

Important: Une exception a cette règle doit néanmoins etre remarquée, qui est le "boot" runlevel.

Mise en Garde : Ne changez pas le nom du "boot" runlevel, sinon votre système pourrait devenir inopérationnel !

Le script nommé /sbin/rc fait tout le travail, et peut etre appelé pour changer de runlevel a la volée.

Niveau d'exécution virtuel 

Du au fait que les runlevels ne sont pas fixés sur ceux d'init, il peut y en avoir plus que le nombre que init supporte. Ceci permet a l'utilisateur du système de créé des profiles ou des runlevels virtuels qui lui conviennent.

Par exemple, un utilisateur d'un portable peut avoir deux runlevels par défaut, appelé "online" et "offline". Ceci permettrait d'avoir un runlevel actif lorsque la carte PCMCIA NIC est braché et un autre runlevel inactif quand elle ne l'est pas. Les scripts PCMCIA peuvent ensuite etre configurés pour appeler "/sbin/rc online" ou "/sbin/rc offline" lorsque le PCMCIA est actif ou non, et donc appeler le service correspondant avec le bon argument.

Les niveaux d'exécutions et XFree86 

Dans la manière de faire de Gentoo, il n'y a pas de niveaux d'exécutions dédié à X, mais plutot un script de démarrage. Il est appelé "xdm" et peut etre ajouté aux autres runlevels si l'utilisateur le souhaite.

Note: Il devrait etre dans le runlevel principal, si l'utilisateur le souhaite.

Mise en Garde : Ajouter le script de démarrage au runlevel de démarrage peut engendré des effets de bord.

Par défaut, si vous exécutez xdm, gdm or kdm avant que vos terminaux(gettys) soient démarrés, X sera démarré sur la prochaine console libre. Sur les machines assez lentes ce n'est pas un problème si le service du gestionnaire de fenetres est démarré avant la fin du runlevel d'init. Les terminaux seront démarrés avant X et donc il se retrouvera sur la console 7 comme il devrait. Cependant sur les machines plus rapides ce n'est pas le cas. X est démarré le plus souvent sur la console numéro 2 en lieu et place de l'habituel terminal. Lorsque le terminal démarre ensuite, il prend le controle du clavier, et le gestionnaire de fenetre perd donc le support du clavier.

Ce problème est résolu en utilisant le script de démarrage DM sur l'un des niveaux d'exécution supplémentaires d'init, nommé 'a'. Le niveau 'a' n'est pas un réel niveau d'exécution, notre script "xdm" ne fait simplement qu'appelé "telinit a". Ce qui ordonnance tous les services dans le niveau d'exécution 'a' pour lancer ensuite le niveau d'exécution courant, ainsi ensuite les terminaux sont démarrés.

Note: Plus d'informations au sujet du niveau d'exécution 'a' peuvent etre acquises en lisant la page de manuel d'init.

3.Les rc-scripts

Les rc-scripts sont des scripts qui définissent les fonctions communes pour chaque service, comme les dépendances lors de lancement de démon/script. Ils se trouvent dans /etc/init.d/.

un rc-script type 

Code listing 1: rc-script layout

 #!/sbin/runscript
  
 depend() {
     need bar
 }
  
 start() {
     ebegin "Starting foo"
     /sbin/foo
     eend $? "Failed to start foo"
 }
  
 stop() {
     ebegin "Stopping foo"
     kill $(cat /var/run/foo.pid)
     eend $? "Failed to stop foo"
 }
 

Note: L'interpréteur est: "/sbin/runscript".

Note: La fonction "depend" est optionnelle.

Note: Tous rc-scripts possèdent au moins une fonction "start".

Contrèle du démarrage 

L'ordre général de démarrage des scripts est réalisé dans l'ordre alphabétique. Ceci est du à la sortie de /bin/ls qui est générée.

La première méthode pour contourner l'ordre par défaut de démarrage est d'utiliser les dépendances. En revanche, s'il n'y a pas de relation entre les services, alors l'ordre type est utilisé.

4.Les types de dépendances

De nombreux services sont en relation ou dépendent d'autres services.

Par exemple Postfix, a besoin que le service gérant le réseau fonctionne auparavant, ainsi que le "system logger".

D'un autre coté samba nécessite lui aussi le que service réseau soit en fonctionnement. Cependant, si CUPS était utilisé pour l'impression de documents, cupsd devrait être démarré avant samba. il faut observer que cups n'est pas indispensable au démarrage de samba.

Nous avons donc deux moyens d'exprimer les relations de dépendances entre différents services. Les dépendances entre les services sont toujours valides quelque soit le niveaux d'exécution dans lequel vous vous trouvez, ou bien si un service est démarré ou arreté à la main.

La dépendance NEED 

Ceci est utilisé si un service est indispensable pour le démarrage du service courant.

Code listing 2: ajouter le "logger" et "net" comme dépendance stricte

 depend() {
     need net logger
 }
 

Note: Les services mentionnés ci-après NEED sont indispensables dans l'ordre pour le service courant afin de démarrer. Ce service ne pourra pas démarrer si l'une de ces dépendances n'est pas démarrée.

Important: Tout service dans une ligne NEED sera démarrée meme s'il NE se trouve PAS dans le niveau d'exécution ou niveau "boot".

NEED est par conséquent une dépendance "forte".

La dépendance USE 

Ce service n'est pas indispensable au démarrage du service courante, mais il devrait etre démarré avant le service courant pour une utilisation correcte du service. Mais un échec d'un service dans une ligne USE n'implique pas un échec au démarrage du service en question.

Code listing 3: ajout de portmap comme une dépendance USE à netmount

 depend() {
     use portmap
 }
 

Netmount peut par défaut gérer les points de montage NFS, mais cela dépendra du fait si oui ou non portmap est ajouté au runlevel courant ou à boot. Tout utilisateur/administrateur utilisant les points de montage NFS devrait par défaut ajouté portmap au runlevel par défaut. Ainsi netmount voit pormap comme une dépendance USE et démarre donc pormap avant.

Important: Tout service dans une ligne USE *doit* etre ajouté au runlevel courant ou boot afin d'etre considéré comme une dépendance USE valide.

USE est donc par conséquent une dépendance "faible".

Note: Si un service dans une ligne USE échoue au démarrage, le service démarrera quand meme, car les services dans la ligne USE n'est pas critique.

5.Controler l'ordre de démarrage sans dépendances

Si il n'existe pas de relation de dépendance entre deux services, mais il est nécessaire et/ou désirable de démarrer un service l'un avant l'autre, les relations AFTER et BEFORE peuvent etre utilisées.

Note: Ces deux types de relations ne sont valides que durant un changement de runlevel.

De plus, ces deux relations peuvent supporter l'étoile "*" signifiant d'inclure tous les autres services:

Code listing 4: un exemple pour le type AFTER

 depend() {
     after *
 }
 

Ce qui va invoqué local *après* tous les autres services.

l'ordre de démarrage BEFORE 

Le service courant sera démarré *avant* ceux qui sont listés sur la ligne BEFORE.

Code listing 5: foo démarrera avant bar

 depend() {
    before bar
 }
 

L'ordre de démarrage AFTER 

Le service courant démarrera *après* ceux listés sur la ligne AFTER.

Code listing 6: bar démarrera après foo

 depend() {
     after foo
 }
 

6.Services vituels

Les services sont comme beaucoup des choses dans le monde unix, ils se présentent sous diverses formes et accomodations. C'est donc à l'utilisateur/administrateur de faire le choix des quels il utilise et sous quelle forme.

Le système de journalisation des évènements système (system logger) est un exemple. Dans cette manière de garder trace des évènements système, les utilisateurs de Gentoo Linux ont le choix parmi quatre possibilités. Tous les services qui nécessitent que le journal système fonctionne avant leur démarrage ne peuvent etre de type NEED tous les quatre.Pour USE(utiliser) , ce serait trop facile. As of this writing, Gentoo Linux users have a choice of four different ones. All services that need a system logger running before startup, cannot now NEED all four of them. To USE them is also too weak.

C'est où les services virtuels et le type PROVIDE entrent en action.

Le tyze PROVIDE 

Le type PROVIDE définit un service virtuel qui pour les autres services peut etre NEED ou USE.

Code listing 7: sysklogd fournissant un logger

 depend() {
     provide logger
 }
 

Le service virtuel LOGGER 

LOGGER est un service virtuel prédéfini, qui est fournis par tous les loggers. Il peut etre utilisé indifféremment avec les types de dépendances NEED ou USE.

Le service virtuel NET 

Le service NET est un autre service virtuel , mais contraiement à LOGGER, il n'est pas explicitement un service de type PROVIDE.

Important: Pour fournir le service virtuel NET, un service doit :

  • Etre ajouté au service courant ou au runlevel de démarrage.
  • Avoir ;net." pre-pended.
  • La partie arpès "net." doit etre le nom de l'actuel interface réseau (net.eth0 ou net.ppp1 par exemple).

Pour tous les services net.*, la variable d'environnement $IFACE prendra pour valeur le nom de l'interface réseau ("eth0" pour net.eth0 par exemple).

7.Les options par défaut de la ligne de commande

Tout service peut etre appelé avec les options par défaut. Toutes celles mentionnées sont déjà définies sauf, START et STOP, que l'utilisateur devrait définir comme fonction dans son script rc.

Important: The start() function must be defined.

Note: The stop() function is less important, and can be left out.

Note: En général, l'utilisateur définira seulement start(),stop() et restart(). Le reste est interne et devrait etre laissé de coté.

Code listing 8: démmaré de service httpd

 # /etc/init.d/httpd start
 

Note: Les options de la ligne de commande peuvent etre cumulées.

Code listing 9: pause/start de net.eth0

 # /etc/init.d/net.eth0 pause start
 

L'option START/STOP 

START (démarrer) le service en incluant tous les services qui en dépendent.

STOP (arreter) le service et tous les services qui en dépendent.

L'option RESTART 

Le service doit etre démarré pour que RESTART fonctionne. Il redemarrera ce service tout comme ceux qui en dépendent.

Important: Si une fonction restart personnalisée par l'utilisateur est définie, l'utilisateur devrait utiliser "svc_start()" et "svc_stop()" pour démarrer et arreter le service.

Note: Ceci est réalisé pour gérer correctement toutes les dépendances entre les services.

L'option PAUSE 

Cela stoppera le service, mais en revanche STOP, n'arretera pas les services dépendants.

L'option ZAP 

Réinitialise le status du service à arreter.

Note: Notez qu'aucune commande dans la fonction stop() ne sont exécutées. L'utilisateur devra par conséquent réalisé lui-meme les opérations nécessaires à l'arret ou autre s'il le souhaite.

L'option INEED/NEEDSME 

INEED liste les services nécessaires à ce service.

NEEDSME liste les services qui ont besoin du service courant.

L'option IUSE/USESME 

IUSE liste les services qu'utilise ce service.

USESME liste les services qui utilisent ce service.

L'option BROKEN 

Cela liste les services manquants s'il y en a, qui sont nécessaires au bon usage du service.

8.Ajouter soi-meme une option à la ligne de commande

Il est relativement facile d'ajouter une option de ligne de commande. La fonction décrivant l'option devra etre définie dans le script-rc, et son nom devra etre ajouter à la variable d'environnement $opts, comme décrit ci-dessous.

Code listing 10: foo comme option

 opts="${opts} foo"
  
 foo() {
     ............
 }
 

9.Configuration

La configuration se fera généralement en utilisant les variables d'environment. Celles-ci, cependant, ne doivent pas etre ajouter directement dans le script-rc, mais plutot ans l'un des trois fichiers de configuration suivant:

L'un est spécifique au script-rc, et les deux autres sont des fichiers de configurations globaux:

Code listing 11: fichier de configuration pour rc-scripts

 /etc/conf.d/<name of rc-script>
 /etc/conf.d/basic
 /etc/rc.conf
 

Note: Ces trois fichiers forment le source dans cet ordre, faites donc attention dans à cet ordre et placer donc vos variables et fonction au bon endroit.

Important: Tous les services NET prennent leur informations dans /etc/conf.d/net

10.Scripts: utilitaires/système d'aide

L'utilitaire: rc-update 

rc-update est l'outil principal pour ajouter ou supprimer des services d'un runlevel. Il appelera "depscan.sh" pour mettre à jour le cache des dépendances.

Code listing 12: ajout de metalog au runlevel par défaut

 # rc-update add metalog default
 

Code listing 13: enelever metalog du runlevel par défaut

 # rc-update del metalog default
 

Note: Utiliser rc-update sans argument vous fournira de l'aide sur son utilisation.

Le script d'aide depscan.sh 

Il est utilisé pour créé un cache des dépendances, c'est d'un manière assez basique: une carte de dépendances inter-services.

Il devrait etre exécuter lorsque un nouveau script est ajouté à /etc/init.d/, mais rc-update l'appelle automatiquement, de nombreux utilisateurs ne devraient donc pas avoir besoin de l'utiliser directement.



Mis à jour 12 mai 2002
Martin Schlemmer
Auteur

Christophe Lucas
Traducteur

FRLinux
Relecteur

Résumé : Ce guide est une introduction au système d'initialisation de la distribution Gentoo 1.0, et comprends aussi quelques details concernant l'écriture de rc-scripts (script d'initialisation).

Aidez le développement de Gentoo à l'aide de votre carte de crédit !

Achetez de la RAM à l'aide de ce lien, et une partie de votre achat ira au développement de Gentoo Linux.

DDR Memory at Crucial.com

Pourquoi eux ? Parce que cvs.gentoo.org et inventor.gentoo.org utilisent de la RAM haute qualité de chez Crucial. Nous savons que la qualité est au rendez-vous car nous l'utilisons nous-même.

Copyright 2001 Gentoo Technologies, Inc. Questions, Commentaires, Corrections? Email gentoo-dev@gentoo.org.