web-dev-qa-db-fra.com

À quoi sert `/ dev / console`?

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 ajoutant console=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/ttynn 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.

13
Tim

/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 pas cu*), 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 [~ # ~] 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.

18
Stephen Kitt

"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.

Preuve connexe

1. "Quel est le fichier de périphérique représentant le terminal physique lui-même?"

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 noyau ou 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.

2. "Qu'est-ce que /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?

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

6
sourcejedi