Comprendre le fichier / etc / inittab
On février 12, 2021 by admin Jutilise le fichier /etc/inittab
(systemv) suivant:
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin S0:12345:respawn:/sbin/getty -L 115200 ttyS0
Afin de comprendre comment les choses fonctionnent vraiment, japprécierai que vos réponses à 1-3 vous distinguent entre deux situations:
- Je « suis connecté à mon système via un port série.
- Jai un ordinateur de bureau » normal « .
Questions:
-
Si jajoute une autre ligne getty, une fois linux démarré, je verrai deux terminaux séparés?
-
Si jouvre plusieurs lignes getty, comment jai attribué lequel getty exécutera ma commande
si::sysinit:/etc/init.d/rcS
et quelle getty exécutera les commandes des autres scripts? (celles qui exécutent les scripts en fonction du niveau d’exécution du système)dans dautres mots: dans le fichier
/etc/inittab
– puis-je attribuer différentes commandes à différents gettys? (je veux dire aux terminaux qui souvriront par ces gettys) -
le dernier script du dossier /etc/init.d/rc5 exécuté la commande suivante:
su nobody -c /bin/sh
et le résultat est:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Jai donc vérifié que je ne suis personne mais pourquoi il écrit les deux premières lignes? aussi pourquoi linvite est sh-4.3 $ et non personne @ …
-
Jutilise une connexion série. Puis-je changer le fichier / etc / inittab et le dernier script qui sera exécuté par init afin de:
- exécuter un programme avant de se connecter en tant quutilisateur à faible privilège (le processus dinitialisation attendra la fin)
- une fois le programme terminé, obtenez le invite de connexion à mon système
- quelle est la meilleure façon de créer un utilisateur à faibles privilèges et de le laisser exécuter ce programme pendant le processus d’initialisation (si je ne veux pas utiliser l’utilisateur nobody)
Réponse
Question 1:
Oui, en ajoutant plus getty
lignes vous pouvez obtenir plus de terminaux en parallèle. Un seul getty
peut être associé à un terminal à la fois, donc un seul getty
par port série est possible. Sur un PC de bureau classique, le noyau Linux définit un certain nombre de consoles virtuelles, accessibles à laide des combinaisons de touches Control + Alt + FX et correspondant à /dev/ttyX
appareils (X = un nombre). La configuration exacte peut varier entre les distributions, mais généralement sur les distributions grand public, les 6 premiers appareils /dev/ttyX
ont des getty
configurés pour eux lorsque le système fonctionne normalement. Vous pouvez utiliser les commandes openvt
et deallocvt
pour ajouter ou supprimer des consoles virtuelles et démarrer des processus (qui peuvent être nimporte quel processus, pas nécessairement getty
s) sur eux.
/dev/tty0
est spécial: il fait référence à la console virtuelle qui est actuellement sélectionnée. /dev/console
est un périphérique spécial similaire, pointant vers le périphérique TTY défini comme la console système principale au niveau du noyau. Sur les systèmes de bureau, il sagit en fait dun alias de /dev/tty0
par défaut, mais en utilisant loption de démarrage console=
, vous pouvez le changer en série Port. Un G. certaines architectures embarquées, il peut sagir dun port série par défaut. Des utilitaires tels que xconsole
peuvent également servir de sortie supplémentaire pour /dev/console
.
À lépoque où les ordinateurs étaient de gros objets multi-armoires dans des salles informatiques dédiées, envoyer un message à /dev/console
aurait été un moyen datteindre lopérateur système en service physiquement près de lordinateur, ce qui aurait pu être utile pour les demandes de changer les bandes ou les packs de disques. Sur les systèmes modernes, les messages envoyés spécifiquement à /dev/console
sont généralement des messages de démarrage / arrêt, ou peut-être un canal de dernier recours pour les alarmes urgentes sur les conditions de défaillance qui pourraient avoir un impact sur laccès au réseau ou au stockage, voire impliquent un crash du noyau: « une personne en charge du matériel physique a besoin de voir cela et les fichiers journaux habituels sont inutilisables pour une raison quelconque. »
Question 2:
Je crains que vous nayez une idée fausse ici. La ligne sysinit
et les autres lignes /etc/inittab
ne sont pas associées à getty
traite du tout. Chaque commande exécutée à partir de inittab
, sauf indication contraire, a ses flux dentrée, de sortie et derreurs standard associés à /dev/console
.
Les lignes getty
spécifient en fait lappareil TTY quelles utiliseront et le processus getty
a un code intégré qui attribuera cet appareil TTY pour eux-mêmes et tous leurs processus enfants à moins que / jusquà ce que lutilisateur exécute un shell et choisisse de rediriger ces flux dune autre manière.Cela et linitialisation des paramètres de lappareil TTY sont la plus grande partie de lobjectif de getty
« : afficher /etc/issue
et linvite de connexion, accepter le nom dutilisateur, la définition de la variable denvironnement TERM et le démarrage de létape suivante du processus de connexion TTY (généralement /bin/login
mais personnalisable) ne sont en fait que des parties mineures.
Notez que là est une convention selon laquelle, pour les appareils TTY, le champ ID à deux caractères dans la première colonne de la ligne inittab
doit correspondre au nom de lappareil TTY en question après le /dev/tty
préfixe, donc /dev/ttyS0
obtiendra un ID de ligne inittab de S0
, et ainsi de suite. nest pas nécessairement associé à un TTY du tout (ou renvoie simplement des informations durgence à / dev / console si nécessaire), lID peut être tout ce qui nest pas en conflit avec les ID de ligne de lappareil TTY.
(Retour dans le jour où les terminaux connectés en série étaient le non rm, obtenir les paramètres du périphérique TTY pour le terminal à lautre bout de la ligne et réinitialiser ce terminal à un état connu pour la connexion étaient des tâches non triviales, car il y avait de nombreuses normes de type de terminal concurrentes.)
Si vous configurez une ligne inittab
pour exécuter un script, vous pouvez, par exemple, voir si une console virtuelle /dev/ttyX
lappareil existe. Si ce nest pas le cas, vous pouvez utiliser openvt -c X <command>
pour créer la console virtuelle et lancer une commande dessus; si le périphérique de console virtuelle existe déjà, vous pouvez simplement lancer la commande de votre choix avec lentrée, la sortie et lerreur standard redirigées vers elle. Par exemple, vous pouvez spécifier une ligne inittab comme celle-ci:
6:345:respawn:/usr/local/sbin/myscript
puis /usr/local/sbin/myscript
avec quelque chose comme ceci ( avertissement: non testé, je nai pas de système avec SysVinit à portée de main pour le moment, nhésitez pas à modifier si vous pouvez améliorer ceci):
#!/bin/sh if [ -c /dev/tty6 ]; then exec <some command> </dev/tty6 >/dev/tty6 2>&1 else exec openvt -c 6 -w <some command> fi
respawn
dans la ligne inittab
garantit que le processus sera automatiquement redémarré sil meurt pour une raison quelconque. 345
est la liste des niveaux dexécution SysVinit sur lesquels ce processus doit sexécuter. Si vous en avez besoin pour sexécuter sur tous les niveaux dexécution normaux, entrez 12345
.
Notez ceci fonctionne comme prévu uniquement si la ligne inittab est placée après la ligne sysinit
, donc linitialisation de udev
peut être considérée comme terminée. Si vous voulez faire cela au début du processus dinitialisation, vous devrez peut-être vous occuper de créer les nœuds de périphérique réels pour les périphériques dont les pilotes sont déjà chargés en premier; une fois que udev
est en cours d’exécution, il doit créer automatiquement des nœuds de périphérique lorsque les pilotes de périphérique sont initialisés.
Si vous utilisez un port série, le openvt
ne sappliquera pas.
Donc oui, vous pouvez certainement attacher différentes commandes à différents appareils TTY. Cela aide si les commandes ont des fonctionnalités intégrées pour cela, comme le font getty
, mais vous pouvez aussi le faire avec des scripts.
(Si vous configurez quelque chose de plus compliqué quun simple tail -f
pour afficher en permanence un journal dans une console virtuelle autrement inutilisée, vous devriez lire man setsid
et voyez si cela sapplique à ce que vous « planifiez.)
Question 3:
Il y a plus à initialiser une session TTY pour un utilisateur non root particulier que de simplement démarrer un shell avec su
.
Les messages derreur
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
est probablement dû au fait que le shell est associé au périphérique /dev/console
plutôt quà un périphérique TTY spécifique. Puisque /dev/console
est juste un alias de quelque soit la console système actuelle, il ne disposera pas de lensemble complet des fonctions ioctl de contrôle TTY.
Sil ny a pas de script de connexion pour attribuer une valeur plus utile à la variable denvironnement PS1
, linvite par défaut pour /bin/sh
peut être simplement sh-<version>$
.
Question 4:
Oui, cest possible. Vous devez spécifier le « dernier script » comme une ligne de type wait
dans inittab
et le placer avant la ligne getty
correspondant à votre ligne série.
Sans connaître beaucoup plus de détails sur votre environnement, il sera très difficile de dire quel serait le meilleure façon de créer un utilisateur à faibles privilèges à ces fins.
Commentaires
Réponse
-
Oui, en supposant la ligne reçoit un identifiant unique et la ligne de terminal configurée est disponible:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
ouvrira un terminal sur le port série connecté à
ttyS1
. -
Les lignes de
inittab
ne sont pas séquentielles ou liées à une connexion. Chaque ligne décrit une action à entreprendre dans un ensemble donné de niveaux dexécution. Ainsisi::sysinit:/etc/init.d/rcS
spécifie queinit
doit exécuter/etc/init.d/rcS
lorsquil gère linitialisation du système; cela se produit avant que les connexions ne soient possibles. (Voir lainittab(5)
page de manuel pour plus de détails).Pour attribuer différentes commandes à différents
getty
s sur des terminaux spécifiques, vous configureriez linvocation degetty
elle-même, par exemple en modifiantlogin
programme quil démarre (loption-l
dans la plupart des implémentationsgetty
):S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
-
/etc/init.d/rc 5
sexécute avant que les connexions ne soient possibles, et les programmes quil exécute ne sont pas connectés à un terminal (« correctement », ce qui est ce que faitgetty
– il ouvre le terminal pour vous et y connecte les programmes quil y lance), donc quandsu nobody -c /bin/sh
est invoqué, le shell ne trouve pas la configuration de terminal quil attend et désactive le contrôle des travaux en conséquence. Linvitesh-4.3$
est linvite par défaut de Bash 4.3 lorsquelle est exécutée en tant que/bin/sh
. -
Si votre programme nest censé sexécuter quune fois quun utilisateur commence à se connecter, vous pouvez le raccorder à la séquence de connexion utilisée par
getty
; mais un tel programme fonctionnerait en tant que root. Selon ce que vous recherchez exactement, vous feriez probablement mieux dutiliser un initscript plutôt que de/etc/inittab
personnalisation, ousudo
et le scripts de démarrage du shell.
Commentaires
- merci pour votre rediffusion. Puis-je demander une petite clarification concernant la section 2? comment puis-je modifier la commande de connexion pour chaque getty différent?
- Terminé, voir la mise à jour.
- merci! juste pour vérifier si jai bien compris: par défaut, le processus getty exécutera la commande / bin / login qui exécute le processus responsable de la connexion au système. Maintenant, getty exécutera une commande différente, chaque commande que je ‘ choisirai, et nappellera pas le processus de connexion au système comme auparavant … ai-je raison?
- Oui, cest vrai. La clé obtient
getty
pour ouvrir le TTY pour vous; son comportement normal est dattendre un nom de connexion, puis dexécuterlogin
, connecté au TTY;login
attend le mot de passe, le vérifie et démarre le shell, également connecté au TTY. Si vous remplacez la piècelogin
, vous devrez vous assurer que votre programme de remplacement se comporte commelogin
. - Par exemple, si je veux sauter la phase de connexion – pour pouvoir ouvrir mon système avec un utilisateur root sans entrer de nom dutilisateur ou de mot de passe. Je peux utiliser: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 ou utiliser: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 et inside le script i ‘ exécute la commande – / bin / sh et autres?
Réponse
Juste maintenant une seconde (longue!) réponse a été publiée. Je dois dire que le premier explique assez bien. Pour le moment, je veux commenter le point trois: cest moins une question de timing, mais de processus contrôlant un tty « réel virtuel », et pas seulement un « mannequin de console ».
Avant de pouvoir démarrer un shell « avec contrôle de tâche », vous devez configurer cest-à-dire ouvrir un ttyN. La commande « générique » est getty
. À partir de ce tty-quelque chose que vous obtenez, vous pouvez démarrer un shell, pas seulement après cela.
Cest comme essayer de démarrer dabord un gestionnaire de fenêtres, puis xorg, au lieu de les «démarrer» avec xinit. Je pense. « responsable de session ».
À cause de
xx:12:...:program
et, au contraire:
aa:1:...:pr_1 bb:1:...:pr_2
… vous obtenez une relation N: M (vous obtenez également un désordre si vous abusez – de nombreux RL chacun avec de nombreux progs différents). Vous pouvez aller loin avec cela, mais depuis toujours, différents types de « normes » RC ont pris le dessus. « Runcoms ». Avec eux, inittab semble simple, mais toute la complexité est dans ces scripts.
Mais votre inittab semble simple et correct – seulement le dernier commentaire, et lentrée « z6 » …
Peut-être que votre « su nobody » a juste besoin dun « getty … ttyN » avant / autour. su
au lieu de login
, et pas de réapparition. Devrait au moins donner un autre message derreur que « inapproprié ».
Conclusion (après lecture de la 2ème réponse): Vous navez pas besoin dun système init.d
compliqué, linittab brut est assez flexible. Il suffit davoir le concept et les détails sont corrects.
Vous pouvez configurer trois niveaux dexécution: un avec ttyNs, un avec ttySN et un RL qui démarre les deux. Cest un paramètre de démarrage que vous pouvez ajouter avec le chargeur de démarrage. « 5 » dans votre cas nest que la valeur par défaut. Vous choisissez un noyau, une racine = et un niveau dexécution dans lequel démarrer.
Laction « respawn » est ce pour quoi sysvinit était / est réellement nécessaire . Il ne fait pas beaucoup plus, et il aurait été possible d’implémenter moins dans un script. Mais si vous quittez (ou plantez) le « dernier » niveau du shell, vous avez besoin d’un filet de sécurité.
sysvinit peut détectez même une erreur de configuration en affichant lerreur « spawning too fast – ignoring for 5 minutes … ».
getty
est un processus; ce dont vous parlez est un appareil TTY . Le noyau a ouvert le premier pour vous et pour les scripts dinitialisation;/dev/console
est un alias de » le premier appareil TTY qui a été ouvert et utilisé par le noyau « . Si votre compte utilisateur dispose des autorisations daccès en lecture et en écriture à un appareil TTY, vous pouvez simplement commencer à lutiliser (aucungetty
nest nécessaire), mais il peut être judicieux de définir le Variable TERM correctement:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
ouTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
lancera la commandetop
sur la 8e console virtuelle ou le 2ème port série.getty
, cela créera un désordre de la sortie dentrée &, car les deux processus se battront pour lentrée et leurs sorties se mélangeront. Les processusgetty
ne démarrent quaprès/etc/init.d/rc 5
et tous les scripts lancés par celui-ci sont terminés .