{"id":540,"date":"2013-07-31T09:31:27","date_gmt":"2013-07-31T07:31:27","guid":{"rendered":"http:\/\/sam-soul.fr\/Info\/?p=540"},"modified":"2013-07-31T09:31:27","modified_gmt":"2013-07-31T07:31:27","slug":"linit-de-la-red-hat","status":"publish","type":"post","link":"http:\/\/les-fougs.com\/wordpress\/2013\/07\/31\/linit-de-la-red-hat\/","title":{"rendered":"L&rsquo;init de la Red Hat."},"content":{"rendered":"<h2><a href=\"http:\/\/www.linux-france.org\/article\/sys\/init-jaco\/init-jaco-3.html\" target=\"_blank\">http:\/\/www.linux-france.org\/article\/sys\/init-jaco\/init-jaco-3.html<\/a><\/h2>\n<h2>Niveaux d&rsquo;ex\u00e9cution System V<\/h2>\n<p>\u00c0 tout moment, votre syst\u00e8me Linux se trouve \u00e0 un niveau d&rsquo;ex\u00e9cution donn\u00e9. La distribution Red Hat en d\u00e9finit 7\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<ul>\n<li><b>0<\/b> : Hors service : l&rsquo;alimentation peut alors \u00eatre coup\u00e9e dans danger<\/li>\n<li><b>1<\/b> : Mode mono-utilisateur (pour administration syst\u00e8me)<\/li>\n<li><b>2<\/b> : Mode multi-utilisateurs : fonctionnement normal sans NFS (identique au niveau 3 mais sans les fonctionnalit\u00e9s r\u00e9seau).<\/li>\n<li><b>3<\/b> : Mode multi-utilisateurs : fonctionnement normal pour syst\u00e8mes en r\u00e9seau, partageant leurs ressources avec d&rsquo;autres syst\u00e8mes.<\/li>\n<li><b>4<\/b> : Inutilis\u00e9<\/li>\n<li><b>5<\/b> : X11<\/li>\n<li><b>6<\/b> : Mise hors service et red\u00e9marrage : sert durant le red\u00e9marrage du syst\u00e8me \u00e0 partir d&rsquo;un niveau de fonctionnement (2, 3, 4, 5). Le syst\u00e8me passera ensuite au niveau 0.<\/li>\n<\/ul>\n<\/blockquote>\n<p>Comme on peut le voir, un niveau d&rsquo;ex\u00e9cution est donc un \u00e9tat d&rsquo;<code>init<\/code> et du syst\u00e8me qui d\u00e9finissent quels sont les services qui s&rsquo;ex\u00e9cutent.<\/p>\n<p>Lors de la phase de d\u00e9marrage, <code>init<\/code> doit savoir \u00e0 quel niveau placer le syst\u00e8me. Pour cela, il recherche dans le fichier <code>\/etc\/inittab<\/code> la ligne qui configure ce niveau par d\u00e9faut\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>id:3:initdefault:<\/pre>\n<\/blockquote>\n<p>signifie que le syst\u00e8me d\u00e9marrera en Mode multi-utilisateurs complet. (ce serait une <b>grosse<\/b> b\u00eatise de choisir les niveaux 0 ou 6 comme niveaux par d\u00e9faut !!!).<\/p>\n<p>Vous remarquerez que la sortie de la commande <code>ps<\/code> ci-dessus indiquait qu&rsquo;<code>init<\/code> avait d\u00e9marr\u00e9 le syst\u00e8me en niveau 3. Toutefois, cette fonctionnalit\u00e9 n&rsquo;est pas disponible par d\u00e9faut dans toutes les distributions\u00a0: la m\u00eame ligne pour une Debian aurait donn\u00e9\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND\nroot         1  0.1  0.4   740   384  ?  S    17:12   0:04 init<\/pre>\n<\/blockquote>\n<p>Mis nous verrons ci-dessous qu&rsquo;il existe une commande permettant de conna\u00eetre \u00e0 la fois le niveau d&rsquo;ex\u00e9cution courant et celui qui l&rsquo;a pr\u00e9c\u00e9d\u00e9.<\/p>\n<h2><a name=\"ss3.2\"><\/a>3.2 La commande <code>telinit<\/code><\/h2>\n<p>On peut changer de niveau d&rsquo;ex\u00e9cution gr\u00e2ce \u00e0 la commande <code>telinit<\/code> (qui n&rsquo;est qu&rsquo;un lien sur <code>init<\/code>) :<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># telinit 2<\/pre>\n<\/blockquote>\n<p>placera le syst\u00e8me en Mode multi-utilisateurs sans r\u00e9seau. Bien entendu, seul l&rsquo;administrateur syst\u00e8me (<code>root<\/code>) peut ex\u00e9cuter cette commande&#8230;<\/p>\n<p>Si l&rsquo;on consulte la page man de <code>telinit<\/code> (c&rsquo;est la m\u00eame que celle d&rsquo;<code>init<\/code>, on note que la premi\u00e8re poss\u00e8de des options suppl\u00e9mentaires. Une lecture attentive nous apprend ainsi que <code>telinit<\/code> permet de demander \u00e0 <code>init<\/code> de passer dans un niveau <em>n<\/em> (avec <em>n<\/em> compris entre 0 et 6)\u00a0: c&rsquo;est ce que nous \u00e9crivions plus haut.<\/p>\n<p>Mais <code>telinit<\/code> dispose de fonctionnalit\u00e9s suppl\u00e9mentaires\u00a0: il permet de demander \u00e0 <code>init<\/code> effectuer une relecture de <code>\/etc\/inittab<\/code>, ce qui est pratique apr\u00e8s une modification de ce fichier gr\u00e2ce \u00e0 la commande<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># telinit q<\/pre>\n<\/blockquote>\n<p>alors, qu&rsquo;on ne me parle plus de la n\u00e9cessit\u00e9 de red\u00e9marrer sa machine apr\u00e8s une modification des scripts de d\u00e9marrage !<\/p>\n<p>Il dispose aussi de plusieurs autres options\u00e9\u00a0: toutes ont pour but d&rsquo;indiquer \u00e0 <code>init<\/code> de r\u00e9aliser une certaine t\u00e2che. Nous ne les traiterons pas ici et laissons le soin au lecteur curieux de lire la page de manuel.<\/p>\n<h2><a name=\"ss3.3\"><\/a>3.3 Conna\u00eetre le niveau d&rsquo;ex\u00e9cution courant<\/h2>\n<p>En r\u00e9alit\u00e9, il existe plus que 7 niveaux d&rsquo;ex\u00e9cution\u00a0: la commande <code>man init<\/code> nous apprend en effet qu&rsquo;il existe aussi les niveaux 7, 8 et 9 (non document\u00e9s) et <code>S<\/code> (ou <code>s<\/code>) qui correspond au mode mono-utilisateur.<\/p>\n<p>La plupart des Unix utilisent une version de la commande <code>who<\/code> qui permet d&rsquo;indiquer le niveau d&rsquo;ex\u00e9cution courant\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># who -r\n. run level 3   Oct 17 18:00  3  0  S<\/pre>\n<\/blockquote>\n<p>Cette sortie indique que le 17 Octobre, le syst\u00e8me est pass\u00e9 du niveau de fonctionnement <code>S<\/code> au niveau 3. Le 0 indique que ce passage s&rsquo;est effectu\u00e9 du premier coup.<\/p>\n<p>Malheureusement, l&rsquo;option <code>-r<\/code> n&rsquo;est pas disponible sous linux&#8230; Aussi, il faut utiliser une autre commande pour avoir cette information\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># runlevel\nrunlevel\nN 2<\/pre>\n<\/blockquote>\n<p>Indique que le syst\u00e8me est au niveau 2 et qu&rsquo;il n&rsquo;y a pas de niveau pr\u00e9c\u00e9dent.<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># telinit 3\n# runlevel\n2 3<\/pre>\n<\/blockquote>\n<p>Ici, on est pass\u00e9 au niveau 3, le niveau pr\u00e9c\u00e9dent \u00e9tait le niveau 2.<\/p>\n<p>Comme nous l&rsquo;avons vu plus haut, la ligne de la commande <code>ps aux<\/code> concernant <code>init<\/code> renseigne aussi sur le niveau courant, mais pas dans toutes les distributions.<\/p>\n<h2><a name=\"ss3.4\"><\/a>3.4 Le fichier <code>\/etc\/inittab<\/code><\/h2>\n<p>Lorsqu&rsquo;il d\u00e9marre, <code>init<\/code> lit le fichier <code>\/etc\/inittab<\/code> ligne par ligne (si on modifie ce dernier, ce n&rsquo;est pas la peine de rebooter comme sous MS-DOS apr\u00e8s toute modification de <code>CONFIG.SYS<\/code> et\/ou <code>AUTOEXEC.BAT<\/code>, il suffit d&rsquo;envoyer un signal <code>HUP<\/code> \u00e0 <code>init<\/code> pour le forcer \u00e0 le relire avec la commande<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># kill -HUP 1<\/pre>\n<\/blockquote>\n<p>ou<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>kill -s HUP 1<\/pre>\n<\/blockquote>\n<p>Le fichier <code>\/etc\/inittab<\/code> est un fichier texte compos\u00e9 de lignes de commentaires (commen\u00e7ant par <code>#<\/code>) et d&rsquo;entr\u00e9es constitu\u00e9es de 4 champs d\u00e9limit\u00e9s par des deux-points, elles sont de la forme\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>code:niveaux:action:processus<\/pre>\n<\/blockquote>\n<p>&nbsp;<\/p>\n<ul>\n<li>\ufffd <code>code<\/code> \ufffd est un identificateur unique pour chaque entr\u00e9e, c&rsquo;est soit un nombre, soit un mot-cl\u00e9 compos\u00e9 de caract\u00e8res et\/ou de chiffres\u00a0: nous avons d\u00e9j\u00e0 vu \ufffd <code>id<\/code> \ufffd pour l&rsquo;entr\u00e9e correspondant au niveau d&rsquo;ex\u00e9cution par d\u00e9faut, il en existe d&rsquo;autres.<\/li>\n<li>\ufffd <code>niveaux<\/code> \ufffd est une liste de niveaux d&rsquo;ex\u00e9cution auxquels s&rsquo;appliquera l&rsquo;entr\u00e9e, si cette liste est vide, cela \u00e9quivaut \u00e0 indiquer tous les niveaux.<\/li>\n<li>\ufffd <code>action<\/code> \ufffd pr\u00e9cise comment doit \u00eatre traiter le processus indiqu\u00e9 par le champ \ufffd <code>processus<\/code> \ufffd \u00e0 l&rsquo;entr\u00e9e dans un des niveaux de la liste \ufffd <code>niveaux<\/code> \ufffd. Les actions possibles sont\u00a0:\n<dl>\n<dt><b>wait :<\/b><\/dt>\n<dd>lancer le processus et attendre qu&rsquo;il se termine avant de passer \u00e0 l&rsquo;entr\u00e9e suivante d&rsquo;inittab. Ce type d&rsquo;entr\u00e9e sert principalement \u00e0 lancer les scripts d&rsquo;initialisation pour chaque niveau. Exemples\u00a0:&nbsp;<\/p>\n<blockquote>\n<pre>l0:0:wait:\/etc\/rc.d\/rc 0\nl1:1:wait:\/etc\/rc.d\/rc 1\nl2:2:wait:\/etc\/rc.d\/rc 2\nl3:3:wait:\/etc\/rc.d\/rc 3\nl4:4:wait:\/etc\/rc.d\/rc 4\nl5:5:wait:\/etc\/rc.d\/rc 5\nl6:6:wait:\/etc\/rc.d\/rc 6<\/pre>\n<\/blockquote>\n<p>indique qu&rsquo;\u00e0 l&rsquo;entr\u00e9e dans le niveau <code>n<\/code>, il faut lancer le script <code>\/etc\/rc.d\/rc n<\/code>.<\/p>\n<\/dd>\n<dt><b>respawn :<\/b><\/dt>\n<dd>lancer le processus et le relancer automatiquement lorsqu&rsquo;il se termine. Elle est utilis\u00e9e pour la gestion des terminaux. Exemples\u00a0:&nbsp;<\/p>\n<blockquote>\n<pre>1:12345:respawn:\/sbin\/mingetty tty1\n2:2345:respawn:\/sbin\/mingetty tty2\n3:2345:respawn:\/sbin\/mingetty tty3\n4:2345:respawn:\/sbin\/mingetty tty4\n5:2345:respawn:\/sbin\/mingetty tty5<\/pre>\n<\/blockquote>\n<p>indique qu&rsquo;\u00e0 tous les niveaux multi-utilisateurs (2 \u00e0 5), la commande <code>mingetty<\/code> \u00eatre relanc\u00e9e sur les terminaux <code>tty1<\/code> \u00e0 <code>tty5<\/code> lorsqu&rsquo;elle se terminera (afin de pouvoir se logger, se d\u00e9logger et se relogger). Pour le niveau 1 (mono-utilisateur), seul le terminal <code>tty1<\/code> sera utilisable.<\/p>\n<\/dd>\n<dt><b>once :<\/b><\/dt>\n<dd>lancer le processus s&rsquo;il n&rsquo;est pas d\u00e9j\u00e0 lanc\u00e9, ne pas attendre qu&rsquo;il soit termin\u00e9. Exemple\u00a0:&nbsp;<\/p>\n<blockquote>\n<pre>ud::once:\/sbin\/update<\/pre>\n<\/blockquote>\n<p>indique que, quel que soit le niveau o\u00f9 l&rsquo;on entre, l&rsquo;utilitaire <code>update<\/code> sera actif. Il est charg\u00e9 d&rsquo;\u00e9crire p\u00e9riodiquement sur disque le contenu du cache\u00a0: <em>ne le d\u00e9sactivez surtout pas !<\/em><\/p>\n<\/dd>\n<dt><b>boot :<\/b><\/dt>\n<dd>ne lancer le processus qu&rsquo;au d\u00e9marrage du syst\u00e8me et ne pas attendre qu&rsquo;il se termine (le champ \ufffd <code>niveaux<\/code> \ufffd est ignor\u00e9).<\/dd>\n<dt><b>bootwait :<\/b><\/dt>\n<dd>idem mais attendre sa terminaison.<\/dd>\n<dt><b>initdefault :<\/b><\/dt>\n<dd>sp\u00e9cifie le niveau de fonctionnement par d\u00e9faut (le champ \ufffd <code>niveaux<\/code> \ufffd est ignor\u00e9).<\/dd>\n<dt><b>sysinit :<\/b><\/dt>\n<dd>le processus doit s&rsquo;effectuer au d\u00e9marrage du syst\u00e8me, avant toute entr\u00e9e d&rsquo;action \ufffd <code>boot<\/code> \ufffd ou \ufffd <code>bootwait<\/code> \ufffd (le champ \ufffd <code>niveaux<\/code> \ufffd est ignor\u00e9). Exemple\u00a0:&nbsp;<\/p>\n<blockquote>\n<pre>si::sysinit:\/etc\/rc.d\/rc.sysinit<\/pre>\n<\/blockquote>\n<\/dd>\n<dt><b>power&#8230; :<\/b><\/dt>\n<dd>Les actions commen\u00e7ant par \ufffd <code>power<\/code>&#8230;.. \ufffd servent \u00e0 g\u00e9rer les dispositifs d&rsquo;alimentation sauvegard\u00e9e (UPS). Exemple\u00a0:&nbsp;<\/p>\n<blockquote>\n<pre>pf::powerfail:\/sbin\/shutdown -f -h +2 \"Power Failure; System Shutting Down\"\npr:12345:powerokwait:\/sbin\/shutdown -c \"Power Restored; Shutdown Cancelled\"<\/pre>\n<\/blockquote>\n<p>Bien entendu, elle n&rsquo;ont de sens que si l&rsquo;on dispose d&rsquo;\u00e9quipements de ce genre.<\/p>\n<\/dd>\n<dt><b>ctrlaltdel :<\/b><\/dt>\n<dd>le processus sera ex\u00e9cut\u00e9 lorsqu&rsquo;init recevra le signal <code>SIGINT<\/code> (g\u00e9n\u00e9r\u00e9 par la combinaison de touches <code>CTRL-ALT-SUPPR<\/code>). Elle sert g\u00e9n\u00e9ralement \u00e0 arr\u00eater et\/ou red\u00e9marrer le syst\u00e8me. Exemple\u00a0:&nbsp;<\/p>\n<blockquote>\n<pre>ca::ctrlaltdel:\/sbin\/shutdown -t3 -h now<\/pre>\n<\/blockquote>\n<\/dd>\n<\/dl>\n<\/li>\n<\/ul>\n<p>Un examen de votre <code>\/etc\/inittab<\/code> vous montrera que celui-ci est divis\u00e9 en un certain nombre de sections d\u00e9limit\u00e9es par des commentaires.<\/p>\n<p>Notez, qu&rsquo;\u00e0 part modifier le niveau d&rsquo;ex\u00e9cution par d\u00e9faut et la commande associ\u00e9e \u00e0 <code>CTRL-ALT-SUPPR<\/code>, il y a peu de raisons pour lesquelles vous serez amen\u00e9 \u00e0 modifier ce fichier.<\/p>\n<h2><a name=\"ss3.5\"><\/a>3.5 Les scripts d&rsquo;initialisation de <code>\/etc\/rc.d<\/code><\/h2>\n<p>L&rsquo;\u00e9tude de <code>\/etc\/inittab<\/code> nous a montr\u00e9 qu&rsquo;<code>init<\/code> lan\u00e7ait des programmes se trouvant dans le r\u00e9pertoire <code>\/etc\/rc.d<\/code>. Ce sont les fameux scripts d&rsquo;initialisation dont nous parlions dans l&rsquo;introduction. Par exemple, la ligne\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>l2:2:wait:\/etc\/rc.d\/rc 2<\/pre>\n<\/blockquote>\n<p>signifie qu&rsquo;<code>init<\/code> doit lancer le script <code>\/etc\/rc.d\/rc<\/code> en lui passant <code>2<\/code> en param\u00e8tre \u00e0 chaque fois qu&rsquo;on entre dans le niveau 2 et qu&rsquo;il doit attendre la terminaison de ce script avant de poursuivre.<\/p>\n<p>La ligne :<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>si::sysinit:\/etc\/rc.d\/rc.sysinit<\/pre>\n<\/blockquote>\n<p>signifie qu&rsquo;<code>init<\/code> doit lancer le script <code>\/etc\/rc.d\/rc.sysinit<\/code> lors de l&rsquo;initialisation du syst\u00e8me, quel que soit le niveau d&rsquo;ex\u00e9cution.<\/p>\n<p>Un examen de ce r\u00e9pertoire nous donne quelque chose comme :<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># ls -l \/etc\/rc.d\ndrwxr-xr-x   2 root     root         1024 jui 31 19:30 init.d\n-rwxr-xr-x   1 root     root         1593 jun  2 19:59 rc\n-rwxr-xr-x   1 root     root          690 jun  2 19:59 rc.local\n-rwxrwx---   1 news     news         2083 jun 13 15:28 rc.news\n-rwxr-xr-x   1 root     root         6697 jun  2 19:59 rc.sysinit\ndrwxr-xr-x   2 root     root         1024 jui 31 19:30 rc0.d\ndrwxr-xr-x   2 root     root         1024 jui 31 19:30 rc1.d\ndrwxr-xr-x   2 root     root         1024 jui 31 19:30 rc2.d\ndrwxr-xr-x   2 root     root         1024 jui 31 19:30 rc3.d\ndrwxr-xr-x   2 root     root         1024 jui 31 19:30 rc4.d\ndrwxr-xr-x   2 root     root         1024 jui 31 19:30 rc5.d\ndrwxr-xr-x   2 root     root         1024 jui 31 19:30 rc6.d<\/pre>\n<\/blockquote>\n<p>ce qui nous enseigne que ce r\u00e9pertoire ne contient que 4 fichiers ex\u00e9cutables\u00a0: <code>rc, rc.local, rc.news<\/code> et <code>rc.sysinit<\/code> (le <code>rc.news<\/code> n&rsquo;existera peut \u00eatre pas sur votre syst\u00e8me si vous ne l&rsquo;avez pas configur\u00e9 comme serveur Usenet).<\/p>\n<p><code>rc.local<\/code>, comme son nom l&rsquo;indique est \ufffd local \ufffd \u00e0 votre machine\u00a0: c&rsquo;est l\u00e0 que vous ajouterez les commandes d&rsquo;initialisation propres \u00e0 votre syst\u00e8me. <code>rc.local<\/code> est appel\u00e9 en dernier, c&rsquo;est-\u00e0 dire apr\u00e8s tous les autres scripts. Par d\u00e9faut, sur mon syst\u00e8me, il se contente de laisser un message indiquant la version Red Hat et celle du noyau dans le fichier <code>\/etc\/issue<\/code>, \u00e0 partir des informations qu&rsquo;il tire du syst\u00e8me. Ce fichier, s&rsquo;il existe, est affich\u00e9 automatiquement avant l&rsquo;invite de login.<\/p>\n<p><code>rc.news<\/code>, s&rsquo;il existe, lance les d\u00e9mons n\u00e9cessaires au serveur de news.<\/p>\n<p><code>rc.sysinit<\/code>, on l&rsquo;a vu, est le script qui est lanc\u00e9 lors de l&rsquo;initialisation du syst\u00e8me, il sert \u00e0 configurer la variable d&rsquo;environnement <code>PATH<\/code> au niveau du syst\u00e8me, \u00e0 activer le swap, \u00e0 configurer le nom de la machine avec la commande <code>hostname<\/code>, \u00e0 lancer les commandes de v\u00e9rification des syst\u00e8mes de fichiers, \u00e0 les monter, \u00e0 activer les modules si ceux-ci sont utilis\u00e9s, etc. Parcourez-le, cela vous donnera envie de conna\u00eetre la syntaxe du shell&#8230;<\/p>\n<p><code>rc<\/code>, on l&rsquo;a vu aussi, est appel\u00e9 par <code>init<\/code> avec un param\u00e8tre correspondant au niveau d&rsquo;ex\u00e9cution dans lequel on entre. Ce param\u00e8tre est r\u00e9cup\u00e9r\u00e9 par le script <code>rc<\/code> pour former un nom de r\u00e9pertoire. Par exemple, l&rsquo;appel <code>\/etc\/rc.d\/rc 2<\/code> fera que <code>rc<\/code> ira examiner le r\u00e9pertoire <code>\/etc\/rc.d\/rc2.d<\/code>. Un examen du code de <code>rc<\/code> montre qu&rsquo;il ex\u00e9cute alors d&rsquo;abord les scripts de ce r\u00e9pertoire dont le nom commence par <code>K<\/code>, puis ceux dont le nom commence par <code>S<\/code>. Le r\u00f4le de <code>rc<\/code> est donc surtout un r\u00f4le d&rsquo;aiguillage et d&rsquo;ex\u00e9cution d&rsquo;autres scripts.<\/p>\n<h2><a name=\"ss3.6\"><\/a>3.6 Les scripts d&rsquo;initialisation de <code>\/etc\/rc.d\/rcn.d<\/code><\/h2>\n<p>Examinons, par exemple, le contenu du r\u00e9pertoire <code>\/etc\/rc.d\/rc2.d<\/code>, examin\u00e9 par le script <code>\/etc\/rc.d\/rc<\/code> lorsqu&rsquo;il est appel\u00e9 par <code>init<\/code> lorsque le syst\u00e8me entre dans le niveau d&rsquo;ex\u00e9cution 2\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>$ ls -l \/etc\/rc.d\/rc2.d\ntotal 0\nlrwxrwxrwx   1 root     root           18 jun 12 12:02 K10pnserver -&gt; ..\/init.d\/pnserver\nlrwxrwxrwx   1 root     root           15 jun 12 12:02 K15sound -&gt; ..\/init.d\/sound\nlrwxrwxrwx   1 root     root           17 jun 12 12:02 K20rusersd -&gt; ..\/init.d\/rusersd\nlrwxrwxrwx   1 root     root           15 jun 12 12:02 K20rwhod -&gt; ..\/init.d\/rwhod\nlrwxrwxrwx   1 root     root           14 jun 12 12:00 K25innd -&gt; ..\/init.d\/innd\nlrwxrwxrwx   1 root     root           14 jun 12 12:01 K50inet -&gt; ..\/init.d\/inet\nlrwxrwxrwx   1 root     root           16 jun 12 12:02 K55routed -&gt; ..\/init.d\/routed\nlrwxrwxrwx   1 root     root           13 jun 12 11:58 K60atd -&gt; ..\/init.d\/atd\nlrwxrwxrwx   1 root     root           15 jun 12 12:00 K95nfsfs -&gt; ..\/init.d\/nfsfs\nlrwxrwxrwx   1 root     root           17 jun 12 12:01 S01kerneld -&gt; ..\/init.d\/kerneld\nlrwxrwxrwx   1 root     root           17 jun 12 12:00 S10network -&gt; ..\/init.d\/network\nlrwxrwxrwx   1 root     root           16 jun 12 12:00 S20random -&gt; ..\/init.d\/random\nlrwxrwxrwx   1 root     root           16 jun 12 12:02 S30syslog -&gt; ..\/init.d\/syslog\nlrwxrwxrwx   1 root     root           15 jun 12 12:04 S40crond -&gt; ..\/init.d\/crond\nlrwxrwxrwx   1 root     root           13 jun 12 12:01 S60lpd -&gt; ..\/init.d\/lpd\nlrwxrwxrwx   1 root     root           18 jun 12 12:00 S75keytable -&gt; ..\/init.d\/keytable\nlrwxrwxrwx   1 root     root           18 jun 12 12:02 S80sendmail -&gt; ..\/init.d\/sendmail\nlrwxrwxrwx   1 root     root           13 jun 12 11:59 S85gpm -&gt; ..\/init.d\/gpm\nlrwxrwxrwx   1 root     root           11 jun 12 12:00 S99local -&gt; ..\/rc.local<\/pre>\n<\/blockquote>\n<p>Comme on le voit, il ne contient que des liens vers des fichiers du r\u00e9pertoire <code>\/etc\/rc.d\/init.d\/<\/code> (sauf <code>S99local<\/code>, qui pointe vers <code>\/etc\/rc.d\/rc.local<\/code>).<\/p>\n<p>Ces liens sont de deux types, ceux dont le nom commence par <code>K<\/code> (comme <b>K<\/b>ill\u00a0: arr\u00eater), ceux dont le nom commence par <code>S<\/code> (<b>S<\/b>tart\u00a0: d\u00e9marrer). Comme nous l&rsquo;avons vu, <code>\/etc\/rc.d\/rc<\/code> ex\u00e9cute en premier ceux dont le nom commence par <code>K<\/code> (en fait, il les ex\u00e9cute dans l&rsquo;ordre dans lequel ils apparaissent avec la commande <code>ls<\/code>&#8230;). L&rsquo;ordre est r\u00e9gl\u00e9 entre les liens par le biais d&rsquo;une num\u00e9rotation\u00a0: ainsi, pour assurer que <code>\/etc\/rc.d\/rc.local<\/code> soit lanc\u00e9 en dernier, on met 99 derri\u00e8re le <code>S<\/code> (ce qui suit ces 3 caract\u00e8res a peu d&rsquo;importance, ce lien aurait pu se nommer <code>S99toto<\/code>\u00a0: tout ce qui compte, c&rsquo;est l&rsquo;ordre d&rsquo;apparition).<\/p>\n<p>Quand le syst\u00e8me entre dans le niveau d&rsquo;ex\u00e9cution 2, <code>init<\/code>, par le biais de la commande <code>\/etc\/rc.d\/rc 2<\/code>, ex\u00e9cute la commande <code>\/etc\/rc.d\/rc2.d\/K10pnserver stop<\/code>. Cela est r\u00e9alis\u00e9 par les lignes suivantes :<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># Lancer d'abord les scripts KILL\n  for i in \/etc\/rc.d\/rc$runlevel.d\/K*; do\n      # Verifie si le script existe\n      [ ! -f $i ] &amp;&amp; continue\n\n      # Verifie si le sous-systeme est deja lance\n      subsys=${i#\/etc\/rc.d\/rc$runlevel.d\/K??}\n      [ ! -f \/var\/lock\/subsys\/$subsys ] &amp;&amp; \\\n         [ ! -f \/var\/lock\/subsys\/${subsys}.init ] &amp;&amp; continue\n\n      # Arrete le sous-systeme\n      $i stop\n  done<\/pre>\n<\/blockquote>\n<p>Avec notre exemple, la variable <code>i<\/code> prendra successivement tous les noms des fichiers <code>\/etc\/rc.d\/rc2.d\/K*<\/code>, apr\u00e8s avoir test\u00e9 que le sous-syst\u00e8me a bien \u00e9t\u00e9 lanc\u00e9, la commande <code>$i stop<\/code> lancera le script en lui passant l&rsquo;argument <code>stop<\/code>. On pourra v\u00e9rifier que le traitement des liens dont le nom commence par <code>S<\/code> suit la m\u00eame d\u00e9marche sauf qu&rsquo;il v\u00e9rifie que le service n&rsquo;est pas d\u00e9j\u00e0 lanc\u00e9 et que c&rsquo;est l&rsquo;argument <code>start<\/code> qui est pass\u00e9 au script.<\/p>\n<p>Le but du r\u00e9pertoire <code>\/etc\/rc.d\/rc2.d\/<\/code> est donc simplement d&rsquo;indiquer quels sont les scripts \u00e0 stopper et \u00e0 lancer lorsqu&rsquo;on entre dans le niveau 2. Pour stopper un service suppl\u00e9mentaire, il suffit de cr\u00e9er un lien dont le nom commence par <code>K<\/code> dans ce r\u00e9pertoire. Apr\u00e8s le <code>K<\/code>, on choisi un num\u00e9ro pour qu&rsquo;il soit plac\u00e9 en bonne place, et g\u00e9n\u00e9ralement le nom du service concern\u00e9. Ce lien doit alors pointer vers le v\u00e9ritable script se trouvant dans <code>\/etc\/rc.d\/init.d<\/code>.<\/p>\n<p>Par exemple, <code>ln -s \/etc\/rc.d\/init.d\/toto \/etc\/rc.d\/rc2.d\/K12toto<\/code> fera qu&rsquo;\u00e0 la prochaine entr\u00e9e en niveau 2, <code>init<\/code> arr\u00eatera le service <code>toto<\/code> apr\u00e8s avoir arr\u00eat\u00e9 le service <code>pnserver<\/code> et avant d&rsquo;arr\u00eater le service <code>sound<\/code>. La m\u00eame d\u00e9marche s&rsquo;applique pour le lancement de services suppl\u00e9mentaires.<\/p>\n<p>On notera que Linux dispose d&rsquo;interfaces graphiques permettant de \ufffd\u00a0faciliter\u00a0\ufffd ces ajouts\/suppressions : l&rsquo;outil <code>tksysv<\/code> de Red Hat, les outils graphiques de KDE et Gnome, Linuxconf.<\/p>\n<p>Les r\u00e9pertoires <code>\/etc\/rc.d\/rc0.d<\/code> et <code>\/etc\/rc.d\/rc6.d<\/code> sont particuliers puisqu&rsquo;ils correspondent respectivement \u00e0 l&rsquo;entr\u00e9e dans le niveau de mise hors service et dans le niveau de red\u00e9marrage. L&rsquo;examen du premier vous montrera qu&rsquo;il ne comporte que de liens <code>K<\/code> et un seul lien <code>S<\/code>\u00a0: <code>S00halt<\/code>. C&rsquo;est logique, car la mise hors service doit commencer par arr\u00eater tous les services en cours, puis lancer la routine d&rsquo;arr\u00eat du syst\u00e8me. De m\u00eame, <code>rc6.d<\/code> contient des liens <code>K<\/code> et un lien vers le script de red\u00e9marrage (<code>S00reboot<\/code>).<\/p>\n<p>En fait, cette m\u00e9thode peut sembler lourde alors qu&rsquo;elle est finalement d&rsquo;une simplicit\u00e9 \u00e0 toute \u00e9preuve\u00a0: \u00e0 part <code>rc.local<\/code>, tous les scripts sont regroup\u00e9s dans le r\u00e9pertoire <code>\/etc\/rc.d\/init.d<\/code> et on d\u00e9cide dans le r\u00e9pertoire associ\u00e9 au niveau <code>n<\/code> (<code>\/etc\/rc.d\/rcn.d<\/code>) des scripts qu&rsquo;il faut lancer et de ceux qu&rsquo;il faut arr\u00eater&#8230;<\/p>\n<h2><a name=\"ss3.7\"><\/a>3.7 Les scripts d&rsquo;initialisation de <code>\/etc\/rc.d\/init.d<\/code><\/h2>\n<p>Examinons le contenu de ce r\u00e9pertoire :<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>$ ls -l \/etc\/rc.d\/init.d\ntotal 38\n-rwxr-xr-x   1 root     root          884 mai  5 18:19 atd\n-rwxr-xr-x   1 root     root          883 mai  6 01:29 crond\n-rwxr-xr-x   1 root     root         3375 jun  2 19:59 functions\n-rwxr-xr-x   1 root     root         1073 mai  8 05:59 gpm\n-rwxr-xr-x   1 root     root         1351 jun  2 19:59 halt\n-rwxr-xr-x   1 root     root         1509 mai  6 01:25 inet\n-rwxr-x---   1 root     root         1510 jun 10 12:33 innd\n-rwxr-xr-x   1 root     root          780 mai  2 00:21 kerneld\n-rwxr-xr-x   1 root     root          903 mai  7 16:39 keytable\n-rwxr-xr-x   1 root     root          447 jun  2 19:59 killall\n-rwxr-xr-x   1 root     root         1015 mai  6 01:24 lpd\n-rwxr-xr-x   1 root     root         4398 jun  2 19:59 network\n-rwxr-xr-x   1 root     root         1299 jun  2 19:59 nfsfs\n-rwxr-xr-x   1 root     root         1036 avr  6 00:15 pnserver\n-rwxr-xr-x   1 root     root         1535 jun  2 19:59 random\n-rwxr-xr-x   1 root     root         1138 mai 11 01:58 routed\n-rwxr-xr-x   1 root     root          773 mai  6 05:18 rusersd\n-rwxr-xr-x   1 root     root          780 mai  6 01:27 rwhod\n-rwxr-xr-x   1 root     root          921 dec 31  1997 sendmail\n-rwxr-xr-x   1 root     root          906 jun  2 19:59 single\n-rwxr-xr-x   1 root     root         1372 mai  6 01:26 sound\n-rwxr-xr-x   1 root     root          799 avr 30 07:53 syslog<\/pre>\n<\/blockquote>\n<p>Les voici, nos fameux scripts ! Le contenu de ce r\u00e9pertoire varie en fonction des paquetages install\u00e9s.<\/p>\n<p>Examinons, par exemple, le script <code>inet<\/code>\u00a0:<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre>$ less inet\n\n#! \/bin\/sh\n#\n# inet          Start TCP\/IP networking services. This script\n#               sets the hostname, creates the routes and\n#               starts the Internet Network Daemon &amp; RPC portmapper.<\/pre>\n<\/blockquote>\n<p>Le d\u00e9but de chaque script commence par indiquer les services qu&rsquo;il assure\u00a0: ici, celui des services TCP\/IP, la configuration du nom de la machine, etc.<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre># See how we were called.\ncase \"$1\" in\n  start)\n        echo -n \"Starting INET services: \"\n        daemon inetd\n\n        echo\n        touch \/var\/lock\/subsys\/inet\n        ;;\n  stop)\n        # bringing down NFS filesystems isn't inet's problem I don't know \n        # why this script used to do that -- ewt\n\n        echo -n \"Stopping INET services: \"\n        killproc inetd<\/pre>\n<\/blockquote>\n<p>puis, le script regarde avec quel param\u00e8tre il a \u00e9t\u00e9 appel\u00e9\u00a0: <code>start<\/code>, auquel cas il lance le programme assurant le service pour lequel il a \u00e9t\u00e9 con\u00e7u (ici, avec la commande <code>daemon inetd<\/code>), ou <code>stop<\/code> auquel cas, il stoppe ce service (avec la commande <code>killproc inetd<\/code>).<\/p>\n<p>Certains scripts acceptent d&rsquo;autres param\u00e8tres\u00a0: <code>restart<\/code> par exemple, combine un appel avec <code>stop<\/code> et un appel avec <code>start<\/code>.<\/p>\n<h2><a name=\"ss3.8\"><\/a>3.8 Conclusion sur l&rsquo;<code>init<\/code> System V<\/h2>\n<p>Voil\u00e0, vous connaissez l&rsquo;essentiel du m\u00e9canisme de d\u00e9marrage\/arr\u00eat des services avec l&rsquo;<code>init<\/code> de System V. Si vous vous rendez compte qu&rsquo;un service ne fonctionne pas\u00a0: <code>cron<\/code>, par exemple, assurez-vous qu&rsquo;un lien <code>S<\/code> vers le script <code>cron<\/code> existe bien dans le r\u00e9pertoire correspondant au niveau d&rsquo;ex\u00e9cution dans lequel vous travaillez. Si ce n&rsquo;est pas le cas, cr\u00e9ez-le. Pour son arr\u00eat, ajoutez un lien <code>K<\/code> dans <code>rc6.d<\/code> et <code>rc0.d<\/code> afin que le service <code>cron<\/code> ne soit stopp\u00e9 qu&rsquo;au moment de l&rsquo;arr\u00eat\/red\u00e9marrage du syst\u00e8me. Bien entendu, le script <code>cron<\/code> doit exister dans <code>\/etc\/rc.d\/init.d<\/code>&#8230; si ce n&rsquo;est pas le cas, c&rsquo;est probablement que vous n&rsquo;avez pas install\u00e9 le paquetage correspondant \u00e0 ce service (<code>vixie-cron-3.0.1-*<\/code>, dans le cas de cron et d&rsquo;un Red Hat).<\/p>\n<p>Apr\u00e8s tout ajout, pensez \u00e0 relancer <code>init<\/code>, ou faites-le \u00e0 la main avec une commande comme <code>.\/etc\/rc.d\/init.d\/crond start<\/code>. V\u00e9rifiez avec une commande comme <code>ps aux | egrep [c]rond<\/code> que le service est bien lanc\u00e9.<\/p>\n<p>Passons maintenant \u00e0 l&rsquo;<code>init<\/code> de la distribution Slackware.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>http:\/\/www.linux-france.org\/article\/sys\/init-jaco\/init-jaco-3.html Niveaux d&rsquo;ex\u00e9cution System V \u00c0 tout moment, votre syst\u00e8me Linux se trouve \u00e0 un niveau d&rsquo;ex\u00e9cution donn\u00e9. La distribution Red Hat en d\u00e9finit 7\u00a0: &nbsp; 0 : Hors service : l&rsquo;alimentation peut alors \u00eatre coup\u00e9e dans danger 1 : Mode mono-utilisateur (pour administration syst\u00e8me) 2 : Mode multi-utilisateurs : fonctionnement normal sans NFS (identique &hellip; <a href=\"http:\/\/les-fougs.com\/wordpress\/2013\/07\/31\/linit-de-la-red-hat\/\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;L&rsquo;init de la Red Hat.&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[51],"tags":[],"_links":{"self":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts\/540"}],"collection":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/comments?post=540"}],"version-history":[{"count":0,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts\/540\/revisions"}],"wp:attachment":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/media?parent=540"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/categories?post=540"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/tags?post=540"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}