De cette réponse à Linux: différence entre/dev/console,/dev/tty et/dev/tty
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 ajoutantconsole=ttyS0
àgrub.conf
. Après cela, votre/dev/tty0
est un moniteur et/dev/console
est/dev/ttyS0
.
Par " console système ", /dev/console
ressemble au fichier de périphérique d'un terminal physique texte, tout comme /dev/tty{1..63}
sont des fichiers de périphérique pour les consoles virtuelles.
Par "/dev/console
et /dev/tty0
représente l'affichage actuel et est généralement le même ", /dev/console
me semble qu'il peut également s'agir du fichier de périphérique d'une console virtuelle. /dev/console
ressemble plus à /dev/tty0
que comme /dev/tty{1..63}
(/dev/tty0
est la console virtuelle actuellement active et peut être n'importe laquelle des /dev/tty{1..63}
).
Quel est /dev/console
? A quoi cela sert?
Est-ce que /dev/console
joue le même rôle pour le noyau Linux que /dev/tty
pour un processus? (/dev/tty
est le terminal de contrôle de la session de processus du processus, et peut être un pts, /dev/ttyn
où n
est compris entre 1 et 63, ou plus?)
L'autre réponse mentionne:
La documentation du noyau spécifie
/dev/console
en tant que 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.
"La liste des consoles" signifie-t-elle toutes les console=
est dans option de démarrage ?
Par "/dev/console
en tant que périphérique de caractères numéroté 5: 1 ", cela signifie-t-il que /dev/console
est le fichier de périphérique d'un terminal de texte physique, c'est-à-dire une console système? (Mais encore une fois, la première réponse que j'ai citée ci-dessus dit /dev/console
peut être identique à /dev/tty0
qui n'est pas un terminal de texte physique, mais une console virtuelle)
Merci.
/dev/console
existe principalement pour exposer la console du noyau à l'espace utilisateur. La documentation du noyau Linux sur les périphériques dit maintenant
Le périphérique de la console,
/dev/console
, est le périphérique auquel les messages système doivent être envoyés et sur lequel les connexions doivent être autorisées en mode mono-utilisateur. À partir de Linux 2.1.71,/dev/console
est géré par le noyau; pour les versions précédentes, il doit s'agir d'un lien symbolique vers/dev/tty0
, une console virtuelle spécifique telle que/dev/tty1
, ou vers un port série principal (tty*
, ne pascu*
), selon la configuration du système.
/dev/console
, le nœud de périphérique avec le majeur 5 et le mineur 1, donne accès à tout ce que le noyau considère comme son principal moyen d'interagir avec l'administrateur système; il peut s'agir d'une console physique connectée au système (avec l'abstraction de la console virtuelle en haut, afin qu'elle puisse utiliser tty0
ou tout ttyN
où [~ # ~] n [~ # ~] est compris entre 1 et 63), ou une série console, ou une console d'hyperviseur, ou même un périphérique Braille. Notez que le noyau lui-même n'utilise pas /dev/console
: les nœuds de périphériques sont pour l'espace utilisateur, pas pour le noyau; il vérifie cependant que /dev/console
existe et est utilisable, et définit init
avec ses entrées, sorties et erreurs standard pointant vers /dev/console
.
Comme décrit ici, /dev/console
est un périphérique de caractères avec un majeur et un mineur fixes car il s'agit d'un périphérique séparé (comme dans, un moyen d'accéder au noyau; pas un périphérique physique), pas équivalent à /dev/tty0
ou tout autre appareil. Ceci est quelque peu similaire à la situation avec /dev/tty
qui est son propre périphérique (5: 0) car il offre des fonctionnalités légèrement différentes de celles des autres consoles virtuelles ou terminaux.
La "liste des consoles" est en effet la liste des consoles définie par le console=
paramètres de démarrage (ou la console par défaut, s'il n'y en a pas). Vous pouvez voir les consoles ainsi définies en regardant /proc/consoles
. /dev/console
fournit en effet un accès au dernier d'entre eux :
Vous pouvez spécifier plusieurs options console = sur la ligne de commande du noyau. La sortie apparaîtra sur chacun d'eux. Le dernier appareil sera utilisé lorsque vous ouvrirez
/dev/console
.
"Quel est /dev/console
? "est répondu dans le réponse précédente . Cette réponse est peut-être plus claire lorsque vous connaissez les réponses aux deux autres questions.
Q1. "Quel est le fichier de périphérique représentant le terminal physique lui-même?"
Il n'y a pas un tel fichier de périphérique.
Q2. "Quel est /dev/console
utilisé pour?"
Sous Linux, /dev/console
est utilisé pour afficher les messages au démarrage (et à l'arrêt). Il est également utilisé pour le "mode mono-utilisateur", comme indiqué dans la réponse de Stephen Kitt. Il n'y a pas grand-chose d'autre pour lequel il est logique de l'utiliser.
"Au bon vieux temps" d'Unix, /dev/console
était un périphérique physique dédié. Mais ce n'est pas le cas sous Linux.
Permettez-moi d'essayer de comprendre de cette façon.
/dev/tty{1..63}
et/dev/pts/n
sont des fichiers de périphériques représentant les périphériques eux-mêmes (bien qu'ils soient des émulations), sans relation avec le processus ou le noyau./dev/tty0
représente celui de/dev/tty{1..63}
qui est actuellement utilisé par quelque chose (peut-être le noyauou processus Shell?)./dev/tty
représente le terminal de contrôle actuellement utilisé par une session de processus./dev/console
représente le terminal actuellement utilisé par le noyau?Quel est le fichier de périphérique représentant le terminal physique lui-même, sans rapport avec le noyau ou le processus?
Le ou les périphériques sous-jacents pour /dev/tty{1..63}
sont struct con_driver
. Pour voir tous les pilotes possibles, consultez https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console
Il n'y a pas de fichier de périphérique pour ces périphériques sous-jacents!
Il n'y a qu'une interface d'espace utilisateur minimale pour les gérer.
$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device
==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device
Si vous voulez vraiment en savoir plus, le (M)
signifie module . C'est à dire. le périphérique de console factice n'est pas fourni par un module de noyau chargeable; il fait partie de l'image initiale du noyau (aka "builtin").
Deuxièmement, le fichier bind
dans chaque sous-répertoire de /sys/class/vtconsole
apparaît pour vous indiquer quel périphérique vtconsole est actif. Si j'écris 0
à l'actif, il semble basculer vers le factice. (Les VT GUI ne semblent pas affectés, mais les VT texte ne fonctionnent plus). L'écriture 1
car le mannequin ne l’active pas. L'une ou l'autre méthode fonctionne pour revenir à la vraie. Si je lis le code correctement, l'astuce est que echo 1 > bind
n'est censé fonctionner que pour les pilotes de console qui sont construits en tant que module (?!).
Pour les consoles framebuffer en particulier, il existe des informations supplémentaires sur la liaison de différents périphériques framebuffer (/dev/fb0
...) vers des consoles virtuelles spécifiques dans https://kernel.org/doc/Documentation/fb/fbcon.txt . Cela implique une option de noyau fbcon:map=
ou une commande appelée con2fbmap
.
Bien sûr, les détails peuvent varier selon les différentes versions du noyau, architectures, firmwares, périphériques, pilotes, etc. Je n'ai jamais vraiment eu à utiliser l'une des interfaces ci-dessus. Le noyau laisse simplement i915
/inteldrmfb
/tout ce que vous voulez appeler prend le relais lors du chargement, en remplaçant par exemple vgacon
.
Il semble que ma machine EFI n'ait jamais vgacon
. Donc, premièrement, il utilise une console factice, et deuxièmement, après 1,2 seconde, il passe à fbcon
, fonctionnant au-dessus de efifb
. Mais jusqu'à présent, je n'ai pas eu à me soucier des détails; ça marche juste.
$ dmesg | grep -C2 [Cc]onsole
[ 0.230822] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[ 0.233164] NR_IRQS: 65792, nr_irqs: 728, preallocated irqs: 16
[ 0.233346] Console: colour dummy device 80x25
[ 0.233571] console [tty0] enabled
[ 0.233585] ACPI: Core revision 20180810
[ 0.233838] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484882848 ns
--
[ 1.228393] efifb: scrolling: redraw
[ 1.228396] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
[ 1.230393] Console: switching to colour frame buffer device 170x48
[ 1.232090] fb0: EFI VGA frame buffer device
[ 1.232110] intel_idle: MWAIT substates: 0x11142120
--
[ 3.595838] checking generic (e0000000 408000) vs hw (e0000000 10000000)
[ 3.595839] fb: switching to inteldrmfb from EFI VGA
[ 3.596577] Console: switching to colour dummy device 80x25
[ 3.596681] [drm] Replacing VGA console driver
[ 3.597159] [drm] ACPI BIOS requests an excessive sleep of 20000 ms, using 1500 ms instead
[ 3.599830] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
--
[ 3.657050] e1000e 0000:00:19.0 eth0: MAC: 11, PHY: 12, PBA No: FFFFFF-0FF
[ 3.657869] e1000e 0000:00:19.0 eno1: renamed from eth0
[ 4.711453] Console: switching to colour frame buffer device 170x48
[ 4.734356] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
[ 4.778813] Loading iSCSI transport class v2.0-870.
/dev/console
utilisé pour?"Vous pouvez utiliser/dev/console comme périphérique TTY. L'écriture, par exemple, écrit sur un périphérique sous-jacent spécifique, qui aura également un numéro de périphérique de caractère qui lui est propre.
Souvent/dev/console est lié à/dev/tty0, mais parfois il peut être lié à un périphérique différent.
Donc dans ce cas, écrire dans/dev/console va écrire dans/dev/tty0. Et à son tour, écrire dans/dev/tty0 équivaut à écrire dans le périphérique/dev/ttyN actuellement actif.
Mais cela soulève une question intéressante. Accès à tty0
accédera à différentes consoles virtuelles, selon celle qui est actuellement active. Qu'est-ce que les gens utilisent réellement tty0
pour, et de façon similaire à quoi console
est-il utilisé sous Linux?
Techniquement, vous pouvez lire et écrire à partir de console
/tty0
, par exemple en exécutant un getty
pour autoriser la connexion sur tty0
. Mais cela n'est utile que comme hack rapide. Parce que cela signifie que vous ne pouvez pas profiter des multiples consoles virtuelles de Linux.
systemd
recherche dans sysfs
un attribut associé au périphérique/dev/console, pour détecter le périphérique TTY sous-jacent. Cela permet à systemd
de générer automatiquement un getty
et de se connecter par ex. une console série, lorsque l'utilisateur a configuré une console du noyau en démarrant avec console=ttyS0
. C'est pratique; cela évite d'avoir à configurer cette console à deux endroits différents. Encore une fois, voir man systemd-getty-generator
. Cependant, systemd
n'ouvre pas réellement /dev/console
pour ça.
Pendant l'amorçage du système, il se peut que vous n'ayez même pas encore monté sysfs. Mais vous voulez pouvoir afficher les messages d'erreur et de progression dès que possible! Nous tournons donc autour du point 1). Le noyau démarre le PID 1 avec stdin/stdout/stderr connecté à /dev/console
. C'est très agréable d'avoir ce mécanisme simple mis en place dès le départ.
Dans un conteneur Linux, le fichier à /dev/console
peut être créé comme quelque chose de différent - pas le numéro de périphérique de caractère 5:1
. Au lieu de cela, il peut être créé en tant que fichier de périphérique PTS. Il serait alors judicieux de se connecter via ce /dev/console
fichier. systemd
à l'intérieur d'un conteneur permettra de se connecter sur un tel appareil; voir man systemd-getty-generator
.
Ce mécanisme est utilisé lorsque vous exécutez un conteneur avec le systemd-nspawn
commande. (Je pense que lorsque vous exécutez systemd-nspawn
sur un ATS, bien que je ne puisse pas le dire en recherchant la page de manuel).
systemd-nspawn
crée le conteneur /dev/console
en tant que montage de liaison d'un périphérique PTS à partir de l'hôte. Cela signifie que cet appareil PTS n'est pas visible à l'intérieur /dev/pts/
à l'intérieur du conteneur.
Les périphériques PTS sont locaux sur un montage devpts
spécifique. Les appareils PTS sont une exception à la règle normale, selon laquelle les appareils sont identifiés par leur numéro d'appareil. Les périphériques PTS sont identifiés par la combinaison de leur numéro de périphérique et de leur montage devpts
.
Vous pouvez écrire des messages urgents dans console
/tty0
, pour écrire dans la console virtuelle actuelle de l'utilisateur. Cela peut être utile pour les messages d'erreur urgents de l'espace utilisateur, similaires aux messages urgents du noyau qui sont imprimés sur la console (voir man dmesg
). Cependant, il n'est pas courant de le faire, au moins une fois que le système a terminé le démarrage.
rsyslog a n exemple sur cette page , qui imprime les messages du noyau à /dev/console
; cela est inutile sous Linux car le noyau le fera déjà par défaut. Un exemple que je ne trouve pas encore dit que ce n'est pas une bonne idée de l'utiliser pour des messages non-noyau car il y a tout simplement trop de messages syslog, vous inonder votre console et cela gêne trop.
systemd-journald a également des options pour transférer tous les journaux vers la console. En principe, cela peut être utile pour le débogage dans un environnement virtuel. Cependant, pour le débogage, nous transmettons généralement à /dev/kmsg
au lieu. Cela les enregistre dans le tampon de journal du noyau afin que vous puissiez les lire avec dmesg
. Comme les messages générés par le noyau lui-même, ces messages peuvent être répercutés sur la console en fonction de la configuration actuelle du noyau.