## Inscrivez ici le titre du chapitre
= Démarrage du système =

##
## États possibles du document
##
## {a_trad} -> à traduire (disponible)
## {traduc} -> en cours de traduction
## {a_reli} -> à relire
## {relect} -> en cours de relecture
## {publie} -> publié (à jour)
## {a_revi} -> à réviser (à mettre à jour)
##

'''État : ''' {a_reli}

[[../|Retour au document principal]]

<<TableOfContents()>>


== Présentation ==

La connaissance du processus de démarrage est très utile pour résoudre des problèmes qui touchent au matériel ou aux tâches d'administration.

Nous commencerons à nous intéresser au rôle du programme '''init''' ainsi qu'à son fichier de configuration '''/etc/inittab'''. Ensuite nous observerons plus précisément le rôle de LILO au démarrage. Enfin, nous résumerons le processus de démarrage. Le document [[http://traduc.org/Guides_pratiques/Suivi/From-PowerUp-To-Bash-Prompt-HOWTO/Document|De la mise sous tension à l'invite de commande de Bash]] de Greg O'Keefe ainsi que la page de manuel boot(7) sont d'excellentes ressources pour ce module.

== Comprendre les niveaux d'exécution ==

Contrairement à la plupart des systèmes d'exploitation non-UNIX qui n'ont que deux modes de fonctionnement (allumé et éteint), les systèmes UNIX, y compris Linux, utilisent différents niveaux d'exécution, par exemple "maintenance", "multi-utilisateur", etc. Les niveaux d'exécutions sont numérotés de 0 à 6.

||||'''Niveaux d'exécution Linux'''||
||'''Niveau d'exécution'''||'''Description'''||
||0||éteint proprement la machine||
||1||mode mono-utilisateur||
||2||mode multi-utilisateur, mais ne lance pas NFS||
||3||mode multi-utilisateur complet||
||4||non défini et généralement inutilisé||
||5||comme le niveau 3, mais lance le gestionnaire d'affichage||
||6||redémarre proprement la machine||

Les deux commandes '''init''' et '''telinit''' permettent de passer d'un niveau d'exécution à un autre. Souvenez-vous qu'init est le premier programme lancé au démarrage après le chargement du noyau. Le PID de '''init''' est toujours 1.

'''Illustration''' : Le PID de init est toujours 1. :

{{{
[root@nasaspc /proc]# ps uax |grep init
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root          1      0.2       0.0          1368   52    ?           S        20:17       0:04    init [3]
}}}

À chaque niveau d'exécution, le système arrête et lance un ensemble de services spécifiques. Ces programmes se trouvent dans '''/etc/rc.d/init.d'''('''NdT''' : système RedHat, '''/etc/init.d/''' autrement). Ce répertoire contient tous les services que le système peut lancer. Une fois ces programmes lancés, ils restent actifs jusqu'à ce qu'un autre niveau d'exécution soit appelé. On appelle ces services également démons.

'''Illustration''' : liste de services typiques dans /etc/init.d

Listing 3: List of typicalservices (or daemons) in /etc/rc.d/init.d/

{{{
ls /etc/init.d
acpid           checkfs.sh        dbus             hwclock.sh      module-init-tools      network-manager  reboot          ssh                   urandom
alsa-utils      checkroot.sh      exim4            ifupdown        mountall-bootclean.sh  nfs-common       rmnologin       stop-bootlogd         virtualbox-ose
anacron         console-setup     fancontrol       ifupdown-clean  mountall.sh            portmap          rsync           stop-bootlogd-single  x11-common
atd             cpufrequtils      fuse             kbd             mountdevsubfs.sh       pppd-dns         rsyslog         sudo
avahi-daemon    cron              gdm              kerneloops      mountkernfs.sh         procps           saned           udev
binfmt-support  cryptdisks        hal              keyboard-setup  mountnfs-bootclean.sh  pwrkap           screen-cleanup  udev-mtab
bluetooth       cryptdisks-early  halt             killprocs       mountnfs.sh            rc               sendsigs        umountfs
bootlogd        cryptmount        hdparm           lm-sensors      mountoverflowtmp       rc.local         single          umountnfs.sh
bootlogs        cryptmount-early  hostname.sh      loadcpufreq     mtab.sh                rcS              skeleton        umountroot
bootmisc.sh     cups              hwclockfirst.sh  lvm2            networking             README           slim            unattended-upgrades

}}}

{{{#!wiki note
'''Remarque :'''

 Il est possible d'arrêter ou de lancer manuellement les démons dans '''/etc/init.d'''. Par exemple, pour relancer le serveur apache, vous pouvez taper :

 '''/etc/init.d/apache2 restart'''
}}}

Lorsque vous travaillez avec les niveau d'exécution, vous définissez un ensemble de programmes à lancer et un autre ensemble de programmes à arrêter. Disons que vous souhaitez entrer dans le niveau d'exécution 2, vous taperiez :

{{{
/sbin/init 2
}}}

Cette commande force '''init''' à lire son fichier de configuration '''/etc/inittab''' pour rechercher ce qu'il doit faire à ce niveau d'exécution.

Dans notre cas particulier, en assumant que nous passons au niveau d'exécution 3, la ligne suivante de '''inittab''' est exécutée :

{{{
l2:wait:/etc/init.d/rc 2
}}}

Si vous jetez un œil à '''/etc/inittab''', la commande '''/ec/init.d/rc N''' lance tous les services de '''/etc/rc2.d''' qui commencent par un '''S''' (start) et arrête tous les services qui commencent par un '''K''' (kill). Ces services sont des liens symboliques pointant vers les scripts rc dans '''/etc/init.d'''.

Si vous ne souhaitez pas qu'un processus soit lancé à un niveau d'exécution donné N, vous pouvez supprimer le lien symbolique dans /etc/rcN.d commençant par un '''S'''.

== Les joies d'inittab ==

Comme promis, jetons un œil à '''/etc/inittab'''

Ce fichier suit la structure suivante :

{{{
id : runlevel : action : command
}}}


'''Illustration''' : un exemple de fichier inittab (RedHat)

{{{
id:3:initdefault:
# Initialisation du système.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
-----------------------snip----------------------------------
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
-----------------------snip----------------------------------
# Lancement les consoles virtuelles( getty) dans les niveaux d'exécution standards
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Lancement de xdm au niveau d'exécution 5
x:5:respawn:/etc/X11/prefdm –nodaemon
}}}

Le champ '''id''' peut contenir ce que l'on veut. Si un niveau d'exécution est spécifié, la commande et l'action requise est exécutée lorsque le système entre dans le niveau d'exécution. Si aucun chiffre n'est spécifié, la ligne est exécutée à chaque niveau d'exécution.

Éléments notables de '''/etc/inittab''' :

 * '''niveau d'exécution par défaut''' : paramétré au niveau du fichier avec pour id '''id''' et pour action '''initdefault'''. Remarquez qu'aucune commande n'est précisée. Cette ligne indique simplement à '''init''' le niveau d'exécution par défaut.

 * '''premier programme appelé par init''' : /etc/rc.d/rc.sysinit (/etc/init.d/rcS sur Debian). Ce script définit les valeurs par défaut pour le système, comme la variable '''PATH''', détermine si le réseau est autorisé, le nom d'hôte, etc.

 * '''les services du niveau d'exécution par défaut''' : si le niveau d'exécutin par défaut est 3, seule la ligne '''l3''' est exécutée. L'action est '''wait''' : aucun autre programme n'est lancé jusqu'à ce que l'ensemble des services du niveau d'exécution 3 soient lancés.

 * '''les consoles virtuelles (getty)''' : les lignes avec les id 1 à 6 lancent les consoles virtuelles. C'est ici que vous pouvez changer le nombre de consoles virtuelles.

 * '''Niveau d'exécution 5''' : la dernière ligne de '''inittab''' lance XWindow si le niveau d'exécution 5 est atteint.

'''Remarques''' :

 * Vous pouvez mettre en place une connexion distante par modem dans '''inittab'''. Si votre modem est connecté sur '''/dev/ttyS1''', la ligne suivante permettra des connexions externes (données, par par fax) après 2 sonneries :

 {{{
S1:12345:respawn:/sbin/mgetty -D -x 2 /dev/ttyS1'''
}}}

 * Lorsque vous modifiez '''/etc/inittab''', vous devez forcer '''init''' à relire son fichier de configuration. On le fait avec la commande suivante : 

 {{{
/sbin/init q
}}}

== LILO : Linux boot Loader, le chargeur d'amorçage de Linux ==

Les informations nécessaires au chargeur d'amorçages sont mises à jour par '''/sbin/lilo''' (le programme d'installation du chargeur d'amorçage) qui lit le fichier de configuration '''/etc/lilo.conf'''.

Au démarrage, LILO a besoin de deux informations essentielles : où se trouve le noyau (généralement dans /boot) et où se trouve la partition racine. 

LILO n'a aucune compréhension du fonctionnement du système de fichiers ou d'où se trouvent les choses. Il ne comprend que des adresses sur les disques physiques. Si vous installez une seconde distribution Linux B qui ne fonctionnait pas au moment du paramétrage de lilo.conf, vous devez monter la partition '''/boot''' de B. Vous devez également savoir où se trouve la partition racine de B.


=== Paramètres d'initialisation ===

De même, LILO peut transmettre les paramètres de niveau d'exécution à init. Une fois le noyau chargé, '''init''' prend en charge le processus de démarrage. Sans paramètre, '''init''' lance le niveau d'exécution par défaut indiqué dans '''/etc/inittab'''.

'''Illustration''' : instruction de niveau d'exécution transmise à init à l'invite de LILO

{{{
Boot: linux s
}}}

=== Paramètres du noyau ===

{{attachment:parametres-noyau.png|schéma présentant un noyau monolithique et un noyau modulaire chargeant les modules de /lib/modules/`uname -r`}}

On peut également transmettre des paramètres au noyau à l'invite de LILO ou les définir dans '''/etc/lilo.conf''' avec l'option '''append'''.

'''Exemples''' :
{{{
append= "pci=bisoirq"
append=”ram=16M”
append=”/dev/hdc=ide-scsi”   (pour les graveurs de CDs)
}}}

Les paramètres que l'on transmet au démarrage au noyau sont à destination des modules et aident généralement à la détection du matériel. 

Les messages du noyau au démarrage sont stockés dans le journal '''/var/log/dmesg''' par défaut. On peut lire ce fichier ou l'envoyer vers '''stdout''' avec la commande '''/bin/dmesg'''.

== De la mise sous tension à l'invite de commande de Bash ==

Nous pouvons désormais nous plonger dans les étapes du démarrage d'un système Linux.

Si un disque disque virtuel en mémoire (ram disk), il est chargé en premier. Les modules sont insérés à partir du disque virtuel en mémoire.

Le noyau est ensuite chargé à partir du média spécifié dans la configuration de LILO. Il est décompressé pendant son chargement.

Ensuite, le noyau monte le système de fichiers racine (/), en suivant la configuration de LILO (en général en lecture seule).

À ce moment, les programmes essentiels de '''/bin''' et '''/sbin''' sont accessibles.

Le noyau charge '''init''', le premier processus de l'espace utilisateur.

Init suit les instructions de '''/etc/inittab'''. En particulier, il lance '''rc.sysinit''' (rcS pour Debian). Le contrôle d'intégrité des systèmes de fichiers ('''fsck''') est effectué en se référant aux entrés de '''/etc/fstab'''.

Puis '''init''' entre dans le niveau d'exécution par défaut, lance les consoles virtuelles, le processus du démarrage est terminé.

L'invite de connexion est gérée par les "getty" sur les consoles virtuelles tty. Lorsque l'utilisateur tape son nom d'utilisateur et appuie sur Entrée, le système appelle la commande '''/bin/login''', qui demande le mot de passe à l'utilisateur. L'utilisateur entre son mot de passe et appuie sur Entrée.

Le mot de passe est comparé au mot de passe de '''/etc/passwd''' ou de '''/etc/shadow'''.


{{attachment:processus-demarrage.png|schéma présentant le processus de démarrage}}

== Exercices ==

Jetez un œil à la page de manuel '''boot(7)'''. Elle couvre la plupart de ce que nous venons de voir dans ce module.

 1. Changez le niveau d'exécution du système par défaut à 3 puis à 5.
 Comment pouvez-vous connaître le niveau d'exécution en cours ?

 1. Activez les touches Ctrl + Alt + Suppr uniquement pour le niveau d'exécution 3.

 1. Ajoutez une nouvelle invite de connexion sur tty7. 
 Comment pouvez-vous forcer '''init''' à relire sa configuration ?

 1. Utilisez '''dmesg''' pour afficher votre type de carte réseau

 1. Étudiez les différences entre ''''shutdown''', '''halt''' et '''reboot'''.
 Quelle option de '''shutdown''' force un '''fsck''' au prochain démarrage ?

 1. Utilisez les outils '''chkconfig''' et '''ntsysv''' pour désactiver le démon ssh aux niveaux d'exécution 2, 3, 4, et 5.
 Vérifiez que les liens symboliques des répertoires rc2.d, rc3.d, etc. ont changé.

 1. Redémarrez le système. Donnez le bon paramètre '''init=''' au démarrage pour ignorer '''/sbin/init''' et lancer une simple session bash.

~-Page consultée <<Hits>> fois-~