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".
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.
Mageia 1 utilise sysvinit pour démarrer le système linux.
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 sysvint qui intervient.
Avec sysvinit, le noyau lance le premier processus : /sbin/init.
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 :
- indication du niveau d'exécution (généralement runlevel 5) à la ligne : id:5:initdefault:,
- exécution du premier fichier d'initialisation, à effectuer avant toute autre chose, à la ligne : si::sysinit:/etc/rc.d/rc.sysinit,
- 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.
- 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
- 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"
- 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"
- 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
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
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)
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é.
Le démarrage en mode texte, dans un terminal virtuel
Le terminal, le terminal virtuel
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".
Avec votre micro-ordinateur, le terminal désigne également cet ensemble "clavier-écran", mais il n'est plus à distance.
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.
Le processus mingetty permet à un utilisateur de se connecter en mode texte. Les étapes sont les suivantes.
- mingetty initialise un terminal virtuel,
(Vous pouvez accéder à un terminal avec les touches Ctrl+Atl+F2, Ctrl+Alt+F3 ...)
- il affiche l'invite de connexion. L'utilisateur entre son nom de connexion,
- il lance le programme bin/login en lui fournissant le nom saisi,
- login demande le mot de passe. L'utilisateur entre son mot de passe,
- login vérifie le nom de l'utilisateur et son mot de passe,
- si le nom et le mot de passe associé sont corrects, l'utilisateur peut travailler en mode texte ou même passer en mode graphique avec la commande startx
Pour avoir le processus de lancement,
Le démarrage en mode graphique
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é
En mode de démarrage 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 (xdm, SLiM, lxdm, gdm, kdm ...).
Mais revenons à nos scripts d'initialisation.
- grâce au fichier de configuration inittab, init lance différents programmes, dont /etc/rc.d/rc. Le script rc est lancé avec l'argument 5,
- le lancement du gestionnaire de connexion dépend du fichier /etc/rc.d/rc5.d/S55dm,
- S55dm est un lien qui conduit à l'exécution de /etc/rc.d/init.d/dm avec l'argument start,
- avec l'argument start, dm exécute /etc/X11/prefdm et envoie un message disant que le gestionnaire est lancé.
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 :
- /etc/X11/prefdm vérifie si autologin est activé (plusieurs conditions doivent être remplies).
- si autologin est activé et si le gestionnaire est XDM, prefdm exécute des programmes spécifiques, sans continuer la suite du script.
- dans tous les autres cas, prefdm lit le fichier /etc/sysconfig/desktop qui définit les variables $DISPLAYMANAGER et $DESKTOP.
Ces deux variables peuvent être modifiées avec le Centre de Contrôle
$DISPLAYMANAGER peut prendre les valeurs : XDM, xdm, SLiM, slim, LXDM, lxdm, GNOME, gdm, KDM, kdm, selon la configuration faite par le Centre de Contôle.
- /etc/X11/prefdm en déduit une variable $dm dont la valeur peut être : XDM, SLiM, LXDM, GNOME, KDM
- ensuite, prefdm exécute le script /etc/X11/lookupdm, avec la valeur de la variable $dm comme argument.
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 :
- lookupdm vérifie, dans le répertoire /usr/share/X11/dm.d/, s'il existe un fichier *.conf, contenant une ligne NAME=(valeur de $dm)
Par exemple, si $dm=XDM, il existe un fichier 30xdm.conf avec une ligne NAME=XDM
- si ce fichier est trouvé, lookupdm recherche une ligne EXEC= ... dans ce fichier
Dans l'exemple précédent, la ligne est EXEC=/usr/bin/xdm
- lookupdm vérifie ensuite que la commande donnée par EXEC= existe réellement et si elle est exécutable
- si tout ceci est vérifié, lookupdm termine son exécution et transmet la valeur au script prefdm
- par contre, si ce n'est pas vérifié, lookupdm recherche le premier fichier valide du répertoire /usr/share/dm.d/ et transmet la valeur de la ligne EXEC à prefdm.
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)
Cette page étant déjà suffisamment longue, vous trouverez le gestionnaire XDM ici .
Gestionnaire de connexion LXDM (avec ou sans autologin)
Cette page étant déjà suffisamment longue, vous trouverez le gestionnaire LXDM ici .