Quelle est la connexion entre les répertoires «/etc/init.d» et «/etc/rcX.d» sous Linux?

25

J'apprends la ligne de commande à partir d'un livre intitulé " Linux Command Line and Shell Scripting Bible, Second Edition ". Le livre déclare ceci:

Certaines implémentations Linux contiennent une table de processus pour démarrer automatiquement au démarrage. Sur les systèmes Linux, cette table se trouve généralement dans le fichier spécial / etc / inittabs.

D'autres systèmes (comme la distribution populaire Ubuntu Linux) utilisent le dossier /etc/init.d, qui contient des scripts pour démarrer et arrêter des applications individuelles au démarrage. Les scripts sont démarrés via des entrées dans les dossiers /etc/rcX.d, où X est un niveau d'exécution.

Probablement parce que je suis nouveau sur Linux, je n'ai pas compris ce que signifiait le deuxième paragraphe cité. Quelqu'un peut-il expliquer la même chose dans un langage beaucoup plus simple?

c'est moi
la source
cela a été demandé plusieurs fois auparavant
bsd
@bdowning Celui-ci est différent. J'ai un contexte. Les questions que je vois dans la page à laquelle vous avez lié sont différentes de cela, OMI.
its_me
@bdowning off, mais marquer comme doublon aurait été plus instructif si vous l'aviez
pensé

Réponses:

30

Oublions init.dou rcx.dgardons les choses très simples. Imaginez que vous programmiez un programme dont la seule responsabilité est d'exécuter ou de tuer d'autres scripts un par un.

Cependant, votre prochain problème est de vous assurer qu'ils fonctionnent dans l'ordre. Comment feriez-vous cela?

Et imaginons que ce programme a regardé dans un scriptsdossier pour exécuter les scripts. Pour ordonner la priorité des scripts, vous devez les nommer dans, disons l'ordre numérique. Cet ordre est ce qui dicte la relation entre init.detrc

En d'autres termes, init.dcontient les scripts à exécuter et rcX.dcontient leur ordre d'exécution.

La Xvaleur de rcX.d est le niveau d'exécution. Cela pourrait être vaguement traduit à l'état actuel du système d'exploitation.

Si vous creusez à l'intérieur des rcX.dscripts, vous trouverez ce formatage:

Xxxabcd
  • Xest remplacé par Kou S, qui indique si le script doit être killedou starteddans le niveau d'exécution en cours
  • xx est le numéro de commande
  • abcd est le nom du script (le nom n'a pas d'importance cependant où il pointe est le script que cela exécutera)
qui suis je
la source
2
merveilleuse explication, très claire. Merci @whoami
its_me
9

Il existe plusieurs systèmes d'initialisation différents pour Linux. Les principaux sont SysVinit (le traditionnel), Upstart (le remplacement d'Ubuntu) et SystemD (poussé par Fedora et Gnome). Les répertoires /etc/init.det /etc/rc?.dsont utilisés par SysVinit. Le livre peut les mentionner en ce qui concerne Ubuntu parce que les informations sont un peu datées (Ubuntu utilisait SysVinit comme tout le monde) ou parce que ces répertoires existent toujours pour des raisons de compatibilité.

/etc/init.dcontient un tas de scripts, chacun contenant des instructions pour démarrer et arrêter un service. Certains de ces services doivent être démarrés au démarrage; d'autres doivent être démarrés en mode multi-utilisateur mais pas en mode de maintenance mono-utilisateur; et il est possible de définir différents modes avec différents ensembles de services souhaités. SysVinit gère cela via des niveaux d'exécution . Le répertoire /etc/rc$N.dcontient les scripts à exécuter lorsque vous entrez dans le niveau d'exécution N ( /etc/rc$N.d/S*) et les scripts à exécuter lorsque vous quittez le niveau d'exécution N ( /etc/rc$N.d/K*). Étant donné que de nombreux niveaux d'exécution ont des scripts en commun, plutôt que de stocker une copie des scripts pour chaque niveau d'exécution, les scripts sont tous stockés dans un seul emplacement /etc/init.det les répertoires spécifiques au niveau d'exécution/etc/rc?.dcontiennent des liens symboliques. De plus, les noms des liens symboliques indiquent si le service doit être démarré ( S*) ou arrêté (tué K*) dans ce niveau d'exécution, et un préfixe numérique est utilisé pour contrôler l'ordre dans lequel les scripts sont exécutés.

Le script responsable de la traversée /etc/rc$N.dest /etc/init.d/rc(sur Ubuntu pré-démarrage et sur Debian; les emplacements peuvent varier sur d'autres distributions Linux).

Gilles 'SO- arrête d'être méchant'
la source
Donc, Ubuntu n'utilise pas /etc/init.det /etc/rc?.dplus, et a Upstart à la place?
its_me
1
@ KrishD'Souza Pas tout à fait. Ubuntu utilise Upstart au lieu de SysVinit, mais de nombreux packages livrent toujours des scripts /etc/init.d(au lieu de .conffichiers Upstart /etc/init), donc Upstart prend toujours en charge /etc/init.det /etc/rc?.dpour des raisons de compatibilité.
Gilles 'SO- arrête d'être méchant'
Ubuntu est passé d'Upstart à systemd depuis le 15.04. Donc en ce moment (16.04) Ubuntu a trois systèmes d'initialisation: SysVinit, Upstart et systemd. Le premier et le second sont laissés pour la compatibilité descendante.
PetroCliff
4

/etc/init.d est le répertoire auquel appartiennent les scripts d'initialisation.

C'est etc/rcX.dlà que les liens contrôlant quels services sont tués ou démarrés lors de l'entrée dans le niveau d'exécution X. Les fichiers rcX.dcommençant par K sont exécutés avec le paramètre stop, et les fichiers commençant par Ssont exécutés avec le paramètre start. Il est typique de séquencer l'ordre de démarrage et d'arrêt en utilisant un nombre à deux chiffres après le Kou S. Pour garantir un ordre de démarrage et d'arrêt correct, il est courant que les deux séquences totalisent 100.

Les programmes peuvent être désactivés dans un niveau d'exécution en supprimant les liens ou en changeant la casse de Kou Sen kou s.

EDIT: les administrateurs exécutent généralement les scripts à partir /etc/init.ddesquels peut être un lien symbolique vers un autre répertoire en fonction de la distribution. (Différentes distributions ont des normes différentes.)

Les rcX.dsont utilisés par le code d'initialisation pour modifier les niveaux d'exécution.

BillThor
la source
Sur la plupart des systèmes, il /etc/init.dexiste un lien symbolique vers le répertoire sous/etc/rc.d/init.d
Nikhil Mulley
1
Donc, fondamentalement, /etc/init.dest inutile sans /etc/rcX.d? Et puisque /etc/rcX.dle contrôleur des programmes qui sont lancés au démarrage, sa fonction est similaire à celle de /etc/init.d, n'est-ce pas?
its_me
Cela dépend du système. Gentoo, par exemple, utilise uniquement /etc/init.d pour ses fichiers init; il n'a pas de répertoires /etc/rc*.d. Arch Linux, de même, n'a que /etc/rc.d, au lieu de /etc/init.d.
laebshade
1

Bien que @BillThor y ait très bien répondu, voici ma compréhension de /etc/rcX.det /etc/init.d:

  • /etc/init.d contient des scripts pour démarrer et arrêter des applications individuelles au démarrage.
  • /etc/rc?.dles répertoires représentent différents niveaux d'exécution et les scripts qu'ils contiennent ne sont que des liens symboliques vers les scripts réels du /etc/init.drépertoire. La modification des niveaux d'exécution modifie le mode du système, comme le mode très simple Utilisateur unique en mode console uniquement à l'interface graphique avancée.

Donc, il n'y a pas d'utilisation de /etc/rc?.drépertoires sans /etc/init.dlui - même (et bien sûr, vice-versa).

c'est moi
la source