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.
SYSTÈME V INIT sur Debian (il existe d'autres variantes et variations) ce qui suit:
/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./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.init
tente automatiquement de le maintenir en cours d'exécution. Vous devez spécifier que séparément dans le /etc/inittab
./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
.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.
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.
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.
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.
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.
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.