Créer un site internet

Travaux sur GRUB, init, niveaux d'exécution

Réinstallation simple depuis un système actif

La commande grub-install permet de réinstaller GRUB. Elle fonctionne à chaud.

Commande : grub-install --root-directory=rep_noyau disque_cible

Options et paramètres :

rep_noyau : facultatif : si le noyau n'est pas sur le filesystem principal, désigne le répertoire monté où se trouve le noyau.

disque_cible : le fichier du bloc spécial qui représente le disque sur le MBR duquel GRUB doit être installé.

Réinstallation depuis un système non démarré

La solution la plus fiable pour réinstaller un gestionnaire de démarrage GRUB sur un système qui ne peut plus démarrer consiste à charger sur l'ordinateur un livre-CD et de réaliser la réinstallation de GRUB depuis ce livre-CD. La distribution choisie pour le livre-CD importe peu, Knoppix ou Ubuntu feront l'affaire.

Il suffit ensuite, après être entré dans le mode interactif de GRUB (il suffit de taper grub depuis un terminal) de préciser le disque qui devra recevoir le gestionnaire de démarrage, et de lancer la commande setup qui réalisera l'installation proprement dite du gestionnaire.

Installation de GRUB 

  • Depuis un terminal du livre-CD actif, chargez GRUB en mode interactif en tapant grub.
  • Dans le shell GRUB,  précisez la partition qui héberge le fichier noyau en tapant root(hdx,y) où x représente le numéro de disque et y le numéro de partition, la numérotation commençant à zéro.
  • Tapez ensuite setup(hdx) où x représente le numéro de disque sur lequel GRUB doit être installé.
  • Tapez quit pour quitter le mode interactif de GRUB.
  • Selon le cas, vérifiez ou créez le fichier /boot/grub/menu.lst afin qu'il référence correctement le ou les noyaux à charger.

Maintenance et mode single

Passage en mode single planifié 

Le mode single permet de réaliser des opérations de maintenance sur un système. Dans ce mode de fonctionnement, seule la connexion du compte root est possible, et presque aucun service n'est démarré. Le système est donc dans un état le plus stable possible, et aucune interaction malencontreuse n'est à redouter car l'administrateur travaille seul.

Passage en mode single

telinit 1

(voir Le processus init et les niveaux d'exécution)

Ouverture d'un shell en cas d'échec au démarrage 

Il est possible de passer un paramètre au noyau lui indiquant un processus à démarrer. Si ce processus est un shell, il permet d'ouvrir une session interactive et de modifier les fichiers locaux et démarrer manuellement des services.

Il suffit d'éditer la ligne chargeant le noyau dans GRUB et d'ajouter le paramètre init=/bin/bash.

Ouverture d'un shell directement au démarrage 

kernel fichier_noyau root=fs_racine ro init=/bin/bash

Où fichier_noyau représente le noyau normalement chargé, et fs_racine, le système de fichiers racine normalement chargé. Seul le paramètre init=/bin/bash doit être ajouté à la ligne de commande.

Procédure d'ouverture de shell au démarrage 

  • Démarrer physiquement le système.
  • Modifier le chargement par défaut en tapant la touche depuis la liste des systèmes disponibles.
  • Ajouter le paramètre init/bin/bash à la fin de la ligne kernel.
  • Charger le noyau en tapant la touche b.

Remarque : l'appel d'un shell directement depuis le noyau permet d'accéder au système sans avoir à s'authentifier. Cette procédure montre que l'accès physique à une machine sensible doit toujours être protégé. Il est certe possible de protéger GRUB de l'édition par un mot de passe, mais l'accès par un média amovible au filesystem reste un danger.

Le processus init et les niveaux d'exécution

Les niveaux d'exécution 

Le fonctionnement d'un système Linux est régi par des niveaux d'exécution. Un système Linux est toujours dans un niveau d'exécution quelque soit son activité.

La gestion des niveaux d'exécution consiste à déterminer quel doit être le comportement du système quand il entre dans un niveau donné.

Qu'est-ce qu'un niveau d'exécution ?

C'est un niveau fonctionnel dans lequel la liste des services à arrêter ou démarrer à été déterminé.

Le niveau 0

Le système est arrêté. Ce niveau doit être configuré, il faut gérer ce qui se passe quand le système entre au niveau 0.

Le niveau 1 ou single

Il est réservé aux opérations de maintenance et ne permet que la connexion du compte root. La plupart des services sont arrêtés, le système a une activité minimum autorisant les opérations de maintenance.

Sur la plupart des systèmes :

Le niveau 2

Non utilisé.

Sur les systèmes Debian et dérivés, ce niveau est le niveau fonctionnel par défaut.

Le niveau 3

Il est fonctionnel, tous les services sont demarrés mais l'interface graphique n'est pas disponible.

Le niveau 4

Non utilisé.

Le niveau 5

Il est fonctionnel, tous les services sont disponibles et l'interface graphique également.

Il n'est pas utilisé sur les systèmes Debian et dérivés.

Le niveau 6

Temporaire par définition, le niveau 6 est celui d'un système en train de redémarrer. La configuration consiste à déterminer quels services doivent être arrêtés dans cette phase de fonctionnement. Après le redémarrage, un niveau d'exécution s'appliquera, en général le niveau par défaut, et les services associés à ce niveau seront demarrés.

Configuration du processus init

Les niveaux d'exécution déterminent une liste de services à démarrer ou arrêter. Comment le système va prendre connaissance de son niveau d'exécution et des services referencés.

Le premier processus démarré sur le système 

En premier c'est le processus init. Il porte un PPID inhabituel (0) et il est le père de nombreux autres processus.

C'est le premier service lancé au chargement du noyau, il a un rôle privilégié,  son comportement est régi par le fichier de configuration : /etc/inittab.

Le fichier inittab

Selon les distributions, ce fichier revêt des contenus très différents mais sa structure est toujours là même.

Structure du fichier /etc/inittab ( 4 champs)

identifiant : niveau : mode_action : commande

identifiant : chaîne alphanumérique d'un ou deux caractères. Identifie la ligne. Pas d'autres contraintes que d'éviter d'avoir deux lignes avec le même identifiant.

niveau : le ou les niveaux d'exécution (en chiffres) pour laquelle la ligne est pertinente.

mode_action : à choisir parmi quelques mots-clés, définit la façon dont la commande du quatrième champ sera exécutée.

commande : la commande à exécuter aux niveaux définis dans le deuxième champ selon le mode d'action du troisième champ.

Modes d'actions courants 

initdefault : défini le niveau d'exécution du système par défaut, le quatrième champ est vide.

sysinit : sert à exécuter des scripts à l'initialisation du système, indépendamment du niveau d'exécution. Il n'admet pas de valeur pour le deuxième champ.

wait : exécute la commande du quatrième champ (souvent un script) et attend la fin de cette exécution pour passer aux lignes suivantes du fichier inittab.

respawn : exécute la commande du quatrième champ, et laissé tourner le processus à l'arrière plan. Passe ensuite aux lignes suivantes du fichier inittab. Si le processus appelé s'arrête, init le relancera systématiquement.