Linux: Différence entre / dev / console, / dev / tty et / dev / tty0

133

Sur un système Linux, quelle est la différence entre /dev/console, /dev/ttyet /dev/tty0?

Quelle est leur utilisation respective et comment se comparent-ils?

Axel Fontaine
la source
3
Vous pouvez également être intéressé par ceci
Kevin

Réponses:

93

De la documentation :

/dev/tty        Current TTY device
/dev/console    System console
/dev/tty0       Current virtual console

Au bon vieux temps /dev/consoleétait la console de l'administrateur système. Et les téléscripteurs étaient les périphériques série des utilisateurs connectés à un serveur. Maintenant /dev/consoleet /dev/tty0représentent l'affichage actuel et sont généralement les mêmes. Vous pouvez le remplacer par exemple en ajoutant console=ttyS0à grub.conf. Après que votre /dev/tty0est un moniteur et /dev/consoleest /dev/ttyS0.

Un exercice pour montrer la différence entre /dev/ttyet /dev/tty0:

Passez à la 2ème console en appuyant sur Ctrl+ Alt+ F2. Connectez-vous en tant que root. Type sleep 5; echo tty0 > /dev/tty0. Appuyez sur Enteret passez à la 3ème console en appuyant sur Alt+ F3. Revenez maintenant à la 2e console en appuyant sur Alt+ F2. Tapez sleep 5; echo tty > /dev/tty, appuyez sur Enteret passez à la 3ème console.

Vous pouvez voir que ttyc'est la console où le processus démarre et qu'il tty0s'agit d'une console toujours actuelle.

Dchirikov
la source
6
bel exercice! Ubuntu verrouille root, donc une façon de reproduire cela sur Ubuntu est:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28
10
@ SFun28, j'ai toujours utilisé sudo -i, et le tour est joué - un shell racine.
André Laszlo
4
un idiome pour écrire dans des fichiers nécessitant des privilèges root est echo stuff | sudo tee / dev / tty0> / dev / null;
Peter Cordes
Dammit. Quand Ī̲ a écrit unix.stackexchange.com/a/229598/80483 , Ī̲ n'était pas au courant de cette réponse!
Incnis Mrsi
@ SFun28: si ça sudo anycommandmarche, sudo -ialler en racine marche aussi. Il n’existe pas de Linux / BSD / Unix où vous ne pouvez pas accéder à la racine. (Alors ce ne serait plus Linux / BSD / Unix.)
Evi1M4chine
59
  • /dev/consoleest un ensemble virtuel de périphériques pouvant être définis en tant que paramètre au moment du démarrage. Il peut être redirigé vers un périphérique série ou une console virtuelle et pointe par défaut sur /dev/tty0. Lorsque plusieurs console=options sont passées au noyau, la sortie de la console ira sur plusieurs périphériques.

  • /dev/tty0 est la console virtuelle actuelle

  • /dev/tty[1-x]est l’une des consoles virtuelles vers lesquelles vous passez avec control- alt- F1et ainsi de suite.

  • /dev/ttyest une sorte d'alias pour la console (physique, virtuelle ou pseudo-périphérique, le cas échéant) associé au processus qui l'ouvre. Contrairement aux autres périphériques, vous n'avez pas besoin des privilèges root pour y écrire. Notez également que les processus tels que ceux lancés par cronet les processus de traitement par lots similaires ne sont pas utilisables /dev/tty, car ils ne sont associés à aucun. Ces processus ont un ?dans la TTYcolonne de ps -efsortie.

jlliagre
la source
Qu'entendez-vous par interrogation à partir de cette instruction "/ dev / tty est la console utilisée par le processus qui l'interroge"?
Ron Vince
1
@RonVince Je veux dire /dev/ttypeut être un périphérique différent, le cas échéant, en fonction du processus qui l'ouvre. Réponse mise à jour.
Jlliagre
Merci. Puis-je savoir si les processus écrivent / lisent dans / depuis / dev / tty au lieu de directement dans / depuis le fichier de périphérique qui leur est associé?
Ron Vince le
@RonVince J'ai bien peur de ne pas savoir ce que vous demandez. Pourriez-vous reformuler?
Jlliagre
1
@RonVince Opening / dev / tty (pas /dev/tty[1 ,..,n]) est le standard Unix (et Linux) pour un processus permettant d'écrire quelque chose sur le terminal de l'utilisateur. L’écriture directe sur tout autre appareil est non portable, plus complexe et moins fiable. Un processus n'a pas besoin de savoir quel est le périphérique auquel le processus est connecté, le noyau le sait déjà.
Jlliagre
20

/ dev / console

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst

Sous Linux, la console du noyau peut être configurée à l'aide de l' console= option de démarrage . Le code du noyau qui appelle printk()peut y écrire des messages, par exemple lorsqu'un périphérique est chargé ou qu'une erreur se produit. Ces messages sont également mis en mémoire tampon par le noyau. (Voir aussi dmesg). Lorsqu'un périphérique de console est trouvé et démarré, il reçoit tous les messages précédemment mis en mémoire tampon.

Vous pouvez passer console=plusieurs fois pour configurer plusieurs consoles et des messages seront écrits pour chacune d'entre elles. Apparemment, vous ne pouvez sélectionner qu'une console de chaque "type": vous ne pouvez pas utiliser les deux console=ttyS0et console=ttyS1.

La documentation du noyau spécifie /dev/consolecomme un périphérique de caractère numéroté (5,1). L'ouverture de ce périphérique de caractères ouvre la console "principale", qui est le dernier terminal de la liste des consoles. Le premier processus non noyau, appelé init"PID 1", est démarré avec une /dev/consoleconnexion à la sortie standard, une erreur standard et une entrée standard.

Si aucune des consoles n'est un terminal, l'ouverture /dev/consolerenvoie l'erreur ENODEV("No such device"). Le noyau vaimpressionenregistrer un message et commencer initquand même. Pour un exemple d'une console du noyau qui n'est pas un périphérique tty, voir netconsolema console préférée, l'imprimante en ligne .

Vous pouvez également voir une liste de consoles tty en lisant /sys/class/tty/console/active. La documentation de systemd indique que le premier périphérique affiché est la console principale. La liste est en réalité dans l’ordre inverse de la ligne de commande du noyau. La documentation actuelle du noyau indique à tort que le dernier périphérique affiché est la console principale ou "active". Pour une raison quelconque, il est possible d’examiner les modifications de ce fichier (dans le cas où des périphériques de la console seraient supprimés?).

Dans un systemd-nspawnconteneur, le /dev/consolefichier standard est remplacé par un périphérique pseudo-terminal (PTY). Celles-ci seraient mieux décrites comme des terminaux virtuels. Ils sont créés de manière dynamique et sont également utilisés pour implémenter des émulateurs de terminaux graphiques tels que Terminal GNOME, et pour un accès distant comme ssh.

/ dev / tty0

Le TTY Linux dispositif noeuds tty1 à travers tty63sont des terminaux virtuels. Ils sont également appelés VT ou consoles virtuelles. Ils simulent plusieurs consoles au-dessus du pilote de périphérique de la console physique. Une seule console virtuelle est affichée et contrôlée à la fois. Le terminal actif peut être commuté, par exemple, en utilisant chvt, ou Ctrl + Alt + F1 à travers le nombre de touches de fonction que vous avez.

Vous pouvez également lire et écrire sur le VT actuel en utilisant /dev/tty0. tty0est la console habituelle du noyau, par exemple si vous n’en avez pas choisi explicitement. "Le système recherche d'abord une carte VGA [sur laquelle les VT s'exécutent] puis un port série". Vous pouvez également définir la console sur un VT spécifique, par exemple console=tty1.

"Si vous n'avez pas de carte VGA dans votre système, le premier port série deviendra automatiquement la console." Une "console série" ttyS0est probablement l’alternative la plus courante tty0. Il n'est pas possible d'utiliser le système VT sur une console série.

/ dev / tty

/dev/ttyest l'un des trois fichiers de périphérique standard spécifiés par POSIX ( /dev/est l'un des trois noms de répertoire spécifiés par POSIX). L’ouvrir revient à ouvrir le terminal de contrôle du processus en cours. Le terminal de contrôle est défini lorsqu'un processus ouvre un terminal, du moins sous Linux . Par exemple, dans init, il ferait référence à /dev/console.

La séparation du terminal de contrôle est l’une des étapes traditionnellement requises pour démarrer un processus en arrière-plan, par exemple un démon de journalisation système . Les étapes pour devenir un processus en arrière-plan sont terriblement complexes, mais pour être spécifique, l’étape qui se détache du terminal de contrôle est l’ appel système setsid . Dans des systèmes plus modernes, le système init, par exemple systemd, démarre le service sans aucun terminal de contrôle.

sourcejedi
la source