Source de cours/demarrage.php

<?
  
require ("../page.inc");
  require (
"lessons.inc");

  
$currentPage = new LessonPage("demarrage");

  
$currentPage->setContent('');

  
$currentPage->addChapter('general''Généralités''
<p>
Pour qu\'un système <acronym xml:lang="en" title="GNU\'s Not Unix" lang="en">GNU</acronym>/Linux soit utilisable, il doit d\'abord passer par plusieurs étapes d\'initialisation et de lancement de divers programmes. Dans cet article sera décrit ce qu\'il se passe depuis la mise sous tension de la machine jusqu\'au moment où l\'utilisateur pourra s\'en servir.
</p>
<p>
Pour la plupart, ces étapes dépendent fortement de la distribution GNU/Linux utilisée. Selon les choix fait par les créateurs des distributions, quelques détails peuvent changer, mais les principes restent les mêmes.
</p>
<p>
Chacune des étapes décrites ci-dessous peut être adaptée selon les besoins afin d\'obtenir des fonctionnalités supplémentaires ou de réduire le temps de démarrage par exemple.
</p>
'
);

  
$currentPage->addChapter('chargeur''Le chargeur de noyau''
<p>
Le tout premier programme à être lancé est en réalité le <acronym xml:lang="en" lang="en" title="Basic Input Output System">BIOS</acronym>. Celui-ci va chercher au début du 1er disque dur afin d\'y trouver un <strong>chargeur</strong> (en réalité l\'endroit où rechercher est configuré dans les paramètres du BIOS). Il s\'agit d\'un petit programme dont le but sera de lancer le système d\'exploitation complet. Les chargeurs récents sont capables de laisser à l\'utilisateur le choix du système à lancer (on appelle cela un <strong>multiboot</strong>). Plusieurs peuvent alors cohabiter sur une même machine.
</p>
<p>
Les plus utilisés pour lancer un noyau Linux sont <a href="http://freshmeat.net/projects/lilo/" rel="external" hreflang="en">LILO</a> et <a href="http://www.gnu.org/software/grub/" rel="external" hreflang="en">GRUB</a>. Ils partagent de nombreux points communs comme le fait de pouvoir passer des options au noyau.
</p>
<p>
La configuration de LILO se fait dans le fichier <strong>/etc/lilo.conf</strong>. En voici un exemple&nbsp;:
</p>
<code>
boot=/dev/hda<br />
map=/boot/map<br />
install=/boot/boot.b<br />
default=linux<br />
prompt<br />
timeout=10<br />
message=/boot/message<br />
<br />
image=/boot/vmlinuz<br />
&nbsp;&nbsp;label=linux<br />
&nbsp;&nbsp;root=/dev/hda1<br />
<br />
image=/boot/vmlinuz.old<br />
&nbsp;&nbsp;label=ancien linux<br />
&nbsp;&nbsp;root=/dev/hdb1<br />
&nbsp;&nbsp;append="noapic"
</code>
<p>
Cet exemple permet d\'avoir le choix entre deux systèmes GNU/Linux au démarrage. Sans rentrer dans le détail de toutes les options, on peut voir où est installé LILO avec l\'option <strong>boot</strong> (/dev/hda désigne le <acronym lang="en" xml:lang="en" title="Master Boot Record">MBR</acronym>). La ligne contenant <strong>append</strong> permet de passer des options au noyau qui sera lancé.
</p>
<p>
Pour GRUB, c\'est le fichier <strong>/etc/grub.conf</strong> qui est utilisé
</p>
<code>
default=0<br />
timeout=10<br />
splashimage=(hd0,0)/boot/splash.xpm.gz<br />
title linux<br />
&nbsp;&nbsp;root (hd0,0)<br />
&nbsp;&nbsp;kernel /boot/vmlinuz root=/dev/hda1<br />
title ancien linux<br />
&nbsp;&nbsp;root (hd1,0)<br />
&nbsp;&nbsp;kernel /boot/vmlinuz.old root=/dev/hdb1 noapic
</code>
<p>
Ce fichier fournit un comportement similaire à celui pour LILO. On remarquera que les options sont ici passées à la suite du nom du noyau. De plus, l\'endroit où installer GRUB n\'est pas précisé dans ce fichier mais se fait au moment de son installation avec le programme <strong>grub</strong>.
</p>
<p>
Les noms de fichiers donnés ci-dessus sont ceux par défaut et utilisé dans la plupart des distributions. Cela peut changer dans certains cas particuliers.
</p>
<p>
Pour que les modifications apportées soient prises en compte, LILO nécessite que soit lancé le programme <strong>lilo</strong>. Pour GRUB ce n\'est pas nécessaire, et lors du prochain redémarrage, la nouvelle version du fichier de configuration sera utilisée.
</p>
<p>
Une fois que l\'utilisateur a fait son choix, le noyau est donc lancé avec certains paramètres.
</p>
'
);

  
$currentPage->addChapter('noyau''Le noyau''
<p>
Son rôle lors du démarrage est principalement d\'initialiser les différents composants matériels présents en utilisant notamment les pilotes de périphérique présents dans le noyau. Ceux qui ont été compilés sous forme de modules ne sont pas pris en compte à ce moment.
</p>
<p>
Ces initialisations concernent surtout les composants centraux de la machine comme le processeur ou les contrôleurs de périphériques. Les périphériques externes ne seront eux initialisés généralement qu\'au moment de leur utilisation. L\'écran est toutefois utilisé rapidement après le lancement du noyau afin de donner des informations à l\'utilisateur. Le noyau configure donc la carte graphique dans un mode standard pouvant être reconnu par une majorité de cartes. Il est de plus possible de changer cette valeur par une option du noyau (<strong>vga=XXX</strong>).
</p>
<p>
Il y a deux manières d\'influer sur ce que va faire le noyau. On peut le recompiler en changeant les paramètres accessibles lors de la configuration ou alors lui passer des options.
</p>
<p>
L\'avantage des options est que cela peut être changé d\'un démarrage sur un autre. Et les chargeurs de noyau vus précédemment permette de faire cela très facilement, y compris de façon temporaire. Mais on rencontrera certains cas (comme par exemple rajouter le support d\'un matériel particulier) où une recompilation du noyau sera indispensable.
</p>
<p>
Voici quelques exemples d\'options fréquentes et utiles. Leur liste complète est en réalité plus longue mais ne sera pas détaillée ici.
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Options couramment passées au noyau">
<caption>Options courantes</caption>
<tr>
<th scope="col" abbr="Option">Option pour le noyau</th><th scope="col" abbr="Description">Description</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td><strong>vga</strong>=XXX</td><td>Sert à changer la résolution d\'écran utilisée pendant le démarrage. Utile si celle par défaut n\'est pas reconnue par la carte graphique.</td>
</tr>
<tr>
<td><strong>no-scroll</strong></td><td>Permet de désactiver le défilement du texte sur l\'écran. A utiliser notamment avec des terminaux braille pour lesquels le défilement peut poser problème.</td>
</tr>
<tr>
<td><strong>noapic</strong></td><td>L\'<acronym xml:lang="en" lang="en" title="Advanced Programmable Interrupt Controller">APIC</acronym> permet à plusieurs périphériques de partager des ressources communes (les <acronym xml:lang="en" lang="en" title="Interrupt Request">IRQ</acronym>). Avec cette option, on peut désactiver ce mécanisme qui peut engendrer des problèmes avec certains matériels.</td>
</tr>
<tr>
<td><strong>mem</strong>=XXX</td><td>Permet d\'indiquer la valeur de mémoire vive présente sur la machine pour le cas ou l\'auto-detection échouerait. On peut utiliser des lettres pour cette taille. Par exemple 512M désignera 512 Méga-octets de mémoire.</td>
</tr>
<tr>
<td><strong>init</strong>=XXX</td><td>Permet d\'indiquer de manière explicite quel programme doit être lancé après l\'initialisation du noyau (plus de détails dans la section suivante).</td>
</tr>
</table>
</div>
'
);

  
$currentPage->addChapter('init''Le processus init''
<p>
Une fois que le noyau a fini tout son travail d\'initialisation, il lance alors un programme qui va devenir le père de tous les autres processus et portera l\'identifiant de processus (le <acronym xml:lang="en" title="Process Identifier" lang="en">PID</acronym>) 1.
</p>
<p>
Ce programme s\'appelle généralement <strong>init</strong>. Le noyau va en fait essayer de lancer successivement les programmes suivants&nbsp;:
</p>
<ul>
<li>/sbin/init</li>
<li>/etc/init</li>
<li>/bin/init</li>
<li>/bin/sh</li>
</ul>
<p>
Dès qu\'un de ceux-là est lancé avec succès, les autres ne sont même pas testés car le contrôle est passé au programme.
</p>
<p>
On voit que le programme init est cherché dans différents répertoires (/sbin, /etc et finalement /bin) . S\'il ne se trouve dans aucun de ceux-là, le noyau tente de lancer un shell afin que l\'utilisateur ait accès au système. Si cela échoue également, le noyau affiche un message d\'erreur et s\'arrête.
</p>
<p>
Pour pouvoir indiquer un autre programme que ceux-là, il faut utiliser l\'option du noyau <strong>init=</strong> vue précédemment. On lui passe en paramètre le chemin complet de l\'exécutable à lancer.
</p>
<p>
Le comportement d\'init se configure à l\'aide du fichier <strong>/etc/inittab</strong>. En voici un exemple d\'extrait&nbsp;:
</p>
<code>
id:5:initdefault:<br />
<br />
si::sysinit:/etc/rc.sysinit<br />
<br />
l0:0:wait:/etc/rc.d/rc 0<br />
l1:1:wait:/etc/rc.d/rc 1<br />
l2:2:wait:/etc/rc.d/rc 2<br />
l3:3:wait:/etc/rc.d/rc 3<br />
l4:4:wait:/etc/rc.d/rc 4<br />
l5:5:wait:/etc/rc.d/rc 5<br />
l6:6:wait:/etc/rc.d/rc 6<br />
<br />
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
</code>
<p>
Chaque ligne est construite de la même manière avec les champs suivants&nbsp;:
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Format des lignes du fichier /etc/inittab">
<caption>Format dans /etc/inittab</caption>
<tr>
<th scope="col" abbr="Position">Position</th><th scope="col" abbr="Nom">Nom</th><th scope="col" abbr="Description">Description</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td>1</td><td><strong>Identifiant</strong></td><td>Une chaîne de caractère choisie par l\'utilisateur (sauf dans certains cas particuliers) et permettant d\'identifier la ligne.</td>
</tr>
<tr>
<td>2</td><td><strong>Niveaux d\'exécution</strong></td><td>Les niveaux d\'exécution (détaillés dans le chapitre suivant) pour lesquels cette ligne doit être prise en compte.</td>
</tr>
<tr>
<td>3</td><td><strong>Action</strong></td><td>Contient une des actions prédéfinies indiquant ce qui doit être fait.Le tableau suivant les liste.</td>
</tr>
<tr>
<td>4</td><td><strong>Programme</strong></td><td>Le programme qui doit être exécuté lorsque l\'on rentre dans les niveaux indiqués.</td>
</tr>
</table>
</div>
<p>
Selon l\'action choisie, le comportement sera différent et certains champs peuvent être ignorés. Voici la description des actions le plus souvent utilisées.
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Action utilisées dans le fichier /etc/inittab">
<caption>Actions pour /etc/inittab</caption>
<tr>
<th scope="col" abbr="Action">Action</th><th scope="col" abbr="Ignorés">Champs ignorés</th><th scope="col" abbr="Description">Description</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td><strong>initdefault</strong></td><td>Programme</td><td>Permet d\'indiquer le niveau d\'exécution à utiliser par défaut. Le champs <strong>Niveaux d\'exécution</strong> contiendra alors une seule valeur qui sera ce niveau par défaut.</td>
</tr>
<tr>
<td><strong>sysinit</strong></td><td>Niveaux d\'exécution</td><td>Le champs <strong>Programme</strong> contient le chemin vers un exécutable qui sera lancé en tout premier par init (donc juste après que le noyau ait terminé ses initialisations).</td>
</tr>
<tr>
<td><strong>wait</strong></td><td>Aucun</td><td>Lorsque le système passera dans la niveau d\'exécution spécifié, init exécutera la commande indiquée puis attendra qu\'elle se termine.</td>
</tr>
<tr>
<td><strong>respawn</strong></td><td>Aucun</td><td>Semblable à <strong>wait</strong> si ce n\'est qu\'à chaque fois que le programme se termine, init le relancera.</td>
</tr>
<tr>
<td><strong>ctrlaltdel</strong></td><td>Niveaux d\'exécution</td><td>Permet d\'indiquer une commande devant être exécutée lorsque l\'utilisateur presse la combinaison de touches Ctrl-Alt-Suppr.</td>
</tr>
</table>
</div>
'
);

  
$currentPage->addChapter('runlevels''Les niveaux d\'exécution''
<p>
Sur les systèmes GNU/Linux, on a plusieurs <strong>niveaux d\'exécution</strong> possibles (appelés aussi <strong>modes d\'exécution</strong>). Il s\'agit en fait de mode de démarrage différents qui différent les uns des autres par les services qui y sont lancés.
</p>
<p>
La convention choisie est celle appelée <strong>System V init</strong> qui définit la manière dont doivent être gérés les différents niveaux. Dans le fichier inittab donné en exemple dans le chapitre précédent, on peut voir que c\'est le programme <strong>/etc/rc.d/rc</strong> qui gère cela. Il est lancé avec en paramètre le numéro de niveau lorsque l\'on a besoin de basculer dans un certain niveau d\'exécution.
</p>
<p>
On trouve en général 7 niveaux d\'exécution numérotés de 0 à 6. Leur utilisation est libre, mais traditionnellement on a l\'utilisation suivante&nbsp;:
</p>
<div class="lesson-spacer">
<table class="lesson" summary="Utilisation habituelle des niveaux d\'exécution">
<caption>Niveaux d\'exécution</caption>
<tr>
<th scope="col" abbr="Numéro">Numéro</th><th scope="col" abbr="Désignation">Désignation</th><th scope="col" abbr="Description">Description</th>
</tr>
<tr>
<td class="lesson-spacing"></td><td class="lesson-spacing"></td><td class="lesson-spacing"></td>
</tr>
<tr>
<td><strong>0</strong></td><td><strong>Arrêt</strong></td><td>Passer dans ce niveau provoque un arrêt de la machine.</td>
</tr>
<tr>
<td><strong>1</strong></td><td><strong>Maintenance</strong></td><td>On a directement accès à un shell, mais quasiment aucun service n\'est lancé. Utile pour le dépannage en cas de problème important.</td>
</tr>
<tr>
<td><strong>2</strong></td><td><strong>Multi-utilisateurs simple</strong></td><td>Plusieurs utilisateurs peuvent se connecter en mode texte. Mais les services sont limités (souvent pas de réseau par exemple).</td>
</tr>
<tr>
<td><strong>3</strong></td><td><strong>Multi-utilisateurs complet</strong></td><td>Tous les services nécessaires sont démarrés et plusieurs utilisateurs peuvent se connecter en mode texte.</td>
</tr>
<tr>
<td><strong>4</strong></td><td><strong>Mode utilisateur</strong></td><td>Généralement non utilisé, il peut être librement utilisé.</td>
</tr>
<tr>
<td><strong>5</strong></td><td><strong>Graphique</strong></td><td>Identique au mode 3, mais les utilisateurs peuvent se connecter en mode graphique et disposer d\'un gestionnaire de fenêtre.</td>
</tr>
<tr>
<td><strong>6</strong></td><td><strong>Redémarrage</strong></td><td>Passer dans ce niveau redémarre la machine.</td>
</tr>
</table>
</div>
<p>
Après le démarrage, le système se trouve dans le mode indiqué par initdefault dans /etc/inittab. Pour pouvoir changer, il existe un outil appellé <strong>telinit</strong>. Il suffit de le lancer en lui passant en paramètre le numéro du niveau souhait. Par exemple&nbsp;:
</p>
<code class="terminal">
&gt; telinit 6
</code>
<p>
Permet de redémarrer la machine.
</p>
<p>
Bien qu\'il y ait des conventions pour ce qui doit être fait dans chaque mode, cela peut être entièrement changé. Mais pour comprendre comment influer sur ce comportement, il faut d\'abord savoir ce que fait le programme /etc/rc.d/rc (ou un autre selon les systèmes et le contenu du fichier inittab).
</p>
<p>
Le programme gérant les niveaux d\'exécution va consulter le contenu du répertoire <strong>/etc/rc.d/rcX.d</strong> (où <strong>X</strong> correspond au numéro du niveau devant être changé). Il y recherche d\'abord tous les exécutables s\'y trouvant et dont le nom commence par la lettre <strong>K</strong> (pour <strong xml:lang="en" lang="en">Kill</strong>) suivie par deux chiffres. Il lance ces programmes en leur passant en paramètre <strong>stop</strong>. Cela correspond aux services qui doivent être arrêté dans ce mode là. Ils sont lancés dans l\'ordre croissant du nombre indiqué après le K, ce qui permet de les ordonner.
</p>
<p>
C\'est ensuite au tour des programmes dont le nom commence par la lettre <strong>S</strong> (pour <strong xml:lang="en" lang="en">Start</strong>) puis également un nombre sur deux chiffres. Ils sont lancés de la même manière que les précédents si ce n\'est que c\'est le paramètre <strong>start</strong> qui est passé.
</p>
<p>
Pour illustrer ceci, voici un contenu possible d\'un de ces répertoires&nbsp;:
</p>
<code class="terminal">
&gt; ls /etc/rc.d/rc3.d<br />
K15httpd<br />
K20nfs<br />
K45named<br />
S10network<br />
S55sshd<br />
S99local<br />
</code>
<p>
Dans ce cas-là, lorsque l\'on passe dans le niveau 3 (soit au démarrage si c\'est celui par défaut, soit ensuite si c\'est l\'utilisateur qui le demande), on arrêtera les services httpd (serveur web), nfs (serveur de fichiers) et named (serveur de noms). Et ensuite seront démarrés les services network (pour la prise en charge du réseau), sshd (serveur de connexion distante sécurisée) et local (qui va lancer des programmes devant être exécuté en fin de démarrage).
</p>
<p>
Comme des programmes peuvent exister dans plusieurs niveaux différents, dans les répertoires /etc/rc.d/rcX.d on trouvera en réalité des <a href="fichiers.php#symlink">liens symboliques</a> pointant vers des fichiers dans le répertoire <strong>/etc/rc.d/init.d</strong>. Ces fichiers sont en réalité des scripts shell et le même sera lancé pour le démarrage ou l\'arrêt. C\'est donc de la responsabilité du script de voir s\'il a été appelé avec le paramètre start ou stop pour savoir quelle action entreprendre.
</p>
<p>
En sachant tout cela, ajouter ou supprimer des services dans un niveau donné revient uniquement à créer ou supprimer des liens symboliques. En reprenant l\'exemple précédent, voici ce qui pourrait être fait&nbsp;:
</p>
<code class="terminal">
&gt; cd /etc/rc.d/rc3.d<br />
&gt; rm S55sshd<br />
&gt; ln -s /etc/rc.d/init.d/ftpd S40ftpd
</code>
<p>
Cela va faire en sorte que dans le niveau 3, le serveur <acronym xml:lang="en" title="Secure Shell" lang="en">SSH</acronym> ne soit plus exéctuté. En revanche un serveur <acronym xml:lang="en" title="File Transfert Protocol" lang="en">FTP</acronym> sera mis en place. Tout cela suppose qu\'un script ftpd soit présent dans le répertoire /etc/rc.d/init.d/ et qu\'il fournisse le service attendu. Les distributions GNU/Linux incluent ce genre de script lorsqu\'un service est installé. L\'utilisateur n\'a donc ensuite qu\'à modifier les liens symboliques.
</p>
'
);

  
$currentPage->addChapter('texte''La connexion en mode texte''
<p>
Après que le système ait terminé les actions à entreprendre dans un niveau donné, un utilisateur peut alors se connecter au système. Lorsque cela se fait en mode texte, un message invite la personne à entrer son nom d\'utilisateur puis son mot de passe.
</p>
<p>
C\'est généralement le programme <strong>login</strong> qui se charge de ça. Une fois le nom et le mot de passe saisis, ce programme va lire le fichier <a href="utilisateurs.php#base">/etc/passwd</a> pour vérifier ces informations.
</p>
<p>
En mode texte, le programme permettant de se connecter va donc lancer le shell choisi par l\'utilisateur. Sur un système GNU/Linux, c\'est par défaut <a href="bash.php">bash</a>.
</p>
<p>
Bash (comme les autres shells) va alors lancer un script dans le répertoire de l\'utilisateur. Il s\'agit dans ce cas de <strong>.bashrc</strong> qui est un fichier caché. C\'est donc dans ce script qu\'un utilisateur peut rajouter des commandes qu\'il souhaite voir exécutées lorsqu\'il se connecte.
</p>
'
);

  
$currentPage->addChapter('graphique''La connexion en mode graphique''
<p>
Lors d\'une connexion en mode graphique, l\'utilisateur doit saisir son nom d\'utilisateur et son mot de passe dans une fenêtre créée par ce que l\'on appelle souvent un <strong>gestionnaire d\'affichage</strong>. Il existe plusieurs de ces programmes. Les plus connus sont <a href="http://docs.kde.org/fr/HEAD/kdebase/kdm/" rel="external">KDM</a> et <a href="http://www.jirka.org/gdm.html" rel="external">GDM</a>. Ils offrent des fonctionnalités équivalentes&nbsp;: Afficher la liste des utilisateurs, vérifier le mot de passe, ... Et surtout lancer ensuite le gestionnaire de fenêtre/bureau choisi par l\'utilisateur.
</p>
<p>
L\'environnement graphique sélectionné va ensuite se lancer. Cela correspondra à lancer le gestionnaire de fenêtre, éventuellement un gestionnaire de bureau, puis d\'autres applications. Une fois que ceci est terminé, il y a la possibilité pour l\'utilisateur d\'avoir des programmes lancé automatiquement.
</p>
<p>
Selon les cas, choisir ces programmes peuvent varier fortement. Toutefois, il existe une organisation, <a href="http://www.freedesktop.org" rel="external" hreflang="en" xml:lang="en" lang="en">freedesktop.org</a>, qui tente d\'uniformiser tout ce qui touche aux environnments graphiques.
</p>
<p>
Très souvent un répertoire sera donc utilisé pour stocker les applications devant être lancées (dans la pratique, il contiendra des liens symboliques). Ce répertoire est <strong>Desktop/Autostart/</strong> qui se trouve dans le répertoire personnel de l\'utilisateur. Il suffira donc d\'y ajouter ce que l\'on souhaite.
</p>
<p>
A noter également que la plupart des gestionnaires de bureau récents inclut aussi un <strong>gestionnaire de session</strong>. Le rôle de ce programme est de sauvegarder l\'état dans lequel est l\'environnement de l\'utilisateur quand il se déconnecte (principalement quelles sont les applications lancées). Il va ensuite le restorer lorsque le même utilisateur se reconnecte sur le système. Cette restoration comprend notamment le lancement des applications qui étaient lancées lors de la fermeture de session précédente.
</p>
'
);

  
$currentPage->display();
?>