web-dev-qa-db-fra.com

Qu'est-ce que l'init fait exactement?

Je crée une distribution Linux et maintenant j'ai besoin d'un programme init. Je peux coder très bien et je sais beaucoup de linux (pas beaucoup mais j'utilise Arch Linux pour le développement pendant 4 ans), alors j'ai pensé que je devrais essayer d'écrire mon propre script d'initial de base dans C. J'étais Il suffit de vous demander, quelles tâches ont-elles une injuste pour définir le système pour un shell simple? (Quand je demande "Qu'est-ce que fait l'incit?", Je sais ce que l'init est et ce que c'est pour. Je ne sais tout simplement pas quelles tâches cela.)

Je n'ai pas besoin de code et je n'ai même pas besoin de commandes de base, mais je do besoin de l'ordre dans lequel ils sont exécutés.

43
DividedByZero

SYSTÈME V INIT sur Debian (il existe d'autres variantes et variations) ce qui suit:

  • Lors de la saisie d'une ligne d'exécution, il appelle des scripts dans /etc/rcX.d/S* Dans l'ordre alphanumérique, où X est le niveau d'exécution. Ces scripts doivent configurer le niveau d'exécution. La configuration typique commence les démons et effectue des tâches de configuration pour ce niveau d'exécution. C'est une chose ponctuelle faite lors de la saisie du niveau d'exécution.
  • Bien que dans un niveau de course, il commence les démons qui sont énumérés dans le /etc/inittab Comme besoin d'être actif pendant ce niveau de course. Si ces démons arrêtent de courir, il les redémarre. Bien que vous puissiez avoir n'importe quel démon que vous voulez géré par init, au minimum, vous voulez quelques getty 's afin que vous puissiez vous connecter. getty quitte une fois qu'un connectoire est terminé, Ensuite, init redémarre-le, fournissant une nouvelle invite de connexion.
    • Si le démon redémarre trop de fois de temps en temps, il cesse d'essayer de le redémarrer pendant un moment.
    • Juste parce que quelque chose a été démarré par les scripts de coup d'envoi lors de la saisie du niveau d'exécution ne fait pas init tente automatiquement de le maintenir en cours d'exécution. Vous devez spécifier que séparément dans le /etc/inittab.
  • Lors de la sortie d'une ligne d'exécution, il appelle des scripts en /etc/rcX.d/K* Dans l'ordre alphanumérique, où X est le niveau d'exécution. Un moyen de mettre en œuvre l'arrêt ou le redémarrage est de définir une escale pour ces événements et de rendre la dernière tâche exécutée la commande halt ou reboot.
  • Il appellera des exécutables en réponse à certains événements, tels que les événements électriques ou CTRL-Alt-Del.
  • Il écoute sur une prise, s'il reçoit certains messages, cela changera Runlevervel.

Vous pouvez donc utiliser init comme gestionnaire de service rudimentaire si vous le souhaitez, mais la tâche principale de nos jours est de garder getty 's disponible de sorte qu'un utilisateur puisse se connecter et lancer des transitions de runlevel.

Je me demandais simplement que les tâches injuste pour définir le système pour un shell simple?

Tout ce que vous voulez. Sur Debian, dans chaque /etc/rcX.d répertoire est un lien symbolique à un script de /etc/init.d Et vous pouvez personnaliser complètement ou supprimer ces scripts. La commande est établie en précisant chaque script avec un 00, 01, etc.

Vous pouvez également spécifier un -b Option à init (c'est-à-dire la ligne de commande de kernel) si vous voulez juste init pour frayer une coquille. Lorsque vous quittez la coquille, init meurt et quand init meurt, le noyau panique.

4
LawrenceC

Le minimum absolu minimum que l'init doit faire est d'exécuter au moins un autre programme et ne sortez jamais. Si INIT sort, le système se bloque. Je suppose que même l'exécution de l'un autre programme n'est pas strictement nécessaire, mais si vous ne le faites pas, init devrait être responsable de faire tout ce que le système devrait faire, sinon cela ne serait pas très utile.

2
hildred

init peut faire ce que vous voulez

init est une exécutable arbitraire appelée au noyau Linux à la fin du processus de démarrage (et le seul exécutable de ce type).

Il est normalement mis en œuvre comme exécutable elfe, mais il peut même être un script shell avec chmod +x: init en tant que script shell

Des implémentations typiques telles que SYSEMD vont lire des fichiers de configuration, OFEN /etc/initrc, Puis Fork Un tas de processus Use UseLand basé sur ces configurations, pour mettre en œuvre divers aspects du système.

Toutefois, cela est complètement spécifique de la mise en œuvre, et vous ne pouvez donc pas répondre sans spécifier une implémentation spécifique. Par exemple, je joue avec un processus init qui fait simplement un reboot syscall à des fins éducatives.

Le noyau Linux recherche simplement l'exécutable sur le chemin /init Par défaut, mais cela peut être remplacé par le paramètre init= Linux Kernel.

Un excellent moyen de jouer avec init est d'utiliser QEMU, car vous pouvez transmettre les paramètres de ligne de commande du noyau à QEMU à partir de la ligne de commande QEMU avec l'option -append Et sans la peur de la brique votre bureau.

Voici mon Buildroot entièrement automatisé entièrement automatisé + qem qui facilite la lecture de votre propre introduction pour démystifier la matière.

Si vous êtes déterminé à la modulation "Faites une chose et de bien faire bien" le principe, un programme init devrait commencer les processus.

Processus de démarrage

Il devrait être exécuté une fois que le noyau a été décompressé avec succès, en prenant soin de toutes les tâches rudimentaires impliquées dans l'initialisation de tous les processus initiaux qu'un système nécessite de fonctionner (tels que des lecteurs de montage trouvés dans/etc/fstab, apportant des interfaces réseau et bientôt).

Étant donné que le processus de démarrage et de fermeture est essentiellement inverse les uns des autres, il est courant qu'un programme init garantissait également que les processus soient arrêtés lors d'une commande d'arrêt.

Arrêtez les processus

Cela signifie qu'il doit arrêter les processus en fonction de la page d'homme de ce processus (en d'autres termes, pas seulement un blatif kill -9, il devrait apporter le processus de la manière dont il souhaite être terminé), démontrer des lecteurs et émet finalement la commande finale de la puissance.

Les références

Une bonne référence pour la façon dont cela se fait par d'autres est de regarder scripts de slackware /etc/rc.d , ainsi qu'à un simple système init qui existe déjà, comme Ninit (un successeur à Minit). Il a une supervision de processus (ce qui signifie que si un processus meurt, il est relancé), qui n'est sans doute pas le travail d'Init, mais il est encore assez fondamental et simple à comprendre, en particulier à travers les échantillons de l'auteur.

0