Que fait exactement init?


43

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.


1
Vous pouvez utiliser l'interprète de votre choix pour les scripts d'initialisation de style SysV, notamment Perl, awk, bash, (t) csh, les binaires natifs, ... Bash est normalement utilisé car il est pratiquement garanti qu'il est disponible sur le système où ces scripts sont installés. déployé au point approprié du processus de démarrage, non pas parce qu’il existe un couplage entre SysVinit et bash. SysVinit définit le contrat et chaque script est libre de le mettre en œuvre de la manière que son développeur juge appropriée.
un CVn

Réponses:


53

Le système 5 initne 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 initet System 5 rcremontent à 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 eu rc. Le langage assembleur de la 1re édition init( dont le code a été restauré et mis à disposition par Warren Toomey et autres ) a directement engendré et réapparu 12 gettyprocessus, 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. La gettytable é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+ rcet ses outils associés, que les gens appellent maintenant "Système 5 init", même s’il ne s’agit pas du logiciel UNIX Système 5 (et init).

System 5 init/ rcn'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:

  • Joachim Nilsson a fini par utiliser un fichier de configuration plus lisible par l'homme.
  • Le service de Felix von Leitner a opté pour un système de configuration système de fichiers, tel que la base de données, de petites empreintes de mémoire et des dépendances de démarrage / arrêt init.
  • La campagne de Gerrit Pape a opté pour ce que j'ai décrit précédemment comme l' approche des quatre scripts shell .
  • InitNG visait à avoir des dépendances, des cibles nommées, plusieurs fichiers de configuration et une syntaxe de configuration plus flexible avec un chargement complet de paramètres pour les processus enfants.
  • Upstart a entrepris une refonte complète en modélisant le système non pas comme des services et des interdépendances, mais comme des événements et des tâches déclenchées par ceux-ci.
  • La conception de Nosh comprend pousser toute la gestion des services (y compris celles même le gettyfrai 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.
  • Sinit est un init très simple. Il exécute /bin/rc.initle 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 svscanprocessus 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:

De même, comme expliqué à l' adresse https://superuser.com/a/888936/38062 , il /dev/initctln'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 initque les gens oublient souvent dans leurs hors-la-haut de la tête conceptions, des choses telles que la manipulation SIGINT, SIGPWR, SIGWINCHet 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" SIGUSR1avec 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 init1ère édition UNIX: l’une a une liste d’informations intégrées dans le programme, et une autre simplement mount()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 nosd system-manager, à systemd.

"configurer le système pour un simple shell"

Comme vous l'avez constaté, les init=/bin/shsystèmes de fichiers "API" ne sont pas montés, se bloque de façon disproportionnée sans mémoire cache quand on tape exit( 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-managerprogramme 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-managerprogramme, 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.


3
Réponse géniale et très informative. Mais je me demande où dans cette grande image est OSX launchd. Parfois, les gens oublient complètement qu'OSX est un (grand) membre de la grande famille * nix.
DavAlPi

4

L’initialisation de System V sur Debian (il existe d’autres variantes et variantes) a les effets suivants:

  • Lorsqu'il entre dans un niveau d'exécution, il appelle les scripts dans l' /etc/rcX.d/S*ordre alphanumérique, où Xest 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.
  • Lorsqu'il est dans un niveau d'exécution, il démarre les démons répertoriés dans la liste /etc/inittabcomme 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érer init, vous devez au moins en avoir quelques-uns gettypour pouvoir vous connecter. gettyQuitte une fois la connexion terminée, puis initredémarrez-le en fournissant une nouvelle invite de connexion.
    • Si le démon redémarre trop souvent dans un délai trop court, il arrête d'essayer de le redémarrer pendant un moment.
    • Le fait que quelque chose ait été démarré par les scripts de lancement lors de la saisie du niveau d'exécution ne permet pas initautomatiquement de le maintenir en cours d'exécution. Vous devez spécifier cela séparément dans le fichier /etc/inittab.
  • Lorsqu'il quitte un niveau d'exécution, il appelle les scripts dans l' /etc/rcX.d/K*ordre alphanumérique, où Xest 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 commande haltou reboot.
  • Il appellera les exécutables en réponse à certains événements, tels que les événements d'alimentation ou Ctrl-Alt-Suppr.
  • Il écoute sur un socket, s'il reçoit certains messages, il changera de niveau d'exécution.

Vous pouvez donc utiliser initle gestionnaire de service rudimentaire si vous le souhaitez, mais la tâche principale de nos jours est de rester gettydisponible afin qu'un utilisateur puisse se connecter et lancer des transitions de niveaux d'exécution.

Je me demandais simplement quelles tâches init est-il nécessaire pour configurer le système pour un simple shell?

Tout ce que vous voulez. Sur Debian, chaque /etc/rcX.drépertoire contient un lien symbolique vers un script /etc/init.det vous pouvez entièrement personnaliser ou supprimer ces scripts. L'ordre est établi en faisant précéder chaque script avec un 00, 01etc.

Vous pouvez également spécifier une -boption init(par exemple, via la ligne de commande du noyau) si vous souhaitez simplement initgénérer un shell. Lorsque vous quittez le shell, initmeurt et quand initmeurt, le noyau panique.


2

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.


1
J'ai eu des systèmes Linux bogués où PID 1 s'est écrasé mais le système a continué à fonctionner. La qualité de la défaillance du PID 1 peut dépendre de la version du noyau.
Gilles 'SO- arrête d'être méchant'

1

init peut faire ce que tu veux

init 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 shell

Les implémentations typiques telles que sysemd liront souvent les fichiers de configuration, /etc/initrcpuis 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 initprocessus qui fait simplement un rebootappel système à des fins éducatives.

Le noyau Linux recherche simplement l'exécutable dans le chemin /initpar défaut, mais ceci peut être remplacé par le init=paramètre de ligne de commande du noyau Linux.

Un bon moyen de jouer initest 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' -appendoption, 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.


0

Si vous adhérez au principe modulaire "faites une chose et faites-le bien", un initprogramme 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 -9il 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.