Démarrage du système

État : {a_reli}

Retour au document principal

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 :

Remarques :

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

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.

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 ?
  2. Activez les touches Ctrl + Alt + Suppr uniquement pour le niveau d'exécution 3.
  3. Ajoutez une nouvelle invite de connexion sur tty7.

    Comment pouvez-vous forcer init à relire sa configuration ?

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

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

  6. 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é.

  7. 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 350 fois