Init est le parent de tous les processus Linux. Il s'agit du premier processus à démarrer lorsqu'un ordinateur démarre, et il s'exécute jusqu'à ce que le système s'éteigne. C'est l'ancêtre de tous les autres processus.
Son rôle principal est de créer des processus à partir d'un script stocké dans le fichier / etc / inittab. Ce fichier stocke généralement les entrées qui amènent Init à générer gettys sur chaque ligne que les utilisateurs peuvent se connecter. Il contrôle également les processus autonomes requis par un système particulier.
Niveaux d'exécution
UNE niveau d'exécution est une configuration logicielle du système qui ne permet l'exécution que d'un groupe de processus sélectionné. Les processus générés par Init pour chacun de ces niveaux d'exécution sont définis dans le fichier / etc / inittab. Init peut être dans l'un des huit niveaux d'exécution suivants: 0 à 6 et S ou s. Le niveau d'exécution est modifié en demandant à un utilisateur privilégié d'exécuter Telinit, qui envoie les signaux appropriés à Init, lui indiquant le niveau d'exécution auquel il convient de procéder.
Les niveaux d'exécution 0, 1 et 6 sont réservés. Le niveau d'exécution 0 est utilisé pour arrêter le système, le niveau 6 est utilisé pour redémarrer le système et le niveau 1 pour activer le système en mode mono-utilisateur. Le niveau d'exécution S n'est pas destiné à être utilisé directement mais par les scripts qui sont exécutés lors de la saisie du niveau d'exécution 1.
Les niveaux d'exécution 7 à 9 sont également valides, bien qu'ils ne soient pas bien documentés car les variantes Unix "traditionnelles" ne les utilisent pas. Les niveaux d'exécution S et s sont les mêmes. En interne, ce sont des alias pour le même niveau d'exécution.
Démarrage
Une fois que Init a été appelé en tant que dernière étape de la séquence de démarrage du noyau, il recherche le fichier / etc / inittab pour savoir s’il existe une entrée du type. initdefault . L'entrée initdefault détermine le niveau d'exécution initial du système. S'il n'y a pas d'entrée de ce type (ou pas de / etc / inittab), un niveau d'exécution doit être entré sur la console système.
Le niveau d'exécution S ou s met le système en mode mono-utilisateur et ne nécessite pas de fichier / etc / inittab. En mode mono-utilisateur, un shell racine est ouvert sur / dev / console.
Lorsque vous entrez en mode mono-utilisateur, init lit les états ioctl de la console dans /etc/ioctl.save. Si ce fichier n'existe pas, init initialise la ligne à 9600 bauds et avec les paramètres CLOCAL. Lorsque init quitte le mode mono-utilisateur, il stocke les paramètres ioctl de la console dans ce fichier afin de pouvoir les réutiliser pour la prochaine session mono-utilisateur.
Lorsque vous entrez pour la première fois en mode multi-utilisateur, Init exécute les entrées boot et bootwait afin de permettre aux systèmes de fichiers de monter avant que les utilisateurs ne puissent se connecter. Toutes les entrées correspondant au niveau d'exécution sont ensuite traitées.
Lors du démarrage d'un nouveau processus, Init vérifie d'abord si le fichier / etc / initscript existe. Si tel est le cas, il utilise ce script pour démarrer le processus.
Chaque fois qu'un enfant se termine, Init enregistre le fait et la raison de sa mort dans / var / run / utmp et / var / log / wtmp, à condition que ces fichiers existent.
Changer les niveaux d'exécution
Une fois tous les processus spécifiés générés, Init attend l'un de ses processus descendants, un signal powerfail ou jusqu'à ce que Telinit le signale pour modifier le niveau d'exécution du système. Lorsque l'une de ces trois conditions survient, le fichier / etc / inittab est réexaminé. De nouvelles entrées peuvent être ajoutées à ce fichier à tout moment. Toutefois, init attend toujours l’une des trois conditions ci-dessus. Pour fournir une réponse instantanée, la commande Telinit Q ou q peut réveiller Init pour réexaminer le fichier / etc / inittab.
Si Init n'est pas en mode mono-utilisateur et reçoit un signal de panne de courant (SIGPWR), il lit le fichier / etc / powerstatus. Il lance ensuite une commande basée sur le contenu de ce fichier:
- ÉCHOUER): Panne de courant, UPS fournit le courant. Exécutez les entrées powerwait et powerfail.
- D'ACCORD): Le courant a été rétabli, exécutez les entrées powerokwait.
- FAIBLE): L’alimentation est en panne et l’onduleur a une batterie faible. Exécutez les entrées de powerfailnow.
Si / etc / powerstatus n'existe pas ou contient autre chose que les lettres F, O ou L, Init se comporte comme s'il lisait la lettre F.
L'utilisation de SIGPWR et de / etc / powerstatus est déconseillée. Toute personne souhaitant interagir avec Init doit utiliser le canal de contrôle / dev / initctl.
Lorsqu'on demande à Init de modifier le niveau d'exécution, il envoie le signal d'avertissement SIGTERM à tous les processus non définis dans le nouveau niveau d'exécution. Il attend ensuite cinq secondes avant de mettre fin de force à ces processus en utilisant le signal SIGKILL. Notez que Init suppose que tous ces processus et leurs descendants restent dans le même groupe de processus que Init a initialement créé pour eux. Si un processus modifie son affiliation à un groupe de processus, il ne reçoit pas ces signaux. Ces processus doivent être terminés séparément.
Telinit
Telinit est lié à / sbin / init. Il faut un argument d'un caractère et des signaux à Init pour effectuer l'action appropriée. Les arguments suivants servent de directives à Telinit:
- 0, 1, 2, 3, 4, 5 ou 6: Indiquez à Init de passer au niveau d'exécution spécifié.
- a, b, c: Dites à Init de ne traiter que les entrées de fichier / etc / inittab ayant les niveaux d'exécution a, b ou c.
- Q ou q: Dites à Init de réexaminer le fichier / etc / inittab.
- S ou s: Dites à Init de passer en mode mono-utilisateur.
- U ou u: Dites à init de se ré-exécuter (en préservant l’état). Aucun réexamen du fichier / etc / inittab ne se produit. Runlevel devrait être S, s, 1, 2, 3, 4 ou 5; sinon, la demande est ignorée en silence.
Telinit peut également indiquer à Init combien de temps elle doit attendre entre les processus d’envoi des signaux SIGTERM et SIGKILL. La valeur par défaut est cinq secondes, mais cette valeur peut être modifiée avec -t sec option.
Telinit ne peut être appelé que par les utilisateurs disposant des privilèges appropriés.
Le binaire Init vérifie s'il s'agit d'Init ou de Telinit en consultant son ID de processus. Le véritable ID de processus d'Init est toujours 1. Il en découle qu'au lieu d'appeler Telinit, une personne peut utiliser Init comme raccourci.