web-dev-qa-db-fra.com

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

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

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

142
Axel Fontaine

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 ATS étaient des périphériques série d'utilisateurs connectés à un serveur. Maintenant /dev/console et /dev/tty0 représente l'affichage actuel et est généralement le même. Vous pouvez le remplacer par exemple en ajoutant console=ttyS0 à grub.conf. Après cela, votre /dev/tty0 est un moniteur et /dev/console est /dev/ttyS0.

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

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

Vous pouvez voir que tty est la console où le processus démarre et tty0 est une console toujours à jour.

97
dchirikov
  • /dev/console est un ensemble virtuel de périphériques qui peut être défini comme paramètre au 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= les options sont transmises au noyau, la sortie de la console ira à plusieurs périphériques.

  • /dev/tty0 est la console virtuelle actuelle

  • /dev/tty[1-x] est l'une des consoles virtuelles avec lesquelles vous basculez control-alt-F1 etc.

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

59
jlliagre

/ 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 en utilisant le 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 sur toutes. Apparemment, vous ne pouvez sélectionner qu'une seule console de chaque "type": vous ne pouvez pas utiliser à la fois console=ttyS0 Et console=ttyS1.

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

Si aucune des consoles n'est un tty, l'ouverture de /dev/console Renvoie l'erreur ENODEV ("No such device"). Le noyau impression enregistrez un message et démarrez init indépendamment. Pour un exemple d'une console du noyau qui n'est pas un périphérique tty, voir netconsole , ou ma 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. documentation systemd souligne que le premier périphérique affiché est la console principale. La liste est en fait dans l'ordre inverse de la ligne de commande du noyau. Le documentation actuelle du noya indique à tort que le dernier périphérique affiché est la console principale ou "active". Pour une raison quelconque, il est possible d'interroger ce fichier pour les modifications (au cas où les périphériques de la console sont supprimés?).

Dans un conteneur systemd-nspawn , le fichier standard /dev/console Est remplacé par un dispositif pseudo-terminal (PTY). Ceux-ci seraient mieux décrits comme des terminaux virtuels. Ils sont créés dynamiquement et sont également utilisés pour implémenter des émulateurs de terminaux graphiques comme GNOME Terminal et pour l'accès à distance comme ssh.

/ dev/tty0

Les ATS Linux nœuds de périphériquestty1 À tty63 Sont 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 console physique. Une seule console virtuelle est affichée et contrôlée à la fois. Le terminal actif peut être commuté, par ex. en utilisant chvt, ou Ctrl + Alt + F1 à travers le nombre de touches de fonction dont vous disposez.

Vous pouvez également lire et écrire sur le VT actuel en utilisant /dev/tty0. tty0 Est la console du noyau habituelle, par exemple si vous n'en avez pas sélectionné un explicitement. "Le système recherche d'abord une carte VGA [sur laquelle s'exécutent les VT] 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" comme ttyS0 Est 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/tty Est 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 équivaut à ouvrir le terminal de contrôle du processus en cours. Le terminal de contrôle est défini lorsqu'un processus ouvre un terminal pour la première fois, au moins sous Linux . Par exemple, dans init, cela ferait référence à /dev/console.

Le détachement du terminal de contrôle est l'une des étapes traditionnellement requises pour démarrer un processus d'arrière-plan, par exemple un démon de journalisation système . Les étapes pour devenir un processus d'arrière-plan sont horriblement complexes, mais pour être précis, l'étape qui se détache du terminal de contrôle est l'appel système setsid . Dans les systèmes plus modernes, le système init, par ex. systemd démarre le service sans aucun terminal de contrôle en premier lieu.

22
sourcejedi