EEIJ

Païou : Mandriva Linux depuis 2002. Aujourd'hui, c'est Mageia Linux


Sommaire


Conforme à XHTML 1.0 Strict Conforme à CSS!

On se lasse de tout, sauf de comprendre.
Attribué à Virgile.

Démarrage de Linux avec Sysvinit

Historique

01 octobre 2011 : Cette page a été détachée de la page "Démarrage de l'ordinateur".
1 juillet 2014 : contrôle

Difficulté

Pour : linuxien averti.

 Introduction

La page : Démarrage de l'ordinateur a présenté la partie commune à tous les systèmes d'exploitation.

Dans la présente page, vous trouverez la suite, c'est-à-dire le démarrage de Linux.
Mageia1 utilisait sysvinit pour démarrer le système linux. Les suivantes ont adopté systemd.

 Le noyau linux

Vous avez vu, sur la page précédente, que la noyau linux a pris la relève du BIOS, grâce au chargeur de démarrage (GRUB par exemple).
Le noyau initialise différents composants matériels (processeur, périphériques, carte graphique ...)
En fonction des options que GRUB a passé au noyau, c'est sysvinit qui intervient.
Avec sysvinit, le noyau lance le premier processus : /sbin/init.

Haut

 Le processus /sbin/init

Le noyau exécute donc le processus /sbin/init dont le fichier de configuration est : /etc/inittab.
Le fichier inittab décrit l'ensemble des processus qui doivent être lancés au démarrage du système. Typiquement, une entrée dans le fichier inittab a la forme suivante :
id:runlevels:action:processavec :
id = identifiant de deux caractères,
runlevels : niveaux d'exécution pour lesquels la directive s'applique,
action : décrit l'action à faire,
process : processus (commande) à exécuter.

Ce fichier précise les étapes successives :

  1. indication du niveau d'exécution (généralement runlevel 5) à la ligne : id:5:initdefault:,
  2. exécution du premier fichier d'initialisation, à effectuer avant toute autre chose, à la ligne : si::sysinit:/etc/rc.d/rc.sysinit,
  3. indication de la commande à exécuter, pour un niveau donné, par exemple la ligne l3:3:wait:/etc/rc.d/rc 3, avec
    • l3 : l'identifiant,
    • 3 : le niveau pour lequel il faut exécuter des commandes,
    • wait : signifie que init doit attendre que la commande soit terminée avant de poursuivre,
    • /etc/rc.d/rc 3 : la commande à exécuter est rc avec le paramètre 3.
  4. une fois que la commande rc est achevée, init poursuit la lecture de inittab, avec la ligne ca::ctrlaltdel:/sbin/shutdown -t3 -r now qui indique ce qu'il faut faire si les touches Ctrl Alt Supp sont actionnées
  5. arrêt d'urgence, en cas de coupure de courant, lorsqu'un onduleur permet un arrêt, avec la ligne pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
  6. processus à suivre lorsque le courant est rétabli avant la fin de l'arrêt d'urgence, avec la ligne pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
  7. les 6 lignes suivantes permettent, chacune, de lancer un processus mingetty, pour les niveaux 2 à 5 : ouverture d'un terminal et invite à la connexion.
    respawn signifie que le processus sera relancé chaque fois qu'il se termine (en l'occurrence, chaque fois qu'un utilisateur se déconnecte, le processus est relancé pour qu'un nouvel utilisateur puisse se connecter).
Pour les curieux, survolez : les extraits importants du fichier /etc/inittab

#
id:5:initdefault:
# System initialization.
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

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

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

~~:S:wait:/bin/sh

Haut

 Le fichier /etc/rc.d/rc.sysinit

Il s'agit du premier script lancé par init. C'est un long script qui réalise plusieurs initialisations, soit directement, soit par l'intermédiaire d'autres scripts. Il réalise notamment les opérations suivantes : montage du système de fichiers proc et sys, démarrage de udev et de usbfs, initialisation du clavier, des polices de caractères des consoles, du domaine NIS, du nom d'hôte, contrôle éventuel des systèmes de fichier, montage du répertoire racine et des autres répertoires, activation de l'espace d'échange (swap), exécution d'isapnp, acrivation des modules du noyau, nettoyage du fichier utmp et d'autres fichiers.

Pour les curieux, survolez : le détail de l'exécution du fichier /etc/rc.d/rc.sysinit
  • Le script /etc/rc.d/init.d/functions définit quelques variables (notamment $PATH) et quelques fonctions,
  • le script /etc/sysconfig/network définit quelques variables relatives au réseau,
  • le script /etc/sysconfig/system définit des variables relative à la sécurité,
  • il définit la valeur de $HOSTNAME,
  • il réalise le montage de /proc et /sys,
  • il recherche la présence de /bin/plymouth, le splash de démarrage,
  • il détermine la valeur de $REQUESTED_RUNLEVEL, soit à partir des arguments passés au noyau, sinon dans /etc/inittab, sinon il affecte la valeur 3,
  • il exécute /etc/sysconfig/speedboot (qui définit $SPEEDBOOT=auto dans mon cas)
  • il détermine ensuite la valeur effective de $SPEEDBOOT (yes ou no) en fonction de différents paramètres,
    (speedboot permet de donner plus rapidement la main à l'utilisateur, mais toutes les fonctions ne sont pas encore activées, notamment le réseau.
    pour invalider speedboot, il suffit de remplacer la valeur "auto" par "no" dans /etc/sysconfig/speedboot
    si $SPEEDBOOT=yes, certaines fonctions ne seront démarrées que plus tardivement)
  • si $SPEEDBOOT≠yes, il monte usbfs
  • si la propriété readahead existe (anticipation de lecture sur le disque dur), il l'active
  • il démonte initrd, ce qui libère de la mémoire vive,
  • si $SPEEDBOOT=yes, il démarre udev,
  • il détermine le statut de SELinux,
    (SELinux permet de définir une politique de sécurité d'accès très fine par rapport au système d'exploitation, mais plus délicat à configurer.
    Il n'est pas installé chez moi)
  • il restaure le contexte du répertoire /dev, si SELinux est installé et actif,
  • il initialise splash (en fonction de /etc/sysconfig/bootsplash : taille de l'image = auto),
  • il affiche le splash avec le message 'Démarrage du système... Pressez Echap pour le mode détaillé.'
  • en mode détaillé, il délivre un message d'accueil et un message permettant de continuer l'initialisation de façon interactive,
  • il définit le chemin du chargeur de modules du noyau
  • il arrête l'interpréteur de commandes nash
  • si $SPEEDBOOT≠yes, il démarre udev,
  • il charge les modules de /etc/sysconfig/modules, s'il y en a, éventuellement ceux de /etc/modprobe.preload, et de /etc/modprobe.preload.d/
  • il monte les pseudo terminaux (PTY), le répertoire temporaire dans la mémoire,
  • il configure les paramètres du noyau,
  • si $SPEEDBOOT≠yes, il démarre le terminal braille, si celui-ci est demandé
  • il fixe la valeur de HOSTNAME et éventuellement de NISDOMAIN,
  • si $SPEEDBOOT≠yes, il charge les modules scsi_hostadapter, ide-controller, éventuellement la gestion RAID, la gestion des volumes logiques,
  • il définit $fsckoptions, la configuration de autofsck,
    (autofsck force le contrôle du système de fichiers, notamment lorsque précédemment l'ordinateur n'a pas été arrêté normalement)
  • il détermine si le système de fichiers est un système qui ne peut doit être monté qu'en lecture seule, selon le contenu de /etc/sysconfig/readonly-root
    (en général $READONLY=no)
  • il effectue un contrôle du répertoire racine (actuellement en lecture seule), avec réparation automatique (fsck -T -a -C), puis remonte le répertoire en lecture/écriture
  • il nettoie le fichier /etc/mtab
  • il démarre les périphériques ISAPNP
  • il effectue un contrôle de tous les répertoires (sauf racine et loop), avec réparation automatique (fsck -T -R -A -a -C), puis remonte les répertoires en lecture/écriture
  • il contrôle, puis monte les loopback
  • il vérifie les quotas des utilisateurs, s'il y a lieu
  • il initialise le générateur pseudo-aléatoire
  • il reconfigure la machine, si nécessaire (clavier, réseau )
  • il efface les fichiers devenus inutiles
  • il initialise les journaux de connexion (login)
  • il nettoie ou initialise certains fichiers temporaires
  • il active l'espace d'échange (swap)
  • il optimise éventuellement les disques durs
  • il ajuste les liens symboliques dans le répertoire /boot
  • il enregistre les messages du noyau dans /var/log/dmesg
  • il vérifie si la touche I a été pressée (pour entrer en mode interactif)
  • il vérifie si le démarrage a été demandé en failsafe
  • il vérifie s'il s'agit du tout premier redémarrage après installation, exécute /etc/init.d/mandrake_firstime, si c'est le cas
  • si $SPEEDBOOT=yes, il demande à udev de rechercher les périphériques
  • il exécute /etc/init.d/mandrake_everytime, s'il existe
Haut

 Le fichier /etc/rc.d/rc

Le programme init poursuit l'initialisation de l'ordinateur, en exécutant l'une des lignes qui suivent la ligne si::sysinit:/etc/rc.d/rc.sysinit, dans le fichier /etc/inittab. La ligne choisie dépend de la valeur de la ligne initdefault.
En fait, il exécute la commande /etc/rc.d/rc avec, pour paramètre, la valeur de initdefault. Exemples : /etc/rc.d/rc 3 (mode texte) ou /etc/rc.d/rc 5 (mode graphique).

L'exécution de cette commande consiste notamment à lire le répertoire /etc/rc.d/rcx.d, si x est le paramètre passé à rc (donc /etc/rc.d/rc3.d ou /etc/rc.d/rc5.d pour nos exemples précédents).
Ces répertoires contiennent des fichiers dont le nom commence par une lettre K ou S, suivie d'un numéro d'ordre, lui-même suivi par le nom d'un service.
K signifie qu'il faut arrêter le service (kill), alors que S signifie démarrer le service (start).

Pour les curieux, survolez : le détail de l'exécution du fichier /etc/rc.d/rc
  • il recherche les niveaux : niveau demandé, niveau précédent. Il détermine le niveau à obtenir,
    (pour le démarrage, le niveau demandé correspond à la valeur du paramètre, le niveau précédent = N. Le niveau à obtenir est celui qui est demandé)
    Cependant, si le démarrage est en mode failsafe, c'est init 1 qui est exécuté.
  • il détermine si la touche I a été pressée et délivre un message : mode interactif ou non-interactif,
  • il vérifie s'il existe bien un répertoire /etc/rcx.d correspondant au niveau x demandé,
    (Ce répertoire contient des liens vers tous les scripts qui devront être exécutés, pour le niveau demandé)
  • il fixe les paramètres locaux (langue, monnaie, décimales ...)
  • il vérifie si l'option nopinit a été passée dans le ligne de commande du noyau
    (nopinit signifie que boot lance les processus qui vont suivre, l'un après l'autre, au lieu de les lancer en parallèle)
  • il lance tous les scripts dont le lien commence par la lettre K (kill = stopper)
  • il lance tous les scripts dont le lien commence par la lettre S (start = démarrer)
Haut

 Les répertoires /etc/rc.d/rcx.d

Comme indiqué ci-dessus, ces répertoires permettent de stopper ou de lancer plusieurs commandes ou services. Le contenu exact dépend des applications que vous avez installées sur votre machine.

Toujours pour les curieux, survolez : un extrait du répertoire /etc/rc.d/rc3.d (avec la signification de la commande), pour une installation minimale de Mageia 1

K09dmstopper le gestionnaire graphique
K49netconsole
K99bootlogdstopper le journal du démarrage
S12rsyslog
S29numlockdémarrer le verrouillage numérique
S50network-updémarrer le réseau
S99rc-localajouter, éventuellement, les commandes locales (spécifiques à cette machine)

Le démarrage en mode graphique change très peu par rapport au démarrage en mode texte : Le fichier K09dm est remplacé par S55dm.
Ceci signifie que display manager est démarré au lieu d'être stoppé.

Haut

 Le démarrage en mode texte, dans un terminal virtuel

Le terminal

Il n'est probablement pas inutile de préciser la notion de terminal.
Sa définition est Appareil permettant l'accès à distance à un système informatique. Ceci correspond à un ordinateur central auquel vous accédez à l'aide d'un ensemble "clavier-écran".

On parle maintenant de siège (seat) pour désigner ce matériel : tout le matériel assigné à une place de travail (clavier -souris, écran et éventuellement encore d'autres périphériques).

Le terminal virtuel

Les émulateurs de terminaux (ou terminaux virtuels) sont en fait des logiciels qui simulent le fonctionnement d'un terminal réel.

Le processus de démarrage

Vous avez vu, plus haut, que plusieurs processus mingetty sont lancés vers la fin de inittab. Ils correspondent chacun à un terminal virtuel.
On parle de terminal virtuel, puisque plusieurs terminaux peuvent être ouverts simultanément, alors qu'en fait il n'y a qu'un seul terminal réel (un seul siège).
Le processus mingetty permet à un utilisateur de se connecter en mode texte. Les étapes sont les suivantes.

Haut

 Le démarrage en mode graphique

Système XWindow

Client et serveur X

En mode texte (ou ligne de commande), c'est un terminal virtuel qui permet la saisie au clavier et la visualisation à l'écran.
Vous préférerez sans doute un environnement graphique, avec des fenêtres et avec l'usage de la souris. Il s'appelle Système Xwindow ou en abrégé, Système X.
C'est un ensemble serveur-clients. Un serveur X tourne en permanence et un ou plusieurs clients X peuvent s'y raccorder (locaux ou distants).
Ici, c'est le serveur X qui gère le clavier, la souris et l'écran.
Les clients X, ce sont les applications qui se connectent au serveur X et lui envoient leurs requêtes d'affichages, en utilisant le protocole X.
Le gestionnaire de connexion est un client X.

 Processus de détermination du gestionnaire de connexion utilisé

Pour démarrer en mode graphique, Mageia permet l'installation de plusieurs gestionnaires de connexion.
Le Centre de Contrôle Mageia vous permet alors d'activer le gestionnaire de votre choix (lightdm, xdm, SLiM, lxdm, gdm, kdm ...).

Mais revenons à nos scripts d'initialisation.

prefdm

Le rôle de prefdm est de lire deux variables qui indiquent quels sont : le gestionnaire de connexion et le bureau que vous avez choisis. Pour ceci :

lookupdm

Le rôle de lookupdm est de vérifier si le gestionnaire que vous avez choisi est effectivement présent, et de choisir un gestionnaire par défaut, dans le cas où votre choix pose un problème. Pour ceci :

Ainsi lookupdm a pu définir quel gestionnaire de connexion sera utilisé (celui que vous avez choisi ou un gestionnaire de remplacement) et a trouvé la commande à exécuter, pour lancer le gestionnaire.
Cette commande sera l'une des suivantes : /usr/bin/xdm, /usr/bin/slim, /usr/sbin/lxdm, /usr/sbin/gdm ou /usr/bin/kdm, avec un argument -nodaemon.

Gestionnaire de connexion XDM (sans autologin) Travaux

Cette page étant déjà suffisamment longue, vous trouverez le gestionnaire XDM Cliquez.

Gestionnaire de connexion LXDM (avec ou sans autologin) Travaux

Cette page étant déjà suffisamment longue, vous trouverez le gestionnaire LXDM Cliquez.

Gestionnaire de connexion lightdm (avec ou sans autologin) Travaux

Cette page étant déjà suffisamment longue, vous trouverez le gestionnaire lightdm Cliquez.

Haut