Démarrage du système
État :
Sommaire
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 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
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
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.
Exercices
Jetez un œil à la page de manuel boot(7). Elle couvre la plupart de ce que nous venons de voir dans ce module.
- 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 ?
- Activez les touches Ctrl + Alt + Suppr uniquement pour le niveau d'exécution 3.
- Ajoutez une nouvelle invite de connexion sur tty7.
Comment pouvez-vous forcer init à relire sa configuration ?
Utilisez dmesg pour afficher votre type de carte réseau
Étudiez les différences entre 'shutdown, halt et reboot. Quelle option de shutdown force un fsck au prochain démarrage ?
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é.
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 499 fois