Je crée une distribution linux et maintenant j'ai besoin d'un programme init. Je sais très bien coder en c et je connais un peu le système linux (pas beaucoup, mais j'utilise arch pour le développement sous linux depuis 4 ans). je me demandais simplement quelles tâches init effectuait pour configurer le système pour un simple shell? (Quand je demande "qu'est-ce que init fait?", Je sais ce qu'est init et ce à quoi il sert. Je ne sais simplement pas quelles tâches il accomplit.)
Je ne ai pas besoin de code et je peut - être même pas besoin des commandes de base mais je ne dois l'ordre qu'ils sont exécutés dans.
Réponses:
Le système 5
init
ne vous racontera qu'une petite partie de l'histoire.Il y a une sorte de myopie qui affecte le monde Linux. Les gens pensent qu’ils utilisent un élément appelé «Système 5
init
», c’est à la fois ce qui est traditionnel et le meilleur endroit pour commencer. Ce n'est en fait pas le cas.La tradition n'est en fait pas ce que de telles personnes disent, pour commencer. System 5
init
et System 5rc
remontent à AT & T UNIX System 5, qui était presque aussi loin après le premier UNIX que nous le sommes maintenant (par exemple) après la première version de Linux-Mandrake.1ère édition sous UNIX seulement
init
. Il n'a pas eurc
. Le langage assembleur de la 1re éditioninit
( dont le code a été restauré et mis à disposition par Warren Toomey et autres ) a directement engendré et réapparu 12getty
processus, monté 3 systèmes de fichiers câblés à partir d'une table intégrée et exécuté directement un programme à partir du répertoire de base d'un utilisateur nommémel
. Lagetty
table était aussi directement dans l'image du programme.Dix ans après UNIX System 5, le soi-disant système d'initiation Linux "traditionnel" est apparu. En 1992, Miquel van Smoorenburg (re-) a écrit un Linux
init
+rc
et ses outils associés, que les gens appellent maintenant "Système 5init
", même s’il ne s’agit pas du logiciel UNIX Système 5 (etinit
).System 5
init
/rc
n'est pas le meilleur endroit pour commencer, et même si on ajoute une connaissance de systemd qui ne couvre pas la moitié de ce qu'il y a à savoir. Beaucoup de travail dans le domaine de la conception de systèmes init (pour Linux et les BSD) a eu lieu au cours des deux dernières décennies seulement. Toutes sortes de décisions d'ingénierie ont été discutées, prises, conçues, mises en œuvre et mises en pratique. Les Unices commerciaux ont également fait beaucoup.Systèmes existants pour étudier et apprendre de
Voici une liste incomplète de quelques-uns des principaux systèmes d’initialisation autres que ceux-là, et un ou deux de leurs (plusieurs) points saillants:
init
.getty
frai et zombie récolte) dans un gestionnaire de service distinct et simplement la manipulation du système d' exploitation spécifique « API » périphériques / symlinks / répertoires et les événements du système./bin/rc.init
le travail pour lancer les programmes, monter le système de fichiers, etc. Pour cela, vous pouvez utiliser quelque chose comme minirc .En outre, il y a environ 10 ans, les utilisateurs de daemontools et d’autres utilisateurs ont discuté de l’utilisation du
svscan
processus n ° 1, qui a donné lieu à des projets tels que svscan de Paul Jarc en tant que processus 1 , idées de Gerrit Pape et le processus de Laurent Bercot en tant que processus 1 .Ce qui nous amène à ce que font les processus n ° 1.
Quel processus font les programmes # 1
Les notions de ce que le processus n ° 1 est "supposé" faire sont subjectives par leur nature. Un critère de conception objectif significatif est ce que le processus n ° 1 doit au moins faire. Le noyau lui impose plusieurs exigences. Et il doit toujours faire certaines choses spécifiques au système d'exploitation. En ce qui concerne ce processus # 1 a toujours fait, nous ne sommes pas à ce minimum et ne jamais avoir vraiment été.
Il existe plusieurs choses que divers noyaux de systèmes d'exploitation et autres programmes exigent du processus n ° 1 et auxquelles on ne peut tout simplement pas échapper.
Les gens vous diront que
fork()
manipuler les choses et agir en tant que parent de processus orphelins est la fonction première du processus n ° 1. Ironiquement, c'est faux. Le traitement des processus orphelins est (avec les noyaux Linux récents, comme expliqué à l’ adresse https://unix.stackexchange.com/a/177361/5132 ) un élément du système que l’on peut largement intégrer au processus n ° 1 dans d’autres processus, tels que un responsable de service dédié . Ce sont tous des gestionnaires de services, qui exécutent le processus n ° 1:srcmstr
programme IBM AIX , le contrôleur de ressources systèmerunsvdir
de runitsvscan
de daemontools, Adam Sampsonsvscan
de freedt , Bruce Guentersvscan
de daemontools-encore et Laurent Bercots6-svscan
de s6perpd
de perpservice-manager
de noshDe même, comme expliqué à l' adresse https://superuser.com/a/888936/38062 , il
/dev/initctl
n'est pas nécessaire que l'idée soit proche du processus n ° 1. Ironiquement, c’est le système hautement centralisé qui démontre qu’il peut être sorti du processus n ° 1.A l' inverse, les choses obligatoires pour
init
que les gens oublient souvent dans leurs hors-la-haut de la tête conceptions, des choses telles que la manipulationSIGINT
,SIGPWR
,SIGWINCH
et ainsi de suite envoyé par le noyau et l' adoption de diverses demandes de changement d'état du système envoyé des programmes qui "savent" que certains signaux à traiter # 1 signifient certaines choses. (Par exemple: comme expliqué à l' adresse https://unix.stackexchange.com/a/196471/5132 , les jeux d'outils BSD "savent"SIGUSR1
avec une signification spécifique.)Il existe également des tâches uniques d'initialisation et de finalisation auxquelles on ne peut pas échapper ou qui vont beaucoup souffrir, telles que le montage de systèmes de fichiers "API" ou le vidage du cache du système de fichiers.
Les principes de base de la gestion des systèmes de fichiers "API" diffèrent peu du fonctionnement de la
init
1ère édition UNIX: l’une a une liste d’informations intégrées dans le programme, et une autre simplementmount()
toutes les entrées de la liste. Vous trouverez ce mécanisme dans des systèmes aussi divers que BSD (sic!)init
, En passant par nosdsystem-manager
, à systemd."configurer le système pour un simple shell"
Comme vous l'avez constaté, les
init=/bin/sh
systèmes de fichiers "API" ne sont pas montés, se bloque de façon disproportionnée sans mémoire cache quand on tapeexit
( https://unix.stackexchange.com/a/195978/5132 ), et le laisse généralement au (super) utilisateur de faire manuellement les actions qui rendent le système utilisable de manière minimale.Pour voir ce que l'on n'a pas d'autre choix que de faire dans le processus n ° 1, et ainsi vous mettre sur la bonne voie pour votre objectif de conception déclaré, votre meilleure option est d'examiner les chevauchements dans le fonctionnement du runit de Gerrit Pape, Felix von. Leitner's minit et le
system-manager
programme du paquet nosh. Les deux premiers montrent deux tentatives d’être minimaliste, tout en conservant ce qu’il est impossible d’éviter.Ce dernier est utile, je le suggère, pour son entrée manuelle complète pour le
system-manager
programme, qui détaille exactement quels systèmes de fichiers "API" sont montés, quelles tâches d’initialisation sont exécutées et quels signaux sont gérés; dans un système qui, de par sa conception, le gestionnaire de système génère simplement trois autres choses (le gestionnaire de services, un enregistreur associé et le programme permettant d'exécuter les modifications d'état) et effectue uniquement l'inévitable processus n ° 1.la source
launchd
. Parfois, les gens oublient complètement qu'OSX est un (grand) membre de la grande famille * nix.L’initialisation de System V sur Debian (il existe d’autres variantes et variantes) a les effets suivants:
/etc/rcX.d/S*
ordre alphanumérique, oùX
est le niveau d'exécution. Ces scripts doivent configurer le niveau d'exécution. La configuration typique consiste à démarrer les démons et à effectuer les tâches de configuration pour ce niveau d'exécution. C'est une chose faite une fois en entrant dans le niveau d'exécution./etc/inittab
comme devant être actifs au cours de ce niveau d'exécution. Si ces démons cessent de s'exécuter, il les redémarre. Bien que vous puissiez avoir n'importe quel démon que vous souhaitez gérerinit
, vous devez au moins en avoir quelques-unsgetty
pour pouvoir vous connecter.getty
Quitte une fois la connexion terminée, puisinit
redémarrez-le en fournissant une nouvelle invite de connexion.init
automatiquement de le maintenir en cours d'exécution. Vous devez spécifier cela séparément dans le fichier/etc/inittab
./etc/rcX.d/K*
ordre alphanumérique, oùX
est le niveau d'exécution. Un moyen d'implémenter un arrêt ou un redémarrage consiste à définir un niveau d'exécution pour ces événements et à exécuter la dernière tâche exécutée par la commandehalt
oureboot
.Vous pouvez donc utiliser
init
le gestionnaire de service rudimentaire si vous le souhaitez, mais la tâche principale de nos jours est de restergetty
disponible afin qu'un utilisateur puisse se connecter et lancer des transitions de niveaux d'exécution.Tout ce que vous voulez. Sur Debian, chaque
/etc/rcX.d
répertoire contient un lien symbolique vers un script/etc/init.d
et vous pouvez entièrement personnaliser ou supprimer ces scripts. L'ordre est établi en faisant précéder chaque script avec un00
,01
etc.Vous pouvez également spécifier une
-b
optioninit
(par exemple, via la ligne de commande du noyau) si vous souhaitez simplementinit
générer un shell. Lorsque vous quittez le shell,init
meurt et quandinit
meurt, le noyau panique.la source
Le minimum absolu que init doit faire est d’exécuter au moins un autre programme et de ne jamais quitter. Si init se ferme, le système se bloque. Je suppose que même exécuter le seul autre programme n’est pas strictement nécessaire, mais si vous ne le faites pas, init devrait être tenu de faire tout ce que le système est censé faire, sinon cela ne serait pas très utile.
la source
init
peut faire ce que tu veuxinit est un exécutable arbitraire appelé par le noyau Linux à la fin du processus de démarrage (et le seul exécutable de ce type).
Il est normalement implémenté en tant qu'exécutable ELF, mais il peut même s'agir d'un script shell avec
chmod +x
: Init en tant que script shellLes implémentations typiques telles que sysemd liront souvent les fichiers de configuration,
/etc/initrc
puis bifurqueront un ensemble de processus utilisateur basés sur ces configurations, pour implémenter divers aspects du système.Cependant, ceci est complètement spécifique à l'implémentation, et votre question ne peut donc pas être résolue sans spécifier une implémentation spécifique. Par exemple, je joue avec un
init
processus qui fait simplement unreboot
appel système à des fins éducatives.Le noyau Linux recherche simplement l'exécutable dans le chemin
/init
par défaut, mais ceci peut être remplacé par leinit=
paramètre de ligne de commande du noyau Linux.Un bon moyen de jouer
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'-append
option, sans crainte de détériorer votre bureau.Voici ma configuration minimale entièrement automatisée Buildroot + QEMU qui permet de jouer facilement avec vos propres ressources pour démystifier le problème.
la source
Si vous adhérez au principe modulaire "faites une chose et faites-le bien", un
init
programme doit alors lancer les processus.Démarrer les processus
Il doit être exécuté une fois que le noyau a été décompressé avec succès, en prenant en charge toutes les tâches rudimentaires nécessaires à l’initialisation de tous les processus initiaux nécessaires au système (telles que le montage de lecteurs trouvés dans / etc / fstab, l’affichage d’interfaces réseau et bientôt).
Etant donné que les processus de démarrage et d’arrêt sont essentiellement inverses, il est courant pour un programme init de s’assurer également que les processus sont arrêtés lors d’une commande d’arrêt.
Processus d'arrêt
Cela signifie qu'il doit arrêter les processus en fonction de la page de manuel de ce processus (en d'autres termes,
kill -9
il ne doit pas s'agir d' un flagrant , mais il doit également ralentir le processus), démonter les lecteurs et finalement émettre la commande de mise hors tension finale. .Les références
Une bonne référence pour savoir comment cela est fait par d’autres est de regarder les scripts /etc/rc.d de Slackware , ainsi qu’un système d’init qui existe déjà, comme ninit (le successeur de minit). Il a une supervision de processus (ce qui signifie que si un processus meurt, il est relancé), ce qui n'est sans doute pas le travail d'init, mais il reste assez simple et facile à comprendre, notamment à travers les exemples de scripts de l'auteur.
la source