En fait, il n'y a pas grand-chose dans le processus de démarrage:
1 et 1 Un chargeur de démarrage trouve l'image du noyau sur le disque, le charge en mémoire et le démarre.
2 Le noyau initialise les appareils et ses pilotes.
3 et 3 Le noyau monte le système de fichiers racine.
4 Le noyau lance un programme appelé init.
5 init définit le reste des processus en mouvement.
6. Les derniers processus qui commencent dans le cadre de la séquence de démarrage vous permettent de vous connecter.
L'identification de chaque étape du processus de démarrage est inestimable pour résoudre les problèmes de démarrage et comprendre le système dans son ensemble. Pour démarrer, zéro dans le chargeur de démarrage, qui est l'écran initial ou l'invite que vous obtenez après que l'ordinateur ait fait son auto-test de mise sous tension, demandant quel système d'exploitation s'exécuterait. Après avoir fait un choix, le chargeur de démarrage exécute le noyau Linux, donnant le contrôle du système au noyau.
Il y a une discussion détaillée sur le noyau ailleurs dans ce livre dont cet article est extrait. Cet article couvre le Étape d'initialisation du noyau, l'étape où le noyau imprime un tas de messages sur le matériel présent sur le système. Le noyau commence init juste après qu'il affiche un message proclamant que le noyau a monté le système de fichiers racine:
VFS: monté root (ext2 fileSystem) Readonly.
Peu de temps après, vous verrez un message sur le démarrage init, suivi des messages de démarrage du service système, et enfin vous obtenez une invite de connexion quelconque.
NOTE : Sur Chapeau rouge Linux, la note init est particulièrement évidente, car elle “accueil” vous à “Hat rouge Linux.” Tous les messages par la suite montrent le succès ou l'échec entre parenthèses à droite de l'écran.
La majeure partie de ce chapitre traite de l'Init, car c'est la partie de la séquence de démarrage où vous avez le plus de contrôle.
init
Il n'y a rien de spécial dans init. Il s'agit d'un programme comme les autres sur le système Linux, et vous le trouverez dans / sbin avec d'autres binaires système. L'objectif principal de l'init est de démarrer et d'arrêter d'autres programmes dans une séquence particulière. Tout ce que vous avez à savoir, c'est comment fonctionne cette séquence.
Il existe quelques variations différentes, mais la plupart des distributions Linux utilisent le style System V discuté ici. Certaines distributions utilisent une version plus simple qui ressemble au BSD Init, mais il est peu probable que vous en rencontriez.
Couleurs
À tout moment sur un système Linux, un certain ensemble de processus de base est en cours d'exécution. Cet état de la machine est appelé son couloir, et il est désigné avec un nombre de 0 à 6. Le système passe la plupart de son temps dans un seul couloir. Cependant, lorsque vous fermez la machine, les initiés basculent vers un niveau coulant différent afin de mettre fin aux services système de manière ordonnée et de dire au noyau de s'arrêter. Un autre niveau coulant est pour le mode utilisateur unique, discuté plus tard.
Le moyen le plus simple de maîtriser les niveaux de course est d'examiner le fichier de configuration init, / etc / initTab. Recherchez une ligne comme ce qui suit:
ID: 5: initdefault:
Cette ligne signifie que le niveau d'exécution par défaut sur le système est de 5. Toutes les lignes du fichier initTAB prennent ce formulaire, avec quatre champs séparés par des colons survenant dans l'ordre suivant:
# Un identifiant unique (une courte chaîne, comme ID dans l'exemple précédent)
# Le (s) nombre (s) de niveau rinalaire applicable
# L'action que init devrait prendre (dans l'exemple précédent, l'action consiste à définir le niveau de rinallé par défaut sur 5)
# Une commande à exécuter (facultatif)
Il n'y a pas de commande à exécuter dans l'exemple InitDefault précédent car une commande n'a pas de sens dans le contexte de la définition du niveau de course par défaut. Regardez un peu plus loin dans Inittab, jusqu'à ce que vous voyiez une ligne comme ceci:
l5: 5: attendre: /etc/rc.d/rc 5
Cette ligne déclenche la plupart de la configuration et des services du système via les répertoires RC * .d et init.D. Vous pouvez voir que init est défini pour exécuter une commande appelée /etc/rc.d/rc 5 en cas de course à pied 5. L'action d'attente indique quand et comment init exécute la commande: exécutez RC 5 une fois lors de la saisie de RunLevel 5, puis attendez que cette commande se termine avant de faire autre chose.
Il existe plusieurs actions différentes en plus de Initdefault et d'attente, en particulier à la gestion de l'alimentation, et la page manuelle initTab (5) vous en dit Ceux que vous êtes le plus susceptibles de rencontrer sont expliqués dans les sections suivantes.
réapparaître
L'action RAPAWN amène Init à exécuter la commande qui suit, et si la commande termine l'exécution, l'exécute à nouveau. Vous verrez probablement quelque chose de similaire à cette ligne dans votre fichier inittab:
1: 2345: réapparition: / sbin / mintty tty1
Les programmes Getty fournissent des invites de connexion. La ligne précédente est pour la première console virtuelle (/ dev / tty1), celle que vous voyez lorsque vous appuyez sur Alt-F1 ou Control-ALT-F1. L'action de réaction ramène l'invite de connexion après votre déconnexion.
ctrlaltel
L'action Ctrlaltdel contrôle ce que fait le système lorsque vous appuyez sur Control-Alt-Delete sur une console virtuelle. Sur la plupart des systèmes, il s'agit d'une sorte de commande de redémarrage à l'aide de la commande d'arrêt.
syine
L'action Sysinit est la toute première chose que Init devrait fonctionner au démarrage, avant d'entrer dans les niveaux d'usine.
Comment les processus dans les niveaux coulants commencent
Vous êtes maintenant prêt à apprendre comment init lance les services système, juste avant qu'il ne vous connecte. Rappelez-vous cette ligne inittab de plus tôt:
l5: 5: attendre: /etc/rc.d/rc 5
Cette petite ligne déclenche de nombreux autres programmes. RC signifie des commandes RUN, et vous entendrez les gens se référer aux commandes comme scripts, programmes ou services. Alors, où sont ces commandes, de toute façon?
Pour RunLevel 5, dans cet exemple, les commandes sont probablement dans /etc/rc.d/rc5.d ou /etc/rc5.d. RunLevel 1 utilise RC1.D, RunLevel 2 utilise RC2.d, et ainsi de suite. Vous pouvez trouver les éléments suivants dans le répertoire RC5.D:
S10SYSKLOGD S20PPP S99GPM
S12kerneld s25netstd_nfs s99httpd
S15NETSTD_INIT S30NETSTD_MISC S99rmnologin
S18NETBASE S45PCMCIA S99SSHD
S20ACCT S89ATD
S20logoutd s89cron
La commande RC 5 démarre les programmes dans ce répertoire de niveau Runlevel en exécutant les commandes suivantes:
S10SYSKLOGD START
S12kerneld Start
S15NETSTD_INIT START
S18NETBASE START
…
S99SSHD START
Remarquez l'argument de démarrage dans chaque commande. Le S dans un nom de commande signifie que la commande doit s'exécuter en mode Démarrage, et le nombre (00 à 99) détermine où dans la séquence RC démarre la commande.
Les commandes RC * .D sont généralement des scripts shell qui démarrent des programmes dans / sbin ou / usr / sbin. Normalement, vous pouvez comprendre ce que fait réellement l'une des commandes en regardant le script avec moins ou un autre programme de téléavertisseur.
Vous pouvez commencer l'un de ces services à la main. Par exemple, si vous souhaitez démarrer manuellement le programme HTTPD Web Server, exécutez S99HTTPD Démarrer. De même, si vous avez besoin de tuer l'un des services lorsque la machine est allumée, vous pouvez exécuter la commande dans le répertoire RC * .d avec l'argument Stop (S99HTTPD STOP, par exemple).
Certains répertoires rc * .d contiennent des commandes qui commencent par k (pour “tuer,” ou mode d'arrêt). Dans ce cas, RC exécute la commande avec l'argument d'arrêt au lieu de démarrer. Vous êtes le plus susceptible de rencontrer des commandes K dans les niveaux de course qui ont fermé le système.
Ajout et supprimer des services
Si vous souhaitez ajouter, supprimer ou modifier des services dans les répertoires RC * .D, vous devez examiner de plus près les fichiers à l'intérieur. Une longue liste révèle une structure comme celle-ci:
Lrwxrwxrwx. . . S10SYSOGD -> ../init.d/sysklogd
Lrwxrwxrwx. . . S12kerneld -> ../init.d/kerneld
lrwxrwxrwx. . . S15netstd_init -> ../init.d/netstd_init
lrwxrwxrwx. . . S18NetBase -> ../init.d/netbase
…
Les commandes d'un répertoire RC * .D sont en fait des liens symboliques vers des fichiers dans un répertoire init.d, généralement dans / etc ou /etc/rc.d. Les distributions Linux contiennent ces liens afin qu'ils puissent utiliser les mêmes scripts de démarrage pour tous les niveaux de course. Cette convention n'est en aucun cas une exigence, mais elle facilite souvent l'organisation.
Pour empêcher l'une des commandes du répertoire init.d de s'exécuter dans un niveau de coulée particulier, vous pourriez penser à supprimer le lien symbolique dans le répertoire RC * .d approprié. Cela fonctionne, mais si vous faites une erreur et que vous avez besoin de remettre le lien en place, vous pourriez avoir du mal à vous souvenir du nom exact du lien. Par conséquent, vous ne devez pas supprimer les liens dans les répertoires RC * .D, mais plutôt, ajoutez un trait de soulignement (_) au début du nom de lien comme celui-ci:
MV S99HTTPD _S99HTTPD
Au moment du démarrage, RC ignore _S99HTTPD car il ne commence pas par S ou K.
Pour ajouter un service, vous devez créer un script comme les autres dans le répertoire init.d, puis créer un lien symbolique dans le répertoire RC * .d correct. La façon la plus simple d'écrire un script est d'examiner les scripts déjà dans init.d, de faire une copie de celui que vous comprenez et de modifier la copie.
Lorsque vous ajoutez un service, assurez-vous de choisir un endroit approprié dans la séquence de démarrage pour démarrer le service. Si le service commence trop tôt, cela peut ne pas fonctionner, en raison d'une dépendance à l'égard d'un autre service. Pour les services non essentiels, la plupart des administrateurs de systèmes préfèrent les chiffres dans les années 90, après la plupart des services fournis avec le système.
Les distributions Linux sont généralement livrées avec une commande pour activer et désactiver les services dans les répertoires RC * .d. Par exemple, dans Debian, la commande est mise à jour-rc.d, et dans Red Hat Linux, la commande est chkconfig. Des interfaces utilisateur graphiques sont également disponibles. L'utilisation de ces programmes aide à garder les répertoires de démarrage cohérents et aide aux mises à niveau.
INDICE: L'un des problèmes d'installation des Linux les plus courants est un serveur XFree86 mal configuré qui s'allume et éteint, ce qui rend le système inutilisable sur la console. Pour arrêter ce comportement, démarrez en mode utilisateur unique et modifiez vos services de couture ou de couture. Recherchez quelque chose contenant XDM, GDM ou KDM dans vos répertoires RC * .d, ou votre / etc / inittab.
Contrôle init
Parfois, vous devez donner un petit coup de pied à init pour lui dire de changer de couloir, pour relire le fichier initTab, ou tout simplement pour arrêter le système. Parce que init est toujours le premier processus sur un système, son ID de processus est toujours 1.
Vous pouvez contrôler init avec Telinit. Par exemple, si vous souhaitez passer à Runlevel 3, utilisez cette commande:
Télinique 3
Lorsque vous changez de couloir, l'initiation essaie de tuer tous les processus qui ne sont pas dans le fichier initTab pour le nouveau couloir. Par conséquent, vous devez faire attention à changer les niveaux d'usine.
Lorsque vous devez ajouter ou supprimer des travaux de réaction ou apporter tout autre changement dans le fichier initTab, vous devez informer Init de la modification et faire revoir le fichier. Certaines personnes utilisent Kill -Hup 1 pour dire à init de le faire. Cette méthode traditionnelle fonctionne sur la plupart des versions d'Unix, tant que vous la tapez correctement. Cependant, vous pouvez également exécuter cette commande en téline:
Télin Q
Vous pouvez également utiliser Telinit S pour passer en mode utilisateur unique.
Fermer
INIT contrôle également comment le système s'arrête et redémarre. La bonne façon d'arrêter une machine Linux est d'utiliser la commande d'arrêt.
Il existe deux façons de base d'utiliser l'arrêt. Si vous arrêtez le système, il ferme la machine et le maintient. Pour que la machine s'arrête immédiatement, utilisez cette commande:
Arrêt -H maintenant
Sur la plupart des machines modernes avec des versions raisonnablement récentes de Linux, A Halt coupe la puissance de la machine. Vous pouvez également redémarrer la machine. Pour un redémarrage, utilisez -r au lieu de -h.
Le processus d'arrêt prend plusieurs secondes. Vous ne devez jamais réinitialiser ou éteindre une machine au cours de cette étape.
Dans l'exemple précédent, il est maintenant temps de fermer. Cet argument est obligatoire, mais il existe de nombreuses façons de le spécifier. Si vous voulez que la machine baisse dans le futur, une façon consiste à utiliser + n, où n est le nombre de minutes d'arrêt devrait attendre avant de faire son travail. Pour d'autres options, consultez la page manuelle d'arrêt (8).
Pour faire redémarrer le système en 10 minutes, exécutez cette commande:
Arrêt -R +10
Sur Linux, Shutdown informe quiconque s'est connecté que la machine baisse, mais cela fait peu de travail réel. Si vous spécifiez un temps autre que maintenant, Shutdown crée un fichier appelé / etc / nologine. Lorsque ce fichier est présent, le système interdit les connexions par quiconque sauf le superutilisateur.
Lorsque le temps d'arrêt du système arrive enfin, Shutdown indique à INIT de passer à RinLevel 0 pour un arrêt et un couloir 6 pour un redémarrage. Lorsque INT entre en marche 0 ou 6, tous les éléments suivants ont lieu, que vous pouvez vérifier en regardant les scripts à l'intérieur de RC0.D et RC6.D:
1. Init tue tous les processus qu'il peut (comme il le ferait lors du passage à tout autre niveau coulant).
# Les commandes RC0.D / RC6.D initiales s'exécutent, de verrouillage les fichiers du système en place et de la préparation d'autres préparations pour l'arrêt.
# Les commandes RC0.D / RC6.D suivantes débrouillent tous les systèmes de fichiers autres que la racine.
# D'autres commandes rc0.d / rc6.d Remoutent le système de fichiers racine en lecture seule.
# Encore plus de commandes rc0.d / rc6.d écrivent toutes les données tamponnées sur le système de fichiers avec le programme Sync.
# Les commandes RC0.D / RC6.D finales indiquent au noyau de redémarrer ou de s'arrêter avec le programme de redémarrage, de stop ou de poweroff.
Les programmes de redémarrage et d'arrêt se comportent différemment pour chaque niveau coulant, provoquant potentiellement une confusion. Par défaut, ces programmes appellent la fermeture avec les options -r ou -h, mais si le système est déjà à l'arrêt ou à redémarrer le niveau de course, les programmes disent au noyau de s'arrêter immédiatement. Si vous souhaitez vraiment fermer votre machine à la hâte (ignorer tout dommage possible d'un arrêt désordonné), utilisez l'option -f.