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?
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.
/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.
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
.
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
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.