Thursday, September 29, 2016

CentOS - à la ligne de commande - 10 : les modes de secours et d'urgence

Dans mon billet précédent, j'ai fait démarrer mon serveur CentOS à partir du média d'installation (un fichier .iso en l'occurrence) afin de changer un mot de passe root que j'aurais oublié. Nous pourrions sans doute recourir à cette méthode pour effectuer d'autres opérations. Je dois penser que l'option de démarrage "Rescue a CentOs system" (Secourir un système CentOS) permet de faire autre chose que la seule ré-initialisation du mot de passe root.

Il semble donc que, dans les cas les plus graves, nous puissions faire démarrer le système à partir du média d'installation et tenter une réparation, peut-être en remplaçant des fichiers endommagés ou supprimés par mégarde.

Mais il paraît que d'autres options existent pour des cas un peu moins graves. A ce stade de mes recherches sur Linux (et CentOS en particulier), j'en connais deux :

  1. le mode de secours (Rescue mode). C'est l'équivalent du mode mono-utilisateur (Single-user mode).
  2. le mode d'urgence (Emergency mode)

En fait, je crois que tous les deux sont des modes "mono-utilisateur", ce qui signifie, en substance, qu'un seul utilisateur a la capacité (ou le "droit") d'ouvrir une session : root.

Le mode mono-utilisateur correspond à un des sept "niveaux de fonctionnement" ou "run levels" en version (anglaise) originale. Les niveaux de fonctionnement (que je viens de découvrir) constituent un sujet à part que je compte examiner dans un billet à venir (peut-être même le prochain).

Note : je présente ce qui suit sous toute réserve dans la mesure où je ne fais que commencer à acquérir des notions de gestion du système CentOS. Grâce à Internet, j'ai accès à une surabondance d'informations qui sont plus ou moins exactes. Il arrive parfois que je me heurte à des incertitudes : les interfaces réseau sont-elles activées en mode mono-utilisateur? Non (du moins, pas par défaut). Peuvent-elles l'être ? Il semble que oui. Alors comment ?


***


Voici comment se présentent ces deux options de démarrage...


Le mode de secours


  • C'est un mode "mono-utilisateur"
  • Il essaie de monter tous les systèmes de fichiers locaux (Il y a plus qu'un seul? Je n'ai pas encore étudié de près cet aspect de CentOS).
  • Il démarre des services système importants (mais pas tous ?).
  • Par contre, les interfaces réseau ne sont pas activées (par défaut).


Mais comment recourir au mode de secours ?

Nous mettons le serveur sous tension et lorsque GRUB affiche le choix des systèmes d'exploitation que nous pouvons faire démarrer, nous appuyons sur la touche "e" :



Ce qui nous amène à cet écran :



En manipulant les flèches, nous devons faire descendre le curseur jusqu'à la ligne qui commence par "linux16".

Note: si nous avons affaire à UEFI, ce sera plutôt "linuxefi".

Et nous ajoutons le texte...

systemd.unit=rescue.target



Nous pourrions ajouter "single", "s" ou "1" au lieu de systemd.unit=rescue.target. C'est plus court et l'effet est le même.

Quoi qu'il en soit, nous appuyons sur Ctrl+x pour passer en mode de secours.

Chose bizarre, nous sommes accueillis avec la mention "Welcome to emergency mode!". Je croyais que nous serions plutôt en "mode de secours" (rescue mode)?



Deux remarques :

  1. Nous devons saisir le mot de passe de root qui protège l'accès au mode de secours. Nous ne pouvons pas utiliser celui-ci pour contourner le mot de passe.
  2. Si nous exécutons la commande "runlevel", le résultat est "N 1", ce qui équivaut au mode mono-utilisateur.



Le mode d'urgence

Il fournit un environnement "le plus minimaliste possible", apte à permettre le dépannage du système dans des cas où même le mode de secours ne réussirait pas.

  • C'est aussi un mode "mono-utilisateur".
  • Il monte seulement le système de fichiers root - et seulement en lecture seule. 
  • Il démarre seulement une poignée de services "essentiels".
  • Comme pour le mode de secours, les interfaces réseau ne sont pas activées.

A priori, nous suivrions exactement les mêmes étapes pour le mode d'urgence sauf qu'au lieu de "systemd.unit=rescue.target" nous mettrions plutôt "systemd.unit=emergency.target".

Note: nous pourrions mettre encore "emergency" pour faire démarrer en mode d'urgence.

A première vue, rien ne différencie le mode de secours du mode d'urgence. Nous avons le même message d'accueil en anglais "Welcome to emergency mode!".

Toutefois, je constate déjà deux différences :

  1. Le démarrage semble plus rapide avec le mode d'urgence, ce qui serait logique : moins de services sont lancés, et seul le système de fichiers root.
  2. En mode de secours, la commande "runlevel" donne "N 1" tandis qu'en mode d'urgence le résultat est "unknown" (inconnu).

Note: je me sers du terme "run level" (niveau de fonctionnement) mais s'agissant de CentOS 7, il convient de préciser que cette dernière version remplace le concept de "niveaux de fonctionnement" par "cibles" (target en anglais). Pourtant, les commandes et les paramètres qui renvoient aux niveaux de fonctionnement semblent bel et bien fonctionner encore, par example la commande "runlevel" ou le numéro "1" qu'on peut utiliser au lieu de "systemd.unit=rescue.target".

En effet, le démarrage est effectivement plus ou moins rapide selon les différents modes. Nous pouvons l'observer dans le détail avec la commande systemd-analyze :

Niveau de fonctionnement 3 (Run level 3)




Mode de secours / Niveau de fonctionnement 1 (Run level 1)



Mode d'urgence



Nous pouvons comparer le nombre de services en cours d'exécution avec la commande systemctl (et utiliser grep pour isoler seuls les services en exécution).

Niveau de fonctionnement 3 (Run level 3)




Mode de secours / Niveau de fonctionnement 1 (Run level 1)



Mode d'urgence




***

Que faire ensuite ? Cela dépend des résultats de notre analyse de la panne. Une fois dans tel ou tel mode, les mesures à prendre seraient différentes selon le type de panne et dépassent le cadre de ce billet.

Cependant, en réponse à une question que je me suis posée plus haut, je voudrais vérifier s'il est possible de faire démarrer un service, le service "network" (réseau), en mode de secours. Allons voir...


Commentaire :

  • Nous sommes bien en mode de secours (niveau de fonctionnement 1).
  • Le service réseau (network.service) n'est pas activé. Impossible d'envoyer un ping.
  • J'arrive à faire démarrer le service avec la commande systemctl start network.service
  • Il est maintenant possible d'envoyer un ping à l'extérieur.

En mode d'urgence, je n'ai pas pu faire démarrer le service "network".


***

Ressources:

Guide de l'administrateur système - RHEL 7 (section sur les modes secours et urgence) :




No comments:

Post a Comment